@osovitny/anatoly 3.17.160 → 3.19.1

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 (179) hide show
  1. package/fesm2022/osovitny-anatoly.mjs +553 -522
  2. package/fesm2022/osovitny-anatoly.mjs.map +1 -1
  3. package/lib/billing/utils.d.ts +2 -1
  4. package/lib/core/converts/convert.d.ts +1 -1
  5. package/lib/core/guid.d.ts +1 -1
  6. package/lib/core/is.d.ts +5 -5
  7. package/lib/ui/components/base/components/component.d.ts +1 -1
  8. package/lib/ui/components/base/components/edit.component.d.ts +1 -1
  9. package/lib/ui/components/base/components/enum-edit.component.d.ts +1 -1
  10. package/lib/ui/components/data-grid/control-panel.component.d.ts +6 -5
  11. package/lib/ui/components/dropdownlists/country/country.dropdownlist.d.ts +1 -3
  12. package/lib/ui/directives/index.d.ts +1 -1
  13. package/lib/ui/directives/replacer/replacer.base.directive.d.ts +1 -1
  14. package/package.json +58 -60
  15. package/esm2022/lib/anatoly.module.mjs +0 -62
  16. package/esm2022/lib/billing/billing.module.mjs +0 -81
  17. package/esm2022/lib/billing/components/buttons/buyaccess-button.component.mjs +0 -104
  18. package/esm2022/lib/billing/components/buttons/subscribe-plan-button.component.mjs +0 -113
  19. package/esm2022/lib/billing/components/exports.mjs +0 -28
  20. package/esm2022/lib/billing/components/index.mjs +0 -31
  21. package/esm2022/lib/billing/components/order-summary/order-summary.component.mjs +0 -154
  22. package/esm2022/lib/billing/components/payment-methods/payment-methods.component.mjs +0 -106
  23. package/esm2022/lib/billing/components/payment-options/payment-options.component.mjs +0 -97
  24. package/esm2022/lib/billing/components/pm/braintree/braintree.component.mjs +0 -155
  25. package/esm2022/lib/billing/components/pm/paypal/paypal-button.component.mjs +0 -159
  26. package/esm2022/lib/billing/components/pm/paypal/paypal-subscribe-button.component.mjs +0 -149
  27. package/esm2022/lib/billing/components/pm/paypal/paypal.component.mjs +0 -317
  28. package/esm2022/lib/billing/components/pm/stripe/stripe.component.mjs +0 -109
  29. package/esm2022/lib/billing/exports.mjs +0 -19
  30. package/esm2022/lib/billing/models/paypal-models.mjs +0 -16
  31. package/esm2022/lib/billing/services/payments.service.mjs +0 -170
  32. package/esm2022/lib/billing/services/paypal-script.service.mjs +0 -90
  33. package/esm2022/lib/billing/utils.mjs +0 -28
  34. package/esm2022/lib/core/browser.mjs +0 -24
  35. package/esm2022/lib/core/consts/app-settings.mjs +0 -55
  36. package/esm2022/lib/core/consts/core-settings.mjs +0 -29
  37. package/esm2022/lib/core/consts/formats.mjs +0 -27
  38. package/esm2022/lib/core/consts/ga.mjs +0 -26
  39. package/esm2022/lib/core/consts/storageKeys.mjs +0 -23
  40. package/esm2022/lib/core/converts/convert.mjs +0 -103
  41. package/esm2022/lib/core/converts/dateConvert.mjs +0 -60
  42. package/esm2022/lib/core/converts/tz/tzParseTimezone.mjs +0 -122
  43. package/esm2022/lib/core/converts/tz/tzTokenizeDate.mjs +0 -101
  44. package/esm2022/lib/core/converts/xmlFormatter.mjs +0 -34
  45. package/esm2022/lib/core/core.module.mjs +0 -112
  46. package/esm2022/lib/core/dom.mjs +0 -153
  47. package/esm2022/lib/core/enums/billing.mjs +0 -56
  48. package/esm2022/lib/core/enums/enums.mjs +0 -35
  49. package/esm2022/lib/core/enums/index.mjs +0 -17
  50. package/esm2022/lib/core/exports.mjs +0 -67
  51. package/esm2022/lib/core/go/apps-go.service.mjs +0 -88
  52. package/esm2022/lib/core/go/go.service.mjs +0 -86
  53. package/esm2022/lib/core/guards/once-import.guard.mjs +0 -21
  54. package/esm2022/lib/core/guards/starter.guard.mjs +0 -46
  55. package/esm2022/lib/core/guid.mjs +0 -22
  56. package/esm2022/lib/core/interceptors/httpInterceptor.mjs +0 -161
  57. package/esm2022/lib/core/is.mjs +0 -98
  58. package/esm2022/lib/core/localization/localization.module.mjs +0 -45
  59. package/esm2022/lib/core/localization/localization.service.mjs +0 -164
  60. package/esm2022/lib/core/localization/localize.pipe.mjs +0 -83
  61. package/esm2022/lib/core/localization/settings.module.mjs +0 -103
  62. package/esm2022/lib/core/localization/utils.mjs +0 -41
  63. package/esm2022/lib/core/logging/globalErrorHandler.mjs +0 -41
  64. package/esm2022/lib/core/logging/logging.service.mjs +0 -40
  65. package/esm2022/lib/core/models/qs.mjs +0 -17
  66. package/esm2022/lib/core/notifications/alerts.mjs +0 -116
  67. package/esm2022/lib/core/notifications/interfaces/notification.mjs +0 -17
  68. package/esm2022/lib/core/notifications/services/notification-service.mjs +0 -83
  69. package/esm2022/lib/core/performance/stopwatch.mjs +0 -50
  70. package/esm2022/lib/core/services/appcontext.service.mjs +0 -186
  71. package/esm2022/lib/core/services/dm.service.mjs +0 -69
  72. package/esm2022/lib/core/services/google-analytics.service.mjs +0 -75
  73. package/esm2022/lib/core/services/idle.service.mjs +0 -77
  74. package/esm2022/lib/core/services/loading.service.mjs +0 -67
  75. package/esm2022/lib/core/services/script.service.mjs +0 -77
  76. package/esm2022/lib/core/services/starter.service.mjs +0 -85
  77. package/esm2022/lib/core/services/web-storage.service.mjs +0 -66
  78. package/esm2022/lib/core/subs.mjs +0 -31
  79. package/esm2022/lib/core/utils/qsutils.mjs +0 -84
  80. package/esm2022/lib/core/utils/utils.mjs +0 -112
  81. package/esm2022/lib/data/base/api.service.mjs +0 -94
  82. package/esm2022/lib/data/base/grid/grid-edit.service.mjs +0 -80
  83. package/esm2022/lib/data/base/grid/grid-read.service.mjs +0 -60
  84. package/esm2022/lib/data/data.module.mjs +0 -66
  85. package/esm2022/lib/data/exports.mjs +0 -29
  86. package/esm2022/lib/data/services/billing/currencies-api.service.mjs +0 -41
  87. package/esm2022/lib/data/services/billing/currencies-storage.service.mjs +0 -92
  88. package/esm2022/lib/data/services/billing/discountcodes-api.service.mjs +0 -37
  89. package/esm2022/lib/data/services/billing/payments-api.service.mjs +0 -64
  90. package/esm2022/lib/data/services/billing/subscriptions-api.service.mjs +0 -61
  91. package/esm2022/lib/data/services/billing/transactions-api.service.mjs +0 -43
  92. package/esm2022/lib/data/services/core-api.service.mjs +0 -44
  93. package/esm2022/lib/data/services/emails-api.service.mjs +0 -47
  94. package/esm2022/lib/external/fa.module.mjs +0 -45
  95. package/esm2022/lib/external/kendo.module.mjs +0 -179
  96. package/esm2022/lib/iam/b2c/b2c.mjs +0 -40
  97. package/esm2022/lib/iam/b2c/consts.mjs +0 -25
  98. package/esm2022/lib/iam/b2c/index.mjs +0 -21
  99. package/esm2022/lib/iam/configs.mjs +0 -109
  100. package/esm2022/lib/iam/consts.mjs +0 -22
  101. package/esm2022/lib/iam/exports.mjs +0 -22
  102. package/esm2022/lib/iam/guards/admin.guard.mjs +0 -46
  103. package/esm2022/lib/iam/guards/authentication.guard.mjs +0 -30
  104. package/esm2022/lib/iam/guards/index.mjs +0 -20
  105. package/esm2022/lib/iam/iam-pages.module.mjs +0 -57
  106. package/esm2022/lib/iam/iam-pages.routes.mjs +0 -45
  107. package/esm2022/lib/iam/iam.module.mjs +0 -84
  108. package/esm2022/lib/iam/pages/signin.page.mjs +0 -40
  109. package/esm2022/lib/iam/pages/signout.page.mjs +0 -40
  110. package/esm2022/lib/iam/pages/signup.page.mjs +0 -40
  111. package/esm2022/lib/iam/redirect.mjs +0 -29
  112. package/esm2022/lib/iam/services/auth.service.mjs +0 -436
  113. package/esm2022/lib/iam/storage.mjs +0 -42
  114. package/esm2022/lib/iam/utils.mjs +0 -49
  115. package/esm2022/lib/ui/components/base/components/component.mjs +0 -76
  116. package/esm2022/lib/ui/components/base/components/edit.component.mjs +0 -146
  117. package/esm2022/lib/ui/components/base/components/enum-edit.component.mjs +0 -92
  118. package/esm2022/lib/ui/components/base/dialog.mjs +0 -71
  119. package/esm2022/lib/ui/components/base/list.mjs +0 -100
  120. package/esm2022/lib/ui/components/base/pages/edit.page.mjs +0 -32
  121. package/esm2022/lib/ui/components/base/pages/page.mjs +0 -32
  122. package/esm2022/lib/ui/components/base/pages/paged.page.mjs +0 -68
  123. package/esm2022/lib/ui/components/card/card-body.component.mjs +0 -37
  124. package/esm2022/lib/ui/components/card/card-footer.component.mjs +0 -37
  125. package/esm2022/lib/ui/components/card/card-header.component.mjs +0 -51
  126. package/esm2022/lib/ui/components/card/card.component.mjs +0 -41
  127. package/esm2022/lib/ui/components/check-icon/check-icon.component.mjs +0 -43
  128. package/esm2022/lib/ui/components/copy-2-clipboard/copy-2-clipboard.component.mjs +0 -57
  129. package/esm2022/lib/ui/components/data-grid/control-panel.component.mjs +0 -201
  130. package/esm2022/lib/ui/components/datapager/datapager.component.mjs +0 -95
  131. package/esm2022/lib/ui/components/dropdownlists/country/country.dropdownlist.mjs +0 -96
  132. package/esm2022/lib/ui/components/dropdownlists/moderationstatus/moderationstatus.dropdownlist.mjs +0 -88
  133. package/esm2022/lib/ui/components/dropdownlists/publishstatus/publishstatus.dropdownlist.mjs +0 -88
  134. package/esm2022/lib/ui/components/dropdownlists/timezone/timezone.dropdownlist.mjs +0 -112
  135. package/esm2022/lib/ui/components/exports.mjs +0 -53
  136. package/esm2022/lib/ui/components/feature-will-be-ready/feature-will-be-ready.component.mjs +0 -55
  137. package/esm2022/lib/ui/components/html-editor/base-editor.component.mjs +0 -94
  138. package/esm2022/lib/ui/components/html-editor/defaultoptions.mjs +0 -87
  139. package/esm2022/lib/ui/components/html-editor/html-editor.component.mjs +0 -114
  140. package/esm2022/lib/ui/components/identity/signin-button.component.mjs +0 -105
  141. package/esm2022/lib/ui/components/identity/signout-button.component.mjs +0 -105
  142. package/esm2022/lib/ui/components/identity/signup-button.component.mjs +0 -105
  143. package/esm2022/lib/ui/components/index.mjs +0 -57
  144. package/esm2022/lib/ui/components/no-mobile-support/no-mobile-support.component.mjs +0 -45
  145. package/esm2022/lib/ui/components/nodata/nodata.component.mjs +0 -76
  146. package/esm2022/lib/ui/components/spinners/loading/loading.component.mjs +0 -53
  147. package/esm2022/lib/ui/components/spinners/pagespinner/pagespinner.component.mjs +0 -85
  148. package/esm2022/lib/ui/components/spinners/pagespinner/spinkits.mjs +0 -12
  149. package/esm2022/lib/ui/components/urlslug/urlslug.component.mjs +0 -130
  150. package/esm2022/lib/ui/components/you-agree-to-our-terms/you-agree-to-our-terms.component.mjs +0 -63
  151. package/esm2022/lib/ui/dialogs/contact-us/contact-us.dialog.mjs +0 -78
  152. package/esm2022/lib/ui/dialogs/exports.mjs +0 -16
  153. package/esm2022/lib/ui/dialogs/index.mjs +0 -19
  154. package/esm2022/lib/ui/directives/exports.mjs +0 -19
  155. package/esm2022/lib/ui/directives/hover.directive.mjs +0 -50
  156. package/esm2022/lib/ui/directives/index.mjs +0 -22
  157. package/esm2022/lib/ui/directives/native-element.directive.mjs +0 -37
  158. package/esm2022/lib/ui/directives/replacer/a-replacer.directive.mjs +0 -48
  159. package/esm2022/lib/ui/directives/replacer/image-replacer.directive.mjs +0 -44
  160. package/esm2022/lib/ui/directives/replacer/replacer.base.directive.mjs +0 -44
  161. package/esm2022/lib/ui/exports.mjs +0 -22
  162. package/esm2022/lib/ui/forms/components/address/address.component.mjs +0 -240
  163. package/esm2022/lib/ui/forms/components/company/company.component.mjs +0 -138
  164. package/esm2022/lib/ui/forms/contact-us/contact-us.mjs +0 -213
  165. package/esm2022/lib/ui/forms/exports.mjs +0 -20
  166. package/esm2022/lib/ui/forms/index.mjs +0 -21
  167. package/esm2022/lib/ui/pipes/exports.mjs +0 -19
  168. package/esm2022/lib/ui/pipes/filesize.pipe.mjs +0 -42
  169. package/esm2022/lib/ui/pipes/index.mjs +0 -22
  170. package/esm2022/lib/ui/pipes/replace-text.pipe.mjs +0 -37
  171. package/esm2022/lib/ui/pipes/safeHtml.pipe.mjs +0 -34
  172. package/esm2022/lib/ui/ui.module.mjs +0 -122
  173. package/esm2022/lib/ui/validation/exports.mjs +0 -19
  174. package/esm2022/lib/ui/validation/form-validation-summary.component.mjs +0 -90
  175. package/esm2022/lib/ui/validation/index.mjs +0 -21
  176. package/esm2022/lib/ui/validation/item-validation-summary.component.mjs +0 -53
  177. package/esm2022/lib/ui/validation/validation-summary.component.mjs +0 -124
  178. package/esm2022/osovitny-anatoly.mjs +0 -5
  179. package/esm2022/public-api.mjs +0 -22
@@ -1,186 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 13 Nov 2017
12
-
13
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
14
- </file>
15
- */
16
- //Node
17
- import { Injectable } from '@angular/core';
18
- import { BehaviorSubject } from 'rxjs';
19
- //App
20
- import { ApiUrl } from '../consts/core-settings';
21
- import { ApiServiceBase } from '../../data/base/api.service';
22
- import { Stopwatch } from '../performance/stopwatch';
23
- import { AppContextStorageKeys } from '../consts/storageKeys';
24
- import * as i0 from "@angular/core";
25
- import * as i1 from "@angular/common/http";
26
- import * as i2 from "./web-storage.service";
27
- export class AppContextService extends ApiServiceBase {
28
- constructor(http, localStorage, sessionStorage) {
29
- super(http);
30
- this.http = http;
31
- this.localStorage = localStorage;
32
- this.sessionStorage = sessionStorage;
33
- this.storageKeyName = 'appContext';
34
- this.subscription = null;
35
- //Private Streams
36
- this._updated = new BehaviorSubject(null);
37
- this._userUpdated = new BehaviorSubject(null);
38
- //Public Streams
39
- this.updated$ = this._updated.asObservable();
40
- this.userUpdated$ = this._userUpdated.asObservable();
41
- this.baseUrl = `${ApiUrl}/appContext`;
42
- }
43
- fireUpdated(data) {
44
- if (!data) {
45
- return;
46
- }
47
- this._updated.next(data);
48
- }
49
- fireUserUpdated() {
50
- this._userUpdated.next(null);
51
- }
52
- //Session
53
- getCurrent4Session() {
54
- return this.sessionStorage.getObject(this.storageKeyName);
55
- }
56
- setCurrent2Session(value) {
57
- this.sessionStorage.setObject(this.storageKeyName, value);
58
- }
59
- dataReceived(data) {
60
- this.current = data;
61
- this.subscription.unsubscribe();
62
- this.subscription = null;
63
- }
64
- getCurrentContext() {
65
- if (this.subscription != null) {
66
- return;
67
- }
68
- //Logging
69
- let stopwatch = new Stopwatch("AppContextService: Requesting a new AppContext");
70
- stopwatch.start();
71
- this.subscription = this.get('getCurrentContext', null).subscribe({
72
- next: (data) => {
73
- //Logging
74
- stopwatch.stop();
75
- stopwatch.printElapsedAsMilliseconds();
76
- this.dataReceived(data);
77
- }
78
- });
79
- }
80
- updateCurrentIfExpired() {
81
- let context = this.getCurrent4Session();
82
- if (!context) {
83
- return;
84
- }
85
- let shouldBeUpdated = false;
86
- let lr = context.lastRequested;
87
- if (lr) {
88
- let now = new Date();
89
- let lastRequested = new Date(context.lastRequested);
90
- let in60Mins = new Date(lastRequested.getFullYear(), lastRequested.getMonth(), lastRequested.getDate(), lastRequested.getHours(), lastRequested.getMinutes() + 60, 0, 0);
91
- if (in60Mins.getTime() < now.getTime()) {
92
- shouldBeUpdated = true;
93
- }
94
- }
95
- else {
96
- shouldBeUpdated = true;
97
- }
98
- if (shouldBeUpdated) {
99
- this.updateCurrent();
100
- }
101
- }
102
- //Public
103
- init(context = null) {
104
- if (context) {
105
- this.current = context;
106
- }
107
- }
108
- loadRequiredJsonFiles() {
109
- return null;
110
- }
111
- loadRequiredItems() {
112
- return null;
113
- }
114
- updateCurrent() {
115
- this.getCurrentContext();
116
- }
117
- //Storage
118
- clearLocalStorage() {
119
- this.localStorage.clear();
120
- }
121
- clearSessionStorage() {
122
- this.sessionStorage.clear();
123
- }
124
- clearWebStorage() {
125
- this.clearLocalStorage();
126
- this.clearSessionStorage();
127
- }
128
- //current
129
- get current() {
130
- this.updateCurrentIfExpired();
131
- return this.getCurrent4Session();
132
- }
133
- set current(value) {
134
- this.setCurrent2Session(value);
135
- this.fireUpdated(value);
136
- }
137
- //user
138
- get user() {
139
- let current = this.current;
140
- return current?.user;
141
- }
142
- /* Storage Caching ----------------------------------------------------------BEGIN */
143
- //version => localStorage
144
- get version() {
145
- return this.localStorage.getObject(AppContextStorageKeys.version);
146
- }
147
- set version(value) {
148
- this.localStorage.setObject(AppContextStorageKeys.version, value);
149
- }
150
- //currency => localStorage
151
- get currency() {
152
- return this.localStorage.getObject(AppContextStorageKeys.currency);
153
- }
154
- set currency(value) {
155
- this.localStorage.setObject(AppContextStorageKeys.currency, value);
156
- }
157
- clearCurrency() {
158
- this.localStorage.remove(AppContextStorageKeys.currency);
159
- }
160
- //countries => localStorage
161
- get countries() {
162
- return this.localStorage.getObject(AppContextStorageKeys.countries);
163
- }
164
- set countries(value) {
165
- this.localStorage.setObject(AppContextStorageKeys.countries, value);
166
- }
167
- clearCountries() {
168
- this.localStorage.remove(AppContextStorageKeys.countries);
169
- }
170
- //languages => localStorage
171
- get languages() {
172
- return this.localStorage.getObject(AppContextStorageKeys.languages);
173
- }
174
- set languages(value) {
175
- this.localStorage.setObject(AppContextStorageKeys.languages, value);
176
- }
177
- clearLanguages() {
178
- this.localStorage.remove(AppContextStorageKeys.languages);
179
- }
180
- static { this.ɵfac = function AppContextService_Factory(t) { return new (t || AppContextService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.LocalStorageService), i0.ɵɵinject(i2.SessionStorageService)); }; }
181
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AppContextService, factory: AppContextService.ɵfac }); }
182
- }
183
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppContextService, [{
184
- type: Injectable
185
- }], () => [{ type: i1.HttpClient }, { type: i2.LocalStorageService }, { type: i2.SessionStorageService }], null); })();
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwY29udGV4dC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5hdG9seS9zcmMvbGliL2NvcmUvc2VydmljZXMvYXBwY29udGV4dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBRUYsTUFBTTtBQUNOLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFFakUsS0FBSztBQUNMLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7O0FBRzlELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxjQUFjO0lBWW5ELFlBQXNCLElBQWdCLEVBQVksWUFBaUMsRUFBWSxjQUFxQztRQUNsSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFEUSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVksaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQVksbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBWDVILG1CQUFjLEdBQUcsWUFBWSxDQUFDO1FBQzlCLGlCQUFZLEdBQWlCLElBQUksQ0FBQztRQUUxQyxpQkFBaUI7UUFDVCxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQU0sSUFBSSxDQUFDLENBQUM7UUFDMUMsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUV0RCxnQkFBZ0I7UUFDUCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QyxpQkFBWSxHQUFH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TyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBVyxPQUFPLENBQUMsS0FBVTtRQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBVTtRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBVyxTQUFTLENBQUMsS0FBVTtRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBVyxTQUFTLENBQUMsS0FBVTtRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQztrRkF0TFUsaUJBQWlCO3VFQUFqQixpQkFBaUIsV0FBakIsaUJBQWlCOztpRkFBakIsaUJBQWlCO2NBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG48ZmlsZT5cclxuICBQcm9qZWN0OlxyXG4gICAgQG9zb3ZpdG55L2FuYXRvbHlcclxuXHJcbiAgQXV0aG9yczpcclxuICAgIFZhZGltIE9zb3ZpdG55IHZhZGltLm9zb3ZpdG55QG9zb3ZpdG55LmNvbVxyXG4gICAgQW5hdG9seSBPc292aXRueSBhbmF0b2x5Lm9zb3ZpdG55QG9zb3ZpdG55LmNvbVxyXG5cclxuICBDcmVhdGVkOlxyXG4gICAgMTMgTm92IDIwMTdcclxuXHJcbiAgQ29weXJpZ2h0IChjKSAyMDE2LTIwMjUgT3Nvdml0bnkgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG48L2ZpbGU+XHJcbiovXHJcblxyXG4vL05vZGVcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuLy9BcHBcclxuaW1wb3J0IHsgQXBpVXJsIH0gZnJvbSAnLi4vY29uc3RzL2NvcmUtc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBBcGlTZXJ2aWNlQmFzZSB9IGZyb20gJy4uLy4uL2RhdGEvYmFzZS9hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UsIFNlc3Npb25TdG9yYWdlU2VydmljZSB9IGZyb20gJy4vd2ViLXN0b3JhZ2Uuc2VydmljZSdcclxuaW1wb3J0IHsgU3RvcHdhdGNoIH0gZnJvbSAnLi4vcGVyZm9ybWFuY2Uvc3RvcHdhdGNoJztcclxuaW1wb3J0IHsgQXBwQ29udGV4dFN0b3JhZ2VLZXlzIH0gZnJvbSAnLi4vY29uc3RzL3N0b3JhZ2VLZXlzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFwcENvbnRleHRTZXJ2aWNlIGV4dGVuZHMgQXBpU2VydmljZUJhc2Uge1xyXG4gIHByaXZhdGUgc3RvcmFnZUtleU5hbWUgPSAnYXBwQ29udGV4dCc7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG51bGw7XHJcblxyXG4gIC8vUHJpdmF0ZSBTdHJlYW1zXHJcbiAgcHJpdmF0ZSBfdXBkYXRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuICBwcml2YXRlIF91c2VyVXBkYXRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuXHJcbiAgLy9QdWJsaWMgU3RyZWFtc1xyXG4gIHJlYWRvbmx5IHVwZGF0ZWQkID0gdGhpcy5fdXBkYXRlZC5hc09ic2VydmFibGUoKTtcclxuICByZWFkb25seSB1c2VyVXBkYXRlZCQgPSB0aGlzLl91c2VyVXBkYXRlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIHByb3RlY3RlZCBsb2NhbFN0b3JhZ2U6IExvY2FsU3RvcmFnZVNlcnZpY2UsIHByb3RlY3RlZCBzZXNzaW9uU3RvcmFnZTogU2Vzc2lvblN0b3JhZ2VTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihodHRwKTtcclxuICAgIHRoaXMuYmFzZVVybCA9IGAke0FwaVVybH0vYXBwQ29udGV4dGA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpcmVVcGRhdGVkKGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlZC5uZXh0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZpcmVVc2VyVXBkYXRlZCgpIHtcclxuICAgIHRoaXMuX3VzZXJVcGRhdGVkLm5leHQobnVsbCk7XHJcbiAgfVxyXG5cclxuICAvL1Nlc3Npb25cclxuICBwcml2YXRlIGdldEN1cnJlbnQ0U2Vzc2lvbigpIHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldE9iamVjdCh0aGlzLnN0b3JhZ2VLZXlOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q3VycmVudDJTZXNzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2Uuc2V0T2JqZWN0KHRoaXMuc3RvcmFnZUtleU5hbWUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGF0YVJlY2VpdmVkKGRhdGEpIHtcclxuICAgIHRoaXMuY3VycmVudCA9IGRhdGE7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDdXJyZW50Q29udGV4dCgpIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL0xvZ2dpbmdcclxuICAgIGxldCBzdG9wd2F0Y2ggPSBuZXcgU3RvcHdhdGNoKFwiQXBwQ29udGV4dFNlcnZpY2U6IFJlcXVlc3RpbmcgYSBuZXcgQXBwQ29udGV4dFwiKTtcclxuICAgIHN0b3B3YXRjaC5zdGFydCgpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5nZXQoJ2dldEN1cnJlbnRDb250ZXh0JywgbnVsbCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAvL0xvZ2dpbmdcclxuICAgICAgICBzdG9wd2F0Y2guc3RvcCgpO1xyXG4gICAgICAgIHN0b3B3YXRjaC5wcmludEVsYXBzZWRBc01pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFSZWNlaXZlZChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRJZkV4cGlyZWQoKSB7XHJcbiAgICBsZXQgY29udGV4dCA9IHRoaXMuZ2V0Q3VycmVudDRTZXNzaW9uKCk7XHJcblxyXG4gICAgaWYgKCFjb250ZXh0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2hvdWxkQmVVcGRhdGVkID0gZmFsc2U7XHJcbiAgICBsZXQgbHIgPSBjb250ZXh0Lmxhc3RSZXF1ZXN0ZWQ7XHJcblxyXG4gICAgaWYgKGxyKSB7XHJcbiAgICAgIGxldCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBsZXQgbGFzdFJlcXVlc3RlZCA9IG5ldyBEYXRlKGNvbnRleHQubGFzdFJlcXVlc3RlZCk7XHJcbiAgICAgIGxldCBpbjYwTWlucyA9IG5ldyBEYXRlKGxhc3RSZXF1ZXN0ZWQuZ2V0RnVsbFllYXIoKSwgbGFzdFJlcXVlc3RlZC5nZXRNb250aCgpLCBsYXN0UmVxdWVzdGVkLmdldERhdGUoKSxcclxuICAgICAgICBsYXN0UmVxdWVzdGVkLmdldEhvdXJzKCksIGxhc3RSZXF1ZXN0ZWQuZ2V0TWludXRlcygpICsgNjAsIDAsIDApO1xyXG5cclxuICAgICAgaWYgKGluNjBNaW5zLmdldFRpbWUoKSA8IG5vdy5nZXRUaW1lKCkpIHtcclxuICAgICAgICBzaG91bGRCZVVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2hvdWxkQmVVcGRhdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2hvdWxkQmVVcGRhdGVkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9QdWJsaWNcclxuICBpbml0KGNvbnRleHQgPSBudWxsKSB7XHJcbiAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnQgPSBjb250ZXh0O1xyXG4gICAgfVxyXG5cdH1cclxuXHJcbiAgbG9hZFJlcXVpcmVkSnNvbkZpbGVzKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGxvYWRSZXF1aXJlZEl0ZW1zKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUN1cnJlbnQoKSB7XHJcbiAgICB0aGlzLmdldEN1cnJlbnRDb250ZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvL1N0b3JhZ2VcclxuICBjbGVhckxvY2FsU3RvcmFnZSgpIHtcclxuXHRcdHRoaXMubG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcblx0fVxyXG5cclxuXHRjbGVhclNlc3Npb25TdG9yYWdlKCkge1xyXG5cdFx0dGhpcy5zZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG5cdH1cclxuXHJcbiAgY2xlYXJXZWJTdG9yYWdlKCkge1xyXG5cdFx0dGhpcy5jbGVhckxvY2FsU3RvcmFnZSgpO1xyXG5cdFx0dGhpcy5jbGVhclNlc3Npb25TdG9yYWdlKCk7XHJcblx0fVxyXG5cclxuICAvL2N1cnJlbnRcclxuICBwdWJsaWMgZ2V0IGN1cnJlbnQoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRJZkV4cGlyZWQoKTtcclxuICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnQ0U2Vzc2lvbigpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGN1cnJlbnQodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5zZXRDdXJyZW50MlNlc3Npb24odmFsdWUpO1xyXG4gICAgdGhpcy5maXJlVXBkYXRlZCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvL3VzZXJcclxuXHRwdWJsaWMgZ2V0IHVzZXIoKSB7XHJcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuY3VycmVudDtcclxuXHRcdHJldHVybiBjdXJyZW50Py51c2VyO1xyXG5cdH1cclxuXHJcbiAgLyogU3RvcmFnZSBDYWNoaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1CRUdJTiAqL1xyXG4gIC8vdmVyc2lvbiA9PiBsb2NhbFN0b3JhZ2VcclxuICBwdWJsaWMgZ2V0IHZlcnNpb24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0T2JqZWN0KEFwcENvbnRleHRTdG9yYWdlS2V5cy52ZXJzaW9uKTtcclxuICB9XHJcbiAgcHVibGljIHNldCB2ZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldE9iamVjdChBcHBDb250ZXh0U3RvcmFnZUtleXMudmVyc2lvbiwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLy9jdXJyZW5jeSA9PiBsb2NhbFN0b3JhZ2VcclxuICBwdWJsaWMgZ2V0IGN1cnJlbmN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlLmdldE9iamVjdChBcHBDb250ZXh0U3RvcmFnZUtleXMuY3VycmVuY3kpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGN1cnJlbmN5KHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldE9iamVjdChBcHBDb250ZXh0U3RvcmFnZUtleXMuY3VycmVuY3ksIHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGNsZWFyQ3VycmVuY3koKSB7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5yZW1vdmUoQXBwQ29udGV4dFN0b3JhZ2VLZXlzLmN1cnJlbmN5KTtcclxuICB9XHJcblxyXG4gIC8vY291bnRyaWVzID0+IGxvY2FsU3RvcmFnZVxyXG4gIHB1YmxpYyBnZXQgY291bnRyaWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlLmdldE9iamVjdChBcHBDb250ZXh0U3RvcmFnZUtleXMuY291bnRyaWVzKTtcclxuICB9XHJcbiAgcHVibGljIHNldCBjb3VudHJpZXModmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0T2JqZWN0KEFwcENvbnRleHRTdG9yYWdlS2V5cy5jb3VudHJpZXMsIHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGNsZWFyQ291bnRyaWVzKCkge1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlKEFwcENvbnRleHRTdG9yYWdlS2V5cy5jb3VudHJpZXMpO1xyXG4gIH1cclxuXHJcbiAgLy9sYW5ndWFnZXMgPT4gbG9jYWxTdG9yYWdlXHJcbiAgcHVibGljIGdldCBsYW5ndWFnZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0T2JqZWN0KEFwcENvbnRleHRTdG9yYWdlS2V5cy5sYW5ndWFnZXMpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGxhbmd1YWdlcyh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRPYmplY3QoQXBwQ29udGV4dFN0b3JhZ2VLZXlzLmxhbmd1YWdlcywgdmFsdWUpO1xyXG4gIH1cclxuICBwdWJsaWMgY2xlYXJMYW5ndWFnZXMoKSB7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5yZW1vdmUoQXBwQ29udGV4dFN0b3JhZ2VLZXlzLmxhbmd1YWdlcyk7XHJcbiAgfVxyXG4gIC8qIFN0b3JhZ2UgQ2FjaGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRU5EICovXHJcbn1cclxuIl19
@@ -1,69 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 29 Nov 2020
12
-
13
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
14
- </file>
15
- */
16
- //Node
17
- import { Injectable, Inject } from '@angular/core';
18
- import { DOCUMENT } from '@angular/common';
19
- import * as i0 from "@angular/core";
20
- import * as i1 from "@angular/platform-browser";
21
- export class DigitalMarketingService {
22
- constructor(title, meta, dom) {
23
- this.title = title;
24
- this.meta = meta;
25
- this.dom = dom;
26
- }
27
- updateTitle(title) {
28
- this.title.setTitle(title);
29
- }
30
- updateDescription(desc) {
31
- this.meta.updateTag({ name: 'description', content: desc });
32
- }
33
- updateKeywords(keywords) {
34
- this.meta.updateTag({ name: 'keywords', content: keywords });
35
- }
36
- updateMetaTags(meta) {
37
- meta.forEach(m => this.meta.updateTag(m));
38
- }
39
- setCanonicalUrl(url) {
40
- const canUrl = url === undefined ? this.dom.URL : url;
41
- const link = this.dom.createElement('link');
42
- link.setAttribute('rel', 'canonical');
43
- this.dom.head.appendChild(link);
44
- link.setAttribute('href', canUrl);
45
- }
46
- updateCanonicalUrl(url) {
47
- const canUrl = url === undefined ? this.dom.URL : url;
48
- const head = this.dom.getElementsByTagName('head')[0];
49
- let link = this.dom.querySelector(`link[rel='canonical']`) || null;
50
- if (link == null) {
51
- link = this.dom.createElement('link');
52
- head.appendChild(link);
53
- }
54
- link.setAttribute('rel', 'canonical');
55
- link.setAttribute('href', canUrl);
56
- }
57
- static { this.ɵfac = function DigitalMarketingService_Factory(t) { return new (t || DigitalMarketingService)(i0.ɵɵinject(i1.Title), i0.ɵɵinject(i1.Meta), i0.ɵɵinject(DOCUMENT)); }; }
58
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: DigitalMarketingService, factory: DigitalMarketingService.ɵfac, providedIn: 'root' }); }
59
- }
60
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DigitalMarketingService, [{
61
- type: Injectable,
62
- args: [{
63
- providedIn: 'root'
64
- }]
65
- }], () => [{ type: i1.Title }, { type: i1.Meta }, { type: undefined, decorators: [{
66
- type: Inject,
67
- args: [DOCUMENT]
68
- }] }], null); })();
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuYXRvbHkvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2RtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0VBY0U7QUFFRixNQUFNO0FBQ04sT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFNM0MsTUFBTSxPQUFPLHVCQUF1QjtJQUNsQyxZQUNVLEtBQVksRUFDWixJQUFVLEVBQ1EsR0FBUTtRQUYxQixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osU0FBSSxHQUFKLElBQUksQ0FBTTtRQUNRLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFFcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFjO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFhO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQWM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxjQUFjLENBQUMsSUFBc0I7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFZO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEQsTUFBTSxJQUFJLEdBQW9CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsR0FBWTtRQUM3QixNQUFNLE1BQU0sR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3RELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLEdBQW9CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLElBQUksSUFBSSxDQUFDO1FBRXBGLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQW9CLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQzt3RkE1Q1UsdUJBQXVCLDJEQUl4QixRQUFRO3VFQUpQLHVCQUF1QixXQUF2Qix1QkFBdUIsbUJBRnRCLE1BQU07O2lGQUVQLHVCQUF1QjtjQUhuQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7O3NCQUtJLE1BQU07dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbjxmaWxlPlxyXG4gIFByb2plY3Q6XHJcbiAgICBAb3Nvdml0bnkvYW5hdG9seVxyXG5cclxuICBBdXRob3JzOlxyXG4gICAgVmFkaW0gT3Nvdml0bnkgdmFkaW0ub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcbiAgICBBbmF0b2x5IE9zb3ZpdG55IGFuYXRvbHkub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcblxyXG4gIENyZWF0ZWQ6XHJcbiAgICAyOSBOb3YgMjAyMFxyXG5cclxuICBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBPc292aXRueSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbjwvZmlsZT5cclxuKi9cclxuXHJcbi8vTm9kZVxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUaXRsZSwgTWV0YSwgTWV0YURlZmluaXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERpZ2l0YWxNYXJrZXRpbmdTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdGl0bGU6IFRpdGxlLFxyXG4gICAgcHJpdmF0ZSBtZXRhOiBNZXRhLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb206IGFueSxcclxuICApIHtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRpdGxlKHRpdGxlPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKHRpdGxlKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZURlc2NyaXB0aW9uKGRlc2M/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBuYW1lOiAnZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlS2V5d29yZHMoa2V5d29yZHM/OiBhbnkpIHtcclxuICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBuYW1lOiAna2V5d29yZHMnLCBjb250ZW50OiBrZXl3b3JkcyB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU1ldGFUYWdzKG1ldGE6IE1ldGFEZWZpbml0aW9uW10pIHtcclxuICAgIG1ldGEuZm9yRWFjaChtID0+IHRoaXMubWV0YS51cGRhdGVUYWcobSkpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2Fub25pY2FsVXJsKHVybD86IHN0cmluZykge1xyXG4gICAgY29uc3QgY2FuVXJsID0gdXJsID09PSB1bmRlZmluZWQgPyB0aGlzLmRvbS5VUkwgOiB1cmw7XHJcbiAgICBjb25zdCBsaW5rOiBIVE1MTGlua0VsZW1lbnQgPSB0aGlzLmRvbS5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XHJcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgncmVsJywgJ2Nhbm9uaWNhbCcpO1xyXG4gICAgdGhpcy5kb20uaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgY2FuVXJsKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUNhbm9uaWNhbFVybCh1cmw/OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNhblVybCA9IHVybCA9PT0gdW5kZWZpbmVkID8gdGhpcy5kb20uVVJMIDogdXJsO1xyXG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XHJcbiAgICBsZXQgbGluazogSFRNTExpbmtFbGVtZW50ID0gdGhpcy5kb20ucXVlcnlTZWxlY3RvcihgbGlua1tyZWw9J2Nhbm9uaWNhbCddYCkgfHwgbnVsbDtcclxuXHJcbiAgICBpZiAobGluayA9PSBudWxsKSB7XHJcbiAgICAgIGxpbmsgPSB0aGlzLmRvbS5jcmVhdGVFbGVtZW50KCdsaW5rJykgYXMgSFRNTExpbmtFbGVtZW50O1xyXG4gICAgICBoZWFkLmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgfVxyXG5cclxuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdyZWwnLCAnY2Fub25pY2FsJyk7XHJcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGNhblVybCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,75 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 29 Nov 2020
12
-
13
- Details:
14
- https://medium.com/@danielfilipkowskiblogs/adding-google-analytics-to-angular-v15-1766c4bdaed5
15
-
16
- API:
17
- https://developers.google.com/tag-platform/gtagjs/reference
18
- https://developers.google.com/analytics/devguides/collection/ga4/events?client_type=gtag
19
-
20
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
21
- </file>
22
- */
23
- //Node
24
- import { Injectable } from '@angular/core';
25
- import { NavigationEnd } from '@angular/router';
26
- import * as i0 from "@angular/core";
27
- import * as i1 from "@angular/router";
28
- export class GoogleAnalyticsService {
29
- constructor(router) {
30
- this.router = router;
31
- }
32
- subscribe() {
33
- this.subscription = this.router.events.subscribe({
34
- next: (event) => {
35
- if (event instanceof NavigationEnd) {
36
- if (this.ga) {
37
- this.ga('set', 'page', event.urlAfterRedirects);
38
- this.ga('send', 'pageview');
39
- }
40
- }
41
- }
42
- });
43
- }
44
- unsubscribe() {
45
- if (this.subscription) {
46
- this.subscription.unsubscribe();
47
- }
48
- }
49
- event(name, params = null) {
50
- if (!this.ga) {
51
- return;
52
- }
53
- try {
54
- if (params) {
55
- this.ga('event', name, params);
56
- }
57
- else {
58
- this.ga('event', name);
59
- }
60
- }
61
- catch (err) {
62
- console.error('Google Analytics event error', err);
63
- }
64
- }
65
- get ga() {
66
- let ga = window.gtag;
67
- return ga;
68
- }
69
- static { this.ɵfac = function GoogleAnalyticsService_Factory(t) { return new (t || GoogleAnalyticsService)(i0.ɵɵinject(i1.Router)); }; }
70
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: GoogleAnalyticsService, factory: GoogleAnalyticsService.ɵfac }); }
71
- }
72
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GoogleAnalyticsService, [{
73
- type: Injectable
74
- }], () => [{ type: i1.Router }], null); })();
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWFuYWx5dGljcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5hdG9seS9zcmMvbGliL2NvcmUvc2VydmljZXMvZ29vZ2xlLWFuYWx5dGljcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFxQkU7QUFFRixNQUFNO0FBQ04sT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQVUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUd4RCxNQUFNLE9BQU8sc0JBQXNCO0lBR2pDLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ2xDLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDL0MsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2QsSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFLENBQUM7b0JBQ25DLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUNaLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDaEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsSUFBWSxFQUFFLE1BQU0sR0FBRyxJQUFJO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLENBQUM7aUJBQ0ksQ0FBQztnQkFDSixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBWSxFQUFFO1FBQ1osSUFBSSxFQUFFLEdBQVMsTUFBTyxDQUFDLElBQUksQ0FBQztRQUM1QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7dUZBOUNVLHNCQUFzQjt1RUFBdEIsc0JBQXNCLFdBQXRCLHNCQUFzQjs7aUZBQXRCLHNCQUFzQjtjQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuPGZpbGU+XHJcbiAgUHJvamVjdDpcclxuICAgIEBvc292aXRueS9hbmF0b2x5XHJcblxyXG4gIEF1dGhvcnM6XHJcbiAgICBWYWRpbSBPc292aXRueSB2YWRpbS5vc292aXRueUBvc292aXRueS5jb21cclxuICAgIEFuYXRvbHkgT3Nvdml0bnkgYW5hdG9seS5vc292aXRueUBvc292aXRueS5jb21cclxuXHJcbiAgQ3JlYXRlZDpcclxuICAgIDI5IE5vdiAyMDIwXHJcblxyXG4gIERldGFpbHM6XHJcbiAgICBodHRwczovL21lZGl1bS5jb20vQGRhbmllbGZpbGlwa293c2tpYmxvZ3MvYWRkaW5nLWdvb2dsZS1hbmFseXRpY3MtdG8tYW5ndWxhci12MTUtMTc2NmM0YmRhZWQ1XHJcblxyXG4gICAgQVBJOlxyXG4gICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vdGFnLXBsYXRmb3JtL2d0YWdqcy9yZWZlcmVuY2VcclxuICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2FuYWx5dGljcy9kZXZndWlkZXMvY29sbGVjdGlvbi9nYTQvZXZlbnRzP2NsaWVudF90eXBlPWd0YWdcclxuXHJcbiAgQ29weXJpZ2h0IChjKSAyMDE2LTIwMjUgT3Nvdml0bnkgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG48L2ZpbGU+XHJcbiovXHJcblxyXG4vL05vZGVcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEdvb2dsZUFuYWx5dGljc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIpIHtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2EoJ3NldCcsICdwYWdlJywgZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmdhKCdzZW5kJywgJ3BhZ2V2aWV3Jyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlKCkge1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBldmVudChuYW1lOiBzdHJpbmcsIHBhcmFtcyA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy5nYSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgIHRoaXMuZ2EoJ2V2ZW50JywgbmFtZSwgcGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmdhKCdldmVudCcsIG5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0dvb2dsZSBBbmFseXRpY3MgZXZlbnQgZXJyb3InLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZ2EoKSB7XHJcbiAgICBsZXQgZ2EgPSAoPGFueT53aW5kb3cpLmd0YWc7XHJcbiAgICByZXR1cm4gZ2E7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,77 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 26 Jun 2020
12
-
13
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
14
- </file>
15
- */
16
- //Node
17
- import { Injectable } from '@angular/core';
18
- //RxJs
19
- import { fromEvent, merge, Subject, timer } from 'rxjs';
20
- import * as i0 from "@angular/core";
21
- export class IdleService {
22
- constructor() {
23
- this.expired$ = new Subject();
24
- }
25
- //Private
26
- resetTimeCounters(timeOutSeconds) {
27
- this.timeOutSeconds = timeOutSeconds;
28
- this.timeOutMilliSeconds = timeOutSeconds * 1000;
29
- this.startDate = new Date();
30
- }
31
- startTimer() {
32
- this.timer$ = timer(this.timeOutMilliSeconds, 1 * 1000).subscribe({
33
- next: (data) => {
34
- let nowDate = new Date();
35
- let exiredDate = new Date(this.startDate.getTime() + this.timeOutMilliSeconds);
36
- if (nowDate.getTime() >= exiredDate.getTime()) {
37
- //console.log("nowDate: " + nowDate);
38
- //console.log("exiredDate: " + exiredDate);
39
- this.expired$.next(true);
40
- }
41
- }
42
- });
43
- }
44
- resetTimer() {
45
- this.startDate = new Date();
46
- }
47
- //Public
48
- startWatching(timeOutSeconds) {
49
- this.idle$ = merge(fromEvent(document, 'mousemove'), fromEvent(document, 'click'), fromEvent(document, 'mousedown'), fromEvent(document, 'keypress'), fromEvent(document, 'DOMMouseScroll'), fromEvent(document, 'mousewheel'), fromEvent(document, 'touchmove'), fromEvent(document, 'MSPointerMove'), fromEvent(window, 'mousemove'), fromEvent(window, 'resize'));
50
- this.resetTimeCounters(timeOutSeconds);
51
- this.idleSubscription = this.idle$.subscribe({
52
- next: (data) => {
53
- this.resetTimer();
54
- }
55
- });
56
- this.startTimer();
57
- return this.expired$;
58
- }
59
- stopWatching() {
60
- this.timer$.unsubscribe();
61
- this.idleSubscription.unsubscribe();
62
- }
63
- restartIdleTimer(timeOutSeconds) {
64
- this.timer$.unsubscribe();
65
- this.resetTimeCounters(timeOutSeconds);
66
- this.startTimer();
67
- }
68
- static { this.ɵfac = function IdleService_Factory(t) { return new (t || IdleService)(); }; }
69
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: IdleService, factory: IdleService.ɵfac, providedIn: 'root' }); }
70
- }
71
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(IdleService, [{
72
- type: Injectable,
73
- args: [{
74
- providedIn: 'root'
75
- }]
76
- }], null, null); })();
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5hdG9seS9zcmMvbGliL2NvcmUvc2VydmljZXMvaWRsZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBRUYsTUFBTTtBQUNOLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsTUFBTTtBQUNOLE9BQU8sRUFBYyxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBS3BFLE1BQU0sT0FBTyxXQUFXO0lBSHhCO1FBYVMsYUFBUSxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO0tBbUU1RDtJQWpFQyxTQUFTO0lBQ0QsaUJBQWlCLENBQUMsY0FBYztRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQztRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFFL0UsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7b0JBQzlDLHFDQUFxQztvQkFDckMsMkNBQTJDO29CQUUzQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELFFBQVE7SUFDRCxhQUFhLENBQUMsY0FBYztRQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FDaEIsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFDaEMsU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFDNUIsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFDaEMsU0FBUyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFDL0IsU0FBUyxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxFQUNyQyxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUNqQyxTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUNoQyxTQUFTLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxFQUNwQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUM5QixTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUM1QixDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUMzQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLGNBQWM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7NEVBNUVVLFdBQVc7dUVBQVgsV0FBVyxXQUFYLFdBQVcsbUJBRlYsTUFBTTs7aUZBRVAsV0FBVztjQUh2QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG48ZmlsZT5cclxuICBQcm9qZWN0OlxyXG4gICAgQG9zb3ZpdG55L2FuYXRvbHlcclxuXHJcbiAgQXV0aG9yczpcclxuICAgIFZhZGltIE9zb3ZpdG55IHZhZGltLm9zb3ZpdG55QG9zb3ZpdG55LmNvbVxyXG4gICAgQW5hdG9seSBPc292aXRueSBhbmF0b2x5Lm9zb3ZpdG55QG9zb3ZpdG55LmNvbVxyXG5cclxuICBDcmVhdGVkOlxyXG4gICAgMjYgSnVuIDIwMjBcclxuXHJcbiAgQ29weXJpZ2h0IChjKSAyMDE2LTIwMjUgT3Nvdml0bnkgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG48L2ZpbGU+XHJcbiovXHJcblxyXG4vL05vZGVcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy9SeEpzXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QsIHRpbWVyIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZGxlU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBpZGxlJDogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHByaXZhdGUgdGltZXIkO1xyXG4gIHByaXZhdGUgaWRsZVN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLy9EYXRlcy9UaW1lb3V0c1xyXG4gIHByaXZhdGUgc3RhcnREYXRlO1xyXG4gIHByaXZhdGUgdGltZU91dFNlY29uZHM6IG51bWJlcjtcclxuICBwcml2YXRlIHRpbWVPdXRNaWxsaVNlY29uZHM6IG51bWJlcjtcclxuXHJcbiAgcHVibGljIGV4cGlyZWQkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLy9Qcml2YXRlXHJcbiAgcHJpdmF0ZSByZXNldFRpbWVDb3VudGVycyh0aW1lT3V0U2Vjb25kcykge1xyXG4gICAgdGhpcy50aW1lT3V0U2Vjb25kcyA9IHRpbWVPdXRTZWNvbmRzO1xyXG4gICAgdGhpcy50aW1lT3V0TWlsbGlTZWNvbmRzID0gdGltZU91dFNlY29uZHMgKiAxMDAwO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydFRpbWVyKCkge1xyXG4gICAgdGhpcy50aW1lciQgPSB0aW1lcih0aGlzLnRpbWVPdXRNaWxsaVNlY29uZHMsIDEgKiAxMDAwKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGxldCBub3dEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBsZXQgZXhpcmVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldFRpbWUoKSArIHRoaXMudGltZU91dE1pbGxpU2Vjb25kcyk7XHJcblxyXG4gICAgICAgIGlmIChub3dEYXRlLmdldFRpbWUoKSA+PSBleGlyZWREYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhcIm5vd0RhdGU6IFwiICsgbm93RGF0ZSk7XHJcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXhpcmVkRGF0ZTogXCIgKyBleGlyZWREYXRlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmV4cGlyZWQkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRUaW1lcigpIHtcclxuICAgIHRoaXMuc3RhcnREYXRlID0gbmV3IERhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vUHVibGljXHJcbiAgcHVibGljIHN0YXJ0V2F0Y2hpbmcodGltZU91dFNlY29uZHMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5pZGxlJCA9IG1lcmdlKFxyXG4gICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKSxcclxuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKSxcclxuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2Vkb3duJyksXHJcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ2tleXByZXNzJyksXHJcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ0RPTU1vdXNlU2Nyb2xsJyksXHJcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNld2hlZWwnKSxcclxuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2htb3ZlJyksXHJcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ01TUG9pbnRlck1vdmUnKSxcclxuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ21vdXNlbW92ZScpLFxyXG4gICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJyksXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMucmVzZXRUaW1lQ291bnRlcnModGltZU91dFNlY29uZHMpO1xyXG5cclxuICAgIHRoaXMuaWRsZVN1YnNjcmlwdGlvbiA9IHRoaXMuaWRsZSQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLnJlc2V0VGltZXIoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgICByZXR1cm4gdGhpcy5leHBpcmVkJDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdG9wV2F0Y2hpbmcoKSB7XHJcbiAgICB0aGlzLnRpbWVyJC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5pZGxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzdGFydElkbGVUaW1lcih0aW1lT3V0U2Vjb25kcykge1xyXG4gICAgdGhpcy50aW1lciQudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLnJlc2V0VGltZUNvdW50ZXJzKHRpbWVPdXRTZWNvbmRzKTtcclxuICAgIHRoaXMuc3RhcnRUaW1lcigpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,67 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 26 Jun 2020
12
-
13
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
14
- </file>
15
- */
16
- //Node
17
- import { Injectable } from "@angular/core";
18
- import { BehaviorSubject } from "rxjs";
19
- import * as i0 from "@angular/core";
20
- export class LoadingService extends BehaviorSubject {
21
- constructor() {
22
- super(false);
23
- this.counter = 0;
24
- //Public
25
- this.isFreezed = false;
26
- }
27
- show() {
28
- this.counter++;
29
- let that = this;
30
- setTimeout(() => {
31
- if (that.counter > 0) {
32
- that.next(true);
33
- }
34
- }, 500);
35
- }
36
- hide() {
37
- if (this.counter <= 0) {
38
- return;
39
- }
40
- this.counter--;
41
- if (this.counter == 0) {
42
- this.next(false);
43
- }
44
- }
45
- freeze(timeout = 1000) {
46
- this.isFreezed = true;
47
- let that = this;
48
- setTimeout(() => {
49
- this.isFreezed = false;
50
- }, timeout);
51
- }
52
- reset() {
53
- if (this.counter > 0) {
54
- this.next(false);
55
- }
56
- this.counter = 0;
57
- }
58
- static { this.ɵfac = function LoadingService_Factory(t) { return new (t || LoadingService)(); }; }
59
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: LoadingService, factory: LoadingService.ɵfac, providedIn: 'root' }); }
60
- }
61
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LoadingService, [{
62
- type: Injectable,
63
- args: [{
64
- providedIn: 'root'
65
- }]
66
- }], () => [], null); })();
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5hdG9seS9zcmMvbGliL2NvcmUvc2VydmljZXMvbG9hZGluZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztFQWNFO0FBRUYsTUFBTTtBQUNOLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFLdkMsTUFBTSxPQUFPLGNBQWUsU0FBUSxlQUF3QjtJQU0xRDtRQUNFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQU5QLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFFcEIsUUFBUTtRQUNELGNBQVMsR0FBRyxLQUFLLENBQUM7SUFJekIsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFZixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFZixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFrQixJQUFJO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQzsrRUFoRFUsY0FBYzt1RUFBZCxjQUFjLFdBQWQsY0FBYyxtQkFGYixNQUFNOztpRkFFUCxjQUFjO2NBSDFCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbjxmaWxlPlxyXG4gIFByb2plY3Q6XHJcbiAgICBAb3Nvdml0bnkvYW5hdG9seVxyXG5cclxuICBBdXRob3JzOlxyXG4gICAgVmFkaW0gT3Nvdml0bnkgdmFkaW0ub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcbiAgICBBbmF0b2x5IE9zb3ZpdG55IGFuYXRvbHkub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcblxyXG4gIENyZWF0ZWQ6XHJcbiAgICAyNiBKdW4gMjAyMFxyXG5cclxuICBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBPc292aXRueSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbjwvZmlsZT5cclxuKi9cclxuXHJcbi8vTm9kZVxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExvYWRpbmdTZXJ2aWNlIGV4dGVuZHMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICBwcml2YXRlIGNvdW50ZXIgPSAwO1xyXG5cclxuICAvL1B1YmxpY1xyXG4gIHB1YmxpYyBpc0ZyZWV6ZWQgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcihmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5jb3VudGVyKys7XHJcblxyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGF0LmNvdW50ZXIgPiAwKSB7XHJcbiAgICAgICAgdGhhdC5uZXh0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MDApO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIGlmICh0aGlzLmNvdW50ZXIgPD0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb3VudGVyLS07XHJcblxyXG4gICAgaWYgKHRoaXMuY291bnRlciA9PSAwKSB7XHJcbiAgICAgIHRoaXMubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmcmVlemUodGltZW91dDogbnVtYmVyID0gMTAwMCkge1xyXG4gICAgdGhpcy5pc0ZyZWV6ZWQgPSB0cnVlO1xyXG5cclxuICAgIGxldCB0aGF0ID0gdGhpcztcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzRnJlZXplZCA9IGZhbHNlO1xyXG4gICAgfSwgdGltZW91dCk7XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIGlmICh0aGlzLmNvdW50ZXIgPiAwKSB7XHJcbiAgICAgIHRoaXMubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb3VudGVyID0gMDtcclxuICB9XHJcbn1cclxuIl19
@@ -1,77 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 14 Jun 2024
12
-
13
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
14
- </file>
15
- */
16
- //Node
17
- import { Injectable } from '@angular/core';
18
- import * as i0 from "@angular/core";
19
- export class ScriptService {
20
- constructor(zone) {
21
- this.zone = zone;
22
- }
23
- getElemId(globalVar) {
24
- return `anatoly-script-${globalVar}`;
25
- }
26
- registerScript(url, globalVar, onReady) {
27
- const existingGlobalVar = window[globalVar];
28
- if (existingGlobalVar) {
29
- // global variable is present = script was already loaded
30
- this.zone.run(() => {
31
- onReady(existingGlobalVar);
32
- });
33
- return;
34
- }
35
- // prepare script elem
36
- const scriptElem = document.createElement('script');
37
- scriptElem.id = this.getElemId(globalVar);
38
- scriptElem.innerHTML = '';
39
- scriptElem.onload = () => {
40
- this.zone.run(() => {
41
- onReady(window[globalVar]);
42
- });
43
- };
44
- scriptElem.src = url;
45
- scriptElem.async = true;
46
- scriptElem.defer = true;
47
- // add script to header
48
- document.getElementsByTagName('head')[0].appendChild(scriptElem);
49
- }
50
- cleanup(globalVar) {
51
- // remove script from DOM
52
- const scriptElem = document.getElementById(this.getElemId(globalVar));
53
- if (scriptElem) {
54
- scriptElem.remove();
55
- }
56
- }
57
- getQueryString(queryParams) {
58
- let queryString = '';
59
- for (let i = 0; i < queryParams.length; i++) {
60
- const queryParam = queryParams[i];
61
- if (i === 0) {
62
- queryString += '?';
63
- }
64
- else {
65
- queryString += '&';
66
- }
67
- queryString += `${queryParam.name}=${queryParam.value}`;
68
- }
69
- return queryString;
70
- }
71
- static { this.ɵfac = function ScriptService_Factory(t) { return new (t || ScriptService)(i0.ɵɵinject(i0.NgZone)); }; }
72
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ScriptService, factory: ScriptService.ɵfac }); }
73
- }
74
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ScriptService, [{
75
- type: Injectable
76
- }], () => [{ type: i0.NgZone }], null); })();
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmF0b2x5L3NyYy9saWIvY29yZS9zZXJ2aWNlcy9zY3JpcHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7RUFjRTtBQUVGLE1BQU07QUFDTixPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQU1uRCxNQUFNLE9BQU8sYUFBYTtJQUN4QixZQUFzQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtJQUNsQyxDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCO1FBQ2pDLE9BQU8sa0JBQWtCLFNBQVMsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQUUsT0FBaUM7UUFDOUUsTUFBTSxpQkFBaUIsR0FBSSxNQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxVQUFVLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDMUIsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUUsTUFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNyQixVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUN4QixVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUV4Qix1QkFBdUI7UUFDdkIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLHlCQUF5QjtRQUN6QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUV0RSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLFdBQTBCO1FBQ3ZDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDVixXQUFXLElBQUksR0FBRyxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixXQUFXLElBQUksR0FBRyxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxXQUFXLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1RCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzs4RUE1RFUsYUFBYTt1RUFBYixhQUFhLFdBQWIsYUFBYTs7aUZBQWIsYUFBYTtjQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuPGZpbGU+XHJcbiAgUHJvamVjdDpcclxuICAgIEBvc292aXRueS9hbmF0b2x5XHJcblxyXG4gIEF1dGhvcnM6XHJcbiAgICBWYWRpbSBPc292aXRueSB2YWRpbS5vc292aXRueUBvc292aXRueS5jb21cclxuICAgIEFuYXRvbHkgT3Nvdml0bnkgYW5hdG9seS5vc292aXRueUBvc292aXRueS5jb21cclxuXHJcbiAgQ3JlYXRlZDpcclxuICAgIDE0IEp1biAyMDI0XHJcblxyXG4gIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IE9zb3ZpdG55IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuPC9maWxlPlxyXG4qL1xyXG5cclxuLy9Ob2RlXHJcbmltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLy9BcHBcclxuaW1wb3J0IHsgSVF1ZXJ5UGFyYW0gfSBmcm9tICcuLi9tb2RlbHMvcXMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU2NyaXB0U2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHpvbmU6IE5nWm9uZSkge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRFbGVtSWQoZ2xvYmFsVmFyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBhbmF0b2x5LXNjcmlwdC0ke2dsb2JhbFZhcn1gO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJTY3JpcHQodXJsOiBzdHJpbmcsIGdsb2JhbFZhcjogc3RyaW5nLCBvblJlYWR5OiAoZ2xvYmFsVmFyOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nR2xvYmFsVmFyID0gKHdpbmRvdyBhcyBhbnkpW2dsb2JhbFZhcl07XHJcblxyXG4gICAgaWYgKGV4aXN0aW5nR2xvYmFsVmFyKSB7XHJcbiAgICAgIC8vIGdsb2JhbCB2YXJpYWJsZSBpcyBwcmVzZW50ID0gc2NyaXB0IHdhcyBhbHJlYWR5IGxvYWRlZFxyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICBvblJlYWR5KGV4aXN0aW5nR2xvYmFsVmFyKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmVwYXJlIHNjcmlwdCBlbGVtXHJcbiAgICBjb25zdCBzY3JpcHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICBzY3JpcHRFbGVtLmlkID0gdGhpcy5nZXRFbGVtSWQoZ2xvYmFsVmFyKTtcclxuICAgIHNjcmlwdEVsZW0uaW5uZXJIVE1MID0gJyc7XHJcbiAgICBzY3JpcHRFbGVtLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgb25SZWFkeSgod2luZG93IGFzIGFueSlbZ2xvYmFsVmFyXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHNjcmlwdEVsZW0uc3JjID0gdXJsO1xyXG4gICAgc2NyaXB0RWxlbS5hc3luYyA9IHRydWU7XHJcbiAgICBzY3JpcHRFbGVtLmRlZmVyID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBhZGQgc2NyaXB0IHRvIGhlYWRlclxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHRFbGVtKTtcclxuICB9XHJcblxyXG4gIGNsZWFudXAoZ2xvYmFsVmFyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIHJlbW92ZSBzY3JpcHQgZnJvbSBET01cclxuICAgIGNvbnN0IHNjcmlwdEVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldEVsZW1JZChnbG9iYWxWYXIpKTtcclxuXHJcbiAgICBpZiAoc2NyaXB0RWxlbSkge1xyXG4gICAgICAgIHNjcmlwdEVsZW0ucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRRdWVyeVN0cmluZyhxdWVyeVBhcmFtczogSVF1ZXJ5UGFyYW1bXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgcXVlcnlTdHJpbmcgPSAnJztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UGFyYW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW1zW2ldO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9ICc/JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSAnJic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBxdWVyeVN0cmluZyArPSBgJHtxdWVyeVBhcmFtLm5hbWV9PSR7cXVlcnlQYXJhbS52YWx1ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBxdWVyeVN0cmluZztcclxuICB9XHJcbn1cclxuIl19