@techextensor/tab-sdk 0.0.3 → 0.0.6
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.
- package/esm2022/lib/app/analytics.service.mjs +51 -0
- package/esm2022/lib/app/app.service.mjs +145 -0
- package/esm2022/lib/app/file.service.mjs +41 -0
- package/esm2022/lib/app/release.service.mjs +38 -0
- package/esm2022/lib/app/report.service.mjs +48 -0
- package/esm2022/lib/app/translator.service.mjs +77 -0
- package/esm2022/lib/auth/auth.service.mjs +95 -0
- package/esm2022/lib/crud/crud.service.mjs +161 -0
- package/esm2022/lib/enum/store.enum.mjs +6 -0
- package/esm2022/lib/enum/ui.enum.mjs +13 -0
- package/esm2022/lib/http/http.service.mjs +58 -0
- package/esm2022/lib/interface/http.interface.mjs +2 -0
- package/esm2022/lib/interface/ui.interface.mjs +2 -0
- package/esm2022/lib/store/store.service.mjs +719 -0
- package/esm2022/lib/tab-sdk.service.mjs +52 -18
- package/esm2022/lib/ui/form.service.mjs +58 -76
- package/esm2022/lib/ui/ui.service.mjs +297 -2
- package/esm2022/lib/util/util.service.mjs +53 -0
- package/esm2022/lib/workflow/transition.service.mjs +40 -0
- package/fesm2022/techextensor-tab-sdk.mjs +1855 -341
- package/fesm2022/techextensor-tab-sdk.mjs.map +1 -1
- package/lib/app/analytics.service.d.ts +28 -0
- package/lib/app/app.service.d.ts +81 -0
- package/lib/app/file.service.d.ts +22 -0
- package/lib/app/release.service.d.ts +23 -0
- package/lib/app/report.service.d.ts +28 -0
- package/lib/app/translator.service.d.ts +49 -0
- package/lib/auth/auth.service.d.ts +58 -0
- package/lib/crud/crud.service.d.ts +88 -0
- package/lib/enum/store.enum.d.ts +4 -0
- package/lib/enum/ui.enum.d.ts +10 -0
- package/lib/http/http.service.d.ts +35 -0
- package/lib/interface/http.interface.d.ts +8 -0
- package/lib/interface/ui.interface.d.ts +24 -0
- package/lib/store/store.service.d.ts +406 -0
- package/lib/tab-sdk.service.d.ts +24 -8
- package/lib/ui/form.service.d.ts +35 -44
- package/lib/ui/ui.service.d.ts +154 -0
- package/lib/util/util.service.d.ts +14 -0
- package/lib/workflow/transition.service.d.ts +21 -0
- package/package.json +2 -2
- package/esm2022/lib/common/utils.service.mjs +0 -163
- package/esm2022/lib/core/auth.service.mjs +0 -48
- package/esm2022/lib/data/data.service.mjs +0 -81
- package/lib/common/utils.service.d.ts +0 -58
- package/lib/core/auth.service.d.ts +0 -28
- package/lib/data/data.service.d.ts +0 -36
|
@@ -1,6 +1,301 @@
|
|
|
1
|
-
import { Injectable } from
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { NavigationType, ScreenDisplayMode } from '../enum/ui.enum';
|
|
3
|
+
import { TabSdk } from '../tab-sdk.service';
|
|
4
|
+
import { ConfirmationService, NotificationService, NotificationType } from '@techextensor/tab-core-utility';
|
|
2
5
|
import * as i0 from "@angular/core";
|
|
3
6
|
export class UiService {
|
|
7
|
+
_notificationService = inject(NotificationService);
|
|
8
|
+
_confirmationService = inject(ConfirmationService);
|
|
9
|
+
/**
|
|
10
|
+
* Open a screen with the given options. The mode determines how the screen is
|
|
11
|
+
* displayed.
|
|
12
|
+
*
|
|
13
|
+
* @param options The options for opening the screen.
|
|
14
|
+
*/
|
|
15
|
+
openScreen(options) {
|
|
16
|
+
const { mode, screenId, reqtokens, submission, title, width, height, customClass } = options;
|
|
17
|
+
switch (mode) {
|
|
18
|
+
case ScreenDisplayMode.Sidebar:
|
|
19
|
+
this.showSidebar({ screenId, reqtokens, submission, title, width, height, customClass });
|
|
20
|
+
break;
|
|
21
|
+
case ScreenDisplayMode.Popup:
|
|
22
|
+
this.showDialog({ screenId, reqtokens, submission, title, width, height, customClass });
|
|
23
|
+
break;
|
|
24
|
+
case ScreenDisplayMode.SameTab:
|
|
25
|
+
this.navigateTo({ screenId, reqtokens });
|
|
26
|
+
break;
|
|
27
|
+
case ScreenDisplayMode.NewTab:
|
|
28
|
+
this.openInNewTab({ screenId, reqtokens });
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Opens a screen in a sidebar.
|
|
34
|
+
*
|
|
35
|
+
* @param options The options for opening the sidebar.
|
|
36
|
+
*/
|
|
37
|
+
showSidebar(options) {
|
|
38
|
+
const otherConfiguration = {
|
|
39
|
+
...(options.title && { title: options.title }),
|
|
40
|
+
...(options.width && { width: options.width }),
|
|
41
|
+
...(options.height && { height: options.height }),
|
|
42
|
+
...(options.customClass && { customClass: options.customClass })
|
|
43
|
+
};
|
|
44
|
+
TabSdk.util?.openScreen(ScreenDisplayMode.Sidebar, options.screenId, options.reqtokens || undefined, options.submission || undefined, Object.keys(otherConfiguration).length > 0 ? otherConfiguration : undefined);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Opens a screen in a popup dialog.
|
|
48
|
+
*
|
|
49
|
+
* @param options The options for opening the dialog.
|
|
50
|
+
*/
|
|
51
|
+
showDialog(options) {
|
|
52
|
+
const otherConfiguration = {
|
|
53
|
+
...(options.title && { title: options.title }),
|
|
54
|
+
...(options.width && { width: options.width }),
|
|
55
|
+
...(options.height && { height: options.height }),
|
|
56
|
+
...(options.customClass && { customClass: options.customClass })
|
|
57
|
+
};
|
|
58
|
+
TabSdk.util?.openScreen(ScreenDisplayMode.Popup, options.screenId, options.reqtokens || undefined, options.submission || undefined, Object.keys(otherConfiguration).length > 0 ? otherConfiguration : undefined);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Navigates to a screen within the same tab.
|
|
62
|
+
*
|
|
63
|
+
* @param options - The options for navigation, including screenId and optional reqtokens.
|
|
64
|
+
*/
|
|
65
|
+
navigateTo(options) {
|
|
66
|
+
TabSdk.util?.openScreen(ScreenDisplayMode.SameTab, options.screenId, options.reqtokens || undefined);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Navigates to a screen in a new tab.
|
|
70
|
+
*
|
|
71
|
+
* @param options The options for navigation, including screenId and optional reqtokens.
|
|
72
|
+
*/
|
|
73
|
+
openInNewTab(options) {
|
|
74
|
+
TabSdk.util?.openScreen(ScreenDisplayMode.NewTab, options.screenId, options.reqtokens || undefined);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Navigates to the specified URL.
|
|
78
|
+
*
|
|
79
|
+
* @param url - The URL to navigate to.
|
|
80
|
+
*/
|
|
81
|
+
navigateToUrl(url) {
|
|
82
|
+
TabSdk.util?.navigateToUrl({
|
|
83
|
+
url,
|
|
84
|
+
type: NavigationType.NavigateToUrl
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Navigates to a specified subdomain using the provided options.
|
|
89
|
+
*
|
|
90
|
+
* @param options - The options for navigation, including subDomain, appCode, and url.
|
|
91
|
+
*/
|
|
92
|
+
navigateToSubdomain(options) {
|
|
93
|
+
TabSdk.util?.navigateToUrl({
|
|
94
|
+
...options,
|
|
95
|
+
type: NavigationType.NavigateToUrl
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Retrieves the active screen ID from the current URL.
|
|
100
|
+
*
|
|
101
|
+
* @returns The screen ID if present in the URL, otherwise undefined.
|
|
102
|
+
*/
|
|
103
|
+
getActiveUrlScreenId() {
|
|
104
|
+
// Split the URL pathname using the app name and '/screen/' as delimiters
|
|
105
|
+
const urlParts = window?.location?.pathname?.split(TabSdk.store.appName + '/screen/');
|
|
106
|
+
// Extract the screen ID part and remove any query parameters
|
|
107
|
+
const screenId = urlParts?.[1]?.split('?')[0];
|
|
108
|
+
// Return the screen ID or undefined if not found
|
|
109
|
+
return screenId;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Show a notification to the user.
|
|
113
|
+
*
|
|
114
|
+
* @param options The options for the notification.
|
|
115
|
+
*/
|
|
116
|
+
notify(options) {
|
|
117
|
+
this._notificationService.notify({
|
|
118
|
+
type: options.type,
|
|
119
|
+
message: TabSdk.translator.translate(options.message),
|
|
120
|
+
...(options?.title ? { title: TabSdk.translator.translate(options.title) } : {}),
|
|
121
|
+
...(options?.configuration ? { configuration: options.configuration } : {}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Displays a success notification to the user.
|
|
126
|
+
*
|
|
127
|
+
* @param options - The options for the notification, including message, title, and configuration.
|
|
128
|
+
*/
|
|
129
|
+
showSuccess(options) {
|
|
130
|
+
this.notify({
|
|
131
|
+
...options,
|
|
132
|
+
type: NotificationType.Success,
|
|
133
|
+
title: options?.title ?? 'Success'
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Displays a warning notification to the user.
|
|
138
|
+
*
|
|
139
|
+
* @param options - The options for the notification, including message, title, and configuration.
|
|
140
|
+
*/
|
|
141
|
+
showWarning(options) {
|
|
142
|
+
this.notify({
|
|
143
|
+
...options,
|
|
144
|
+
type: NotificationType.Warning,
|
|
145
|
+
title: options?.title ?? 'Warning'
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Displays an info notification to the user.
|
|
150
|
+
*
|
|
151
|
+
* @param options - The options for the notification, including message, title, and configuration.
|
|
152
|
+
*/
|
|
153
|
+
showInfo(options) {
|
|
154
|
+
this.notify({
|
|
155
|
+
...options,
|
|
156
|
+
type: NotificationType.Info,
|
|
157
|
+
title: options?.title ?? 'Info'
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Displays an error notification to the user.
|
|
162
|
+
*
|
|
163
|
+
* @param options - The options for the notification, including message, title, and configuration.
|
|
164
|
+
*/
|
|
165
|
+
showError(options) {
|
|
166
|
+
this.notify({
|
|
167
|
+
...options,
|
|
168
|
+
type: NotificationType.Error,
|
|
169
|
+
title: options?.title ?? 'Error'
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Displays a confirmation dialog to the user and returns a promise that resolves
|
|
174
|
+
* to a boolean indicating whether the user confirmed the action.
|
|
175
|
+
*
|
|
176
|
+
* @param options - The options for the confirmation dialog, including title, message,
|
|
177
|
+
* confirmText, cancelText, and visibility of buttons.
|
|
178
|
+
* @returns A promise that resolves to true if the user confirms, false otherwise.
|
|
179
|
+
*/
|
|
180
|
+
confirm(options) {
|
|
181
|
+
return new Promise((resolve) => {
|
|
182
|
+
this._confirmationService.confirm(options)
|
|
183
|
+
?.subscribe((isConfirmed) => {
|
|
184
|
+
resolve(isConfirmed);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Displays a confirmation dialog to the user with a title and message that indicates
|
|
190
|
+
* the user is about to delete an item. The confirmation dialog has a "Delete" and "Cancel"
|
|
191
|
+
* button.
|
|
192
|
+
*
|
|
193
|
+
* @param options - The options for the confirmation dialog, including the item name and
|
|
194
|
+
* optional message.
|
|
195
|
+
* @returns A promise that resolves to true if the user confirms, false otherwise.
|
|
196
|
+
*/
|
|
197
|
+
confirmDelete(options) {
|
|
198
|
+
return this.confirm({
|
|
199
|
+
title: options?.title ?? `Are you sure you want to delete this record`,
|
|
200
|
+
message: options?.message ?? `You are about to delete the selected record. Are you sure you want to proceed?`,
|
|
201
|
+
primaryOption: 'Delete',
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Displays a confirmation dialog to the user with a title and message that indicates
|
|
206
|
+
* the user is about to discard changes to an item. The confirmation dialog has a "Discard"
|
|
207
|
+
* and "Cancel" button.
|
|
208
|
+
*
|
|
209
|
+
* @param options - The options for the confirmation dialog, including the item name and
|
|
210
|
+
* optional message.
|
|
211
|
+
* @returns A promise that resolves to true if the user confirms, false otherwise.
|
|
212
|
+
*/
|
|
213
|
+
confirmDiscard(options) {
|
|
214
|
+
return this.confirm({
|
|
215
|
+
title: `Are you sure you want to discard your changes`,
|
|
216
|
+
message: options?.message ?? `You are about to discard your changes. Are you sure you want to proceed?`,
|
|
217
|
+
primaryOption: 'Discard',
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Closes the confirmation dialog.
|
|
222
|
+
*
|
|
223
|
+
* This method can be used to manually close the confirmation dialog.
|
|
224
|
+
*/
|
|
225
|
+
closeConfirmationDialog() {
|
|
226
|
+
// Close the confirmation dialog
|
|
227
|
+
this._confirmationService.closeDialog();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Retrieves the confirmation emitter from the confirmation service.
|
|
231
|
+
*
|
|
232
|
+
* @returns The confirmation emitter used for emitting confirmation events.
|
|
233
|
+
*/
|
|
234
|
+
getConformationEmitter() {
|
|
235
|
+
return this._confirmationService.getConformationEmitter();
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Retrieves the dialog emitter from the confirmation service.
|
|
239
|
+
*
|
|
240
|
+
* The dialog emitter is an RxJS Subject that emits whenever a confirmation dialog is
|
|
241
|
+
* opened or closed. The value emitted is a boolean indicating whether a dialog is
|
|
242
|
+
* currently open.
|
|
243
|
+
*
|
|
244
|
+
* @returns The dialog emitter used for emitting confirmation dialog events.
|
|
245
|
+
*/
|
|
246
|
+
getDialogEmitter() {
|
|
247
|
+
return this._confirmationService.getDialogEmitter();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Retrieves the remove emitter from the confirmation service.
|
|
251
|
+
*
|
|
252
|
+
* The remove emitter is an RxJS Subject that emits whenever a removal confirmation
|
|
253
|
+
* dialog is opened or closed. The value emitted is a boolean indicating whether a
|
|
254
|
+
* removal dialog is currently open.
|
|
255
|
+
*
|
|
256
|
+
* @returns The remove emitter used for emitting removal confirmation dialog events.
|
|
257
|
+
*/
|
|
258
|
+
getRemoveEmitter() {
|
|
259
|
+
return this._confirmationService.getRemoveEmitter();
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Copies the provided text to the clipboard and displays a success notification.
|
|
263
|
+
*
|
|
264
|
+
* @param text - The text to be copied to the clipboard.
|
|
265
|
+
*/
|
|
266
|
+
copyToClipboard(text) {
|
|
267
|
+
// Create a temporary input element to hold the text
|
|
268
|
+
const tempInput = document.createElement("input");
|
|
269
|
+
// Set the input's value to the text to be copied
|
|
270
|
+
tempInput.value = text;
|
|
271
|
+
// Append the temporary input to the document body
|
|
272
|
+
document.body.appendChild(tempInput);
|
|
273
|
+
// Select the text in the input element
|
|
274
|
+
tempInput.select();
|
|
275
|
+
// Execute the copy command
|
|
276
|
+
document.execCommand("copy");
|
|
277
|
+
// Remove the temporary input from the document body
|
|
278
|
+
document.body.removeChild(tempInput);
|
|
279
|
+
// Show a success notification
|
|
280
|
+
this.showSuccess({
|
|
281
|
+
message: "",
|
|
282
|
+
title: "Copied to clipboard!",
|
|
283
|
+
configuration: {
|
|
284
|
+
timeOut: 1000,
|
|
285
|
+
positionClass: 'toast-top-center',
|
|
286
|
+
easing: 'ease-in',
|
|
287
|
+
easeTime: 300,
|
|
288
|
+
extendedTimeOut: 2000,
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Copies the current URL to the clipboard and displays a success notification.
|
|
294
|
+
*/
|
|
295
|
+
copyCurrentUrlToClipboard() {
|
|
296
|
+
// Use the copyToClipboard method to copy the current window URL
|
|
297
|
+
this.copyToClipboard(window.location.href);
|
|
298
|
+
}
|
|
4
299
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
5
300
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UiService, providedIn: 'root' });
|
|
6
301
|
}
|
|
@@ -10,4 +305,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
10
305
|
providedIn: 'root'
|
|
11
306
|
}]
|
|
12
307
|
}] });
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYi1zZGsvc3JjL2xpYi91aS91aS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxTQUFTO3dHQUFULFNBQVM7NEdBQVQsU0FBUyxjQUZOLE1BQU07OzRGQUVULFNBQVM7a0JBSHJCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVWlTZXJ2aWNlIHt9Il19
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYi1zZGsvc3JjL2xpYi91aS91aS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBT25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFnRCxtQkFBbUIsRUFBdUIsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFLL0ssTUFBTSxPQUFPLFNBQVM7SUFDRCxvQkFBb0IsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDeEUsb0JBQW9CLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXpGOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLE9BQTBCO1FBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTdGLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDWCxLQUFLLGlCQUFpQixDQUFDLE9BQU87Z0JBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RixNQUFNO1lBRVYsS0FBSyxpQkFBaUIsQ0FBQyxLQUFLO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFF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cnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgU2NyZWVuT3Blbk9wdGlvbnMsXG4gICAgTmF2aWdhdGlvbk9wdGlvbnMsXG4gICAgQmFzZVNjcmVlbk9wdGlvbnMsXG4gICAgTmF2aWdhdGVUb1N1YmRvbWFpbk9wdGlvbnNcbn0gZnJvbSAnLi4vaW50ZXJmYWNlL3VpLmludGVyZmFjZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uVHlwZSwgU2NyZWVuRGlzcGxheU1vZGUgfSBmcm9tICcuLi9lbnVtL3VpLmVudW0nO1xuaW1wb3J0IHsgVGFiU2RrIH0gZnJvbSAnLi4vdGFiLXNkay5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VOb3RpZmljYXRpb25PcHRpb25zLCBDb25maXJtYXRpb25PcHRpb25zLCBDb25maXJtYXRpb25TZXJ2aWNlLCBOb3RpZmljYXRpb25PcHRpb25zLCBOb3RpZmljYXRpb25TZXJ2aWNlLCBOb3RpZmljYXRpb25UeXBlIH0gZnJvbSAnQHRlY2hleHRlbnNvci90YWItY29yZS11dGlsaXR5JztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVaVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX25vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSA9IGluamVjdChDb25maXJtYXRpb25TZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBzY3JlZW4gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4gVGhlIG1vZGUgZGV0ZXJtaW5lcyBob3cgdGhlIHNjcmVlbiBpc1xuICAgICAqIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciBvcGVuaW5nIHRoZSBzY3JlZW4uXG4gICAgICovXG4gICAgb3BlblNjcmVlbihvcHRpb25zOiBTY3JlZW5PcGVuT3B0aW9ucyk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IG1vZGUsIHNjcmVlbklkLCByZXF0b2tlbnMsIHN1Ym1pc3Npb24sIHRpdGxlLCB3aWR0aCwgaGVpZ2h0LCBjdXN0b21DbGFzcyB9ID0gb3B0aW9ucztcblxuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NyZWVuRGlzcGxheU1vZGUuU2lkZWJhcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTaWRlYmFyKHsgc2NyZWVuSWQsIHJlcXRva2Vucywgc3VibWlzc2lvbiwgdGl0bGUsIHdpZHRoLCBoZWlnaHQsIGN1c3RvbUNsYXNzIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNjcmVlbkRpc3BsYXlNb2RlLlBvcHVwOlxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RpYWxvZyh7IHNjcmVlbklkLCByZXF0b2tlbnMsIHN1Ym1pc3Npb24sIHRpdGxlLCB3aWR0aCwgaGVpZ2h0LCBjdXN0b21DbGFzcyB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTY3JlZW5EaXNwbGF5TW9kZS5TYW1lVGFiOlxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyh7IHNjcmVlbklkLCByZXF0b2tlbnMgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2NyZWVuRGlzcGxheU1vZGUuTmV3VGFiOlxuICAgICAgICAgICAgICAgIHRoaXMub3BlbkluTmV3VGFiKHsgc2NyZWVuSWQsIHJlcXRva2VucyB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgc2NyZWVuIGluIGEgc2lkZWJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciBvcGVuaW5nIHRoZSBzaWRlYmFyLlxuICAgICAqL1xuICAgIHNob3dTaWRlYmFyKG9wdGlvbnM6IEJhc2VTY3JlZW5PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG90aGVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgIC4uLihvcHRpb25zLnRpdGxlICYmIHsgdGl0bGU6IG9wdGlvbnMudGl0bGUgfSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy53aWR0aCAmJiB7IHdpZHRoOiBvcHRpb25zLndpZHRoIH0pLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMuaGVpZ2h0ICYmIHsgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCB9KSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zLmN1c3RvbUNsYXNzICYmIHsgY3VzdG9tQ2xhc3M6IG9wdGlvbnMuY3VzdG9tQ2xhc3MgfSlcbiAgICAgICAgfTtcblxuICAgICAgICBUYWJTZGsudXRpbD8ub3BlblNjcmVlbihcbiAgICAgICAgICAgIFNjcmVlbkRpc3BsYXlNb2RlLlNpZGViYXIsXG4gICAgICAgICAgICBvcHRpb25zLnNjcmVlbklkLFxuICAgICAgICAgICAgb3B0aW9ucy5yZXF0b2tlbnMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3B0aW9ucy5zdWJtaXNzaW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG90aGVyQ29uZmlndXJhdGlvbikubGVuZ3RoID4gMCA/IG90aGVyQ29uZmlndXJhdGlvbiA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgc2NyZWVuIGluIGEgcG9wdXAgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIG9wZW5pbmcgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBzaG93RGlhbG9nKG9wdGlvbnM6IEJhc2VTY3JlZW5PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG90aGVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgIC4uLihvcHRpb25zLnRpdGxlICYmIHsgdGl0bGU6IG9wdGlvbnMudGl0bGUgfSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy53aWR0aCAmJiB7IHdpZHRoOiBvcHRpb25zLndpZHRoIH0pLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMuaGVpZ2h0ICYmIHsgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCB9KSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zLmN1c3RvbUNsYXNzICYmIHsgY3VzdG9tQ2xhc3M6IG9wdGlvbnMuY3VzdG9tQ2xhc3MgfSlcbiAgICAgICAgfTtcblxuICAgICAgICBUYWJTZGsudXRpbD8ub3BlblNjcmVlbihcbiAgICAgICAgICAgIFNjcmVlbkRpc3BsYXlNb2RlLlBvcHVwLFxuICAgICAgICAgICAgb3B0aW9ucy5zY3JlZW5JZCxcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdG9rZW5zIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9wdGlvbnMuc3VibWlzc2lvbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvdGhlckNvbmZpZ3VyYXRpb24pLmxlbmd0aCA+IDAgPyBvdGhlckNvbmZpZ3VyYXRpb24gOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gYSBzY3JlZW4gd2l0aGluIHRoZSBzYW1lIHRhYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIG5hdmlnYXRpb24sIGluY2x1ZGluZyBzY3JlZW5JZCBhbmQgb3B0aW9uYWwgcmVxdG9rZW5zLlxuICAgICAqL1xuICAgIG5hdmlnYXRlVG8ob3B0aW9uczogTmF2aWdhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgVGFiU2RrLnV0aWw/Lm9wZW5TY3JlZW4oXG4gICAgICAgICAgICBTY3JlZW5EaXNwbGF5TW9kZS5TYW1lVGFiLFxuICAgICAgICAgICAgb3B0aW9ucy5zY3JlZW5JZCxcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdG9rZW5zIHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHNjcmVlbiBpbiBhIG5ldyB0YWIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgbmF2aWdhdGlvbiwgaW5jbHVkaW5nIHNjcmVlbklkIGFuZCBvcHRpb25hbCByZXF0b2tlbnMuXG4gICAgICovXG4gICAgb3BlbkluTmV3VGFiKG9wdGlvbnM6IE5hdmlnYXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIFRhYlNkay51dGlsPy5vcGVuU2NyZWVuKFxuICAgICAgICAgICAgU2NyZWVuRGlzcGxheU1vZGUuTmV3VGFiLFxuICAgICAgICAgICAgb3B0aW9ucy5zY3JlZW5JZCxcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdG9rZW5zIHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG5hdmlnYXRlIHRvLlxuICAgICAqL1xuICAgIG5hdmlnYXRlVG9VcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgVGFiU2RrLnV0aWw/Lm5hdmlnYXRlVG9Vcmwoe1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgdHlwZTogTmF2aWdhdGlvblR5cGUuTmF2aWdhdGVUb1VybFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmllZCBzdWJkb21haW4gdXNpbmcgdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBuYXZpZ2F0aW9uLCBpbmNsdWRpbmcgc3ViRG9tYWluLCBhcHBDb2RlLCBhbmQgdXJsLlxuICAgICAqL1xuICAgIG5hdmlnYXRlVG9TdWJkb21haW4ob3B0aW9uczogTmF2aWdhdGVUb1N1YmRvbWFpbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgVGFiU2RrLnV0aWw/Lm5hdmlnYXRlVG9Vcmwoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHR5cGU6IE5hdmlnYXRpb25UeXBlLk5hdmlnYXRlVG9VcmxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjdGl2ZSBzY3JlZW4gSUQgZnJvbSB0aGUgY3VycmVudCBVUkwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIElEIGlmIHByZXNlbnQgaW4gdGhlIFVSTCwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBnZXRBY3RpdmVVcmxTY3JlZW5JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBTcGxpdCB0aGUgVVJMIHBhdGhuYW1lIHVzaW5nIHRoZSBhcHAgbmFtZSBhbmQgJy9zY3JlZW4vJyBhcyBkZWxpbWl0ZXJzXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gd2luZG93Py5sb2NhdGlvbj8ucGF0aG5hbWU/LnNwbGl0KFRhYlNkay5zdG9yZS5hcHBOYW1lICsgJy9zY3JlZW4vJyk7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHNjcmVlbiBJRCBwYXJ0IGFuZCByZW1vdmUgYW55IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3Qgc2NyZWVuSWQgPSB1cmxQYXJ0cz8uWzFdPy5zcGxpdCgnPycpWzBdO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHNjcmVlbiBJRCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAgICAgIHJldHVybiBzY3JlZW5JZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGEgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24uXG4gICAgICovXG4gICAgbm90aWZ5KG9wdGlvbnM6IE5vdGlmaWNhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uU2VydmljZS5ub3RpZnkoe1xuICAgICAgICAgICAgdHlwZTogb3B0aW9ucy50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogVGFiU2RrLnRyYW5zbGF0b3IudHJhbnNsYXRlKG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucz8udGl0bGUgPyB7IHRpdGxlOiBUYWJTZGsudHJhbnNsYXRvci50cmFuc2xhdGUob3B0aW9ucy50aXRsZSkgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zPy5jb25maWd1cmF0aW9uID8geyBjb25maWd1cmF0aW9uOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24gfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBzdWNjZXNzIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24sIGluY2x1ZGluZyBtZXNzYWdlLCB0aXRsZSwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgc2hvd1N1Y2Nlc3Mob3B0aW9uczogQmFzZU5vdGlmaWNhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzcyxcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyAnU3VjY2VzcydcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSB3YXJuaW5nIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24sIGluY2x1ZGluZyBtZXNzYWdlLCB0aXRsZSwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgc2hvd1dhcm5pbmcob3B0aW9uczogQmFzZU5vdGlmaWNhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuV2FybmluZyxcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyAnV2FybmluZydcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gaW5mbyBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgbm90aWZpY2F0aW9uLCBpbmNsdWRpbmcgbWVzc2FnZSwgdGl0bGUsIGFuZCBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHNob3dJbmZvKG9wdGlvbnM6IEJhc2VOb3RpZmljYXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkluZm8sXG4gICAgICAgICAgICB0aXRsZTogb3B0aW9ucz8udGl0bGUgPz8gJ0luZm8nXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGFuIGVycm9yIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24sIGluY2x1ZGluZyBtZXNzYWdlLCB0aXRsZSwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgc2hvd0Vycm9yKG9wdGlvbnM6IEJhc2VOb3RpZmljYXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgdGl0bGU6IG9wdGlvbnM/LnRpdGxlID8/ICdFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIHRoZSB1c2VyIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gICAgICogdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdXNlciBjb25maXJtZWQgdGhlIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLCBpbmNsdWRpbmcgdGl0bGUsIG1lc3NhZ2UsXG4gICAgICogY29uZmlybVRleHQsIGNhbmNlbFRleHQsIGFuZCB2aXNpYmlsaXR5IG9mIGJ1dHRvbnMuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXNlciBjb25maXJtcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGNvbmZpcm0ob3B0aW9ucz86IENvbmZpcm1hdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0ob3B0aW9ucylcbiAgICAgICAgICAgICAgICA/LnN1YnNjcmliZSgoaXNDb25maXJtZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpc0NvbmZpcm1lZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgY29uZmlybWF0aW9uIGRpYWxvZyB0byB0aGUgdXNlciB3aXRoIGEgdGl0bGUgYW5kIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXNcbiAgICAgKiB0aGUgdXNlciBpcyBhYm91dCB0byBkZWxldGUgYW4gaXRlbS4gVGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgaGFzIGEgXCJEZWxldGVcIiBhbmQgXCJDYW5jZWxcIlxuICAgICAqIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLCBpbmNsdWRpbmcgdGhlIGl0ZW0gbmFtZSBhbmRcbiAgICAgKiBvcHRpb25hbCBtZXNzYWdlLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVzZXIgY29uZmlybXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25maXJtRGVsZXRlKG9wdGlvbnM/OiBDb25maXJtYXRpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpcm0oe1xuICAgICAgICAgICAgdGl0bGU6IG9wdGlvbnM/LnRpdGxlID8/IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcmVjb3JkYCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgPz8gYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCByZWNvcmQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkP2AsXG4gICAgICAgICAgICBwcmltYXJ5T3B0aW9uOiAnRGVsZXRlJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIHRoZSB1c2VyIHdpdGggYSB0aXRsZSBhbmQgbWVzc2FnZSB0aGF0IGluZGljYXRlc1xuICAgICAqIHRoZSB1c2VyIGlzIGFib3V0IHRvIGRpc2NhcmQgY2hhbmdlcyB0byBhbiBpdGVtLiBUaGUgY29uZmlybWF0aW9uIGRpYWxvZyBoYXMgYSBcIkRpc2NhcmRcIlxuICAgICAqIGFuZCBcIkNhbmNlbFwiIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLCBpbmNsdWRpbmcgdGhlIGl0ZW0gbmFtZSBhbmRcbiAgICAgKiBvcHRpb25hbCBtZXNzYWdlLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVzZXIgY29uZmlybXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25maXJtRGlzY2FyZChvcHRpb25zPzogQ29uZmlybWF0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maXJtKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRpc2NhcmQgeW91ciBjaGFuZ2VzYCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgPz8gYFlvdSBhcmUgYWJvdXQgdG8gZGlzY2FyZCB5b3VyIGNoYW5nZXMuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkP2AsXG4gICAgICAgICAgICBwcmltYXJ5T3B0aW9uOiAnRGlzY2FyZCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29uZmlybWF0aW9uIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG1hbnVhbGx5IGNsb3NlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgICAqL1xuICAgIGNsb3NlQ29uZmlybWF0aW9uRGlhbG9nKCkge1xuICAgICAgICAvLyBDbG9zZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAgICB0aGlzLl9jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjb25maXJtYXRpb24gZW1pdHRlciBmcm9tIHRoZSBjb25maXJtYXRpb24gc2VydmljZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgY29uZmlybWF0aW9uIGVtaXR0ZXIgdXNlZCBmb3IgZW1pdHRpbmcgY29uZmlybWF0aW9uIGV2ZW50cy5cbiAgICAgKi9cbiAgICBnZXRDb25mb3JtYXRpb25FbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5nZXRDb25mb3JtYXRpb25FbWl0dGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBkaWFsb2cgZW1pdHRlciBmcm9tIHRoZSBjb25maXJtYXRpb24gc2VydmljZS5cbiAgICAgKlxuICAgICAqIFRoZSBkaWFsb2cgZW1pdHRlciBpcyBhbiBSeEpTIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuZXZlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgaXNcbiAgICAgKiBvcGVuZWQgb3IgY2xvc2VkLiBUaGUgdmFsdWUgZW1pdHRlZCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZGlhbG9nIGlzXG4gICAgICogY3VycmVudGx5IG9wZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgZGlhbG9nIGVtaXR0ZXIgdXNlZCBmb3IgZW1pdHRpbmcgY29uZmlybWF0aW9uIGRpYWxvZyBldmVudHMuXG4gICAgICovXG4gICAgZ2V0RGlhbG9nRW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpcm1hdGlvblNlcnZpY2UuZ2V0RGlhbG9nRW1pdHRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgcmVtb3ZlIGVtaXR0ZXIgZnJvbSB0aGUgY29uZmlybWF0aW9uIHNlcnZpY2UuXG4gICAgICogXG4gICAgICogVGhlIHJlbW92ZSBlbWl0dGVyIGlzIGFuIFJ4SlMgU3ViamVjdCB0aGF0IGVtaXRzIHdoZW5ldmVyIGEgcmVtb3ZhbCBjb25maXJtYXRpb25cbiAgICAgKiBkaWFsb2cgaXMgb3BlbmVkIG9yIGNsb3NlZC4gVGhlIHZhbHVlIGVtaXR0ZWQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhXG4gICAgICogcmVtb3ZhbCBkaWFsb2cgaXMgY3VycmVudGx5IG9wZW4uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHJlbW92ZSBlbWl0dGVyIHVzZWQgZm9yIGVtaXR0aW5nIHJlbW92YWwgY29uZmlybWF0aW9uIGRpYWxvZyBldmVudHMuXG4gICAgICovXG4gICAgZ2V0UmVtb3ZlRW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpcm1hdGlvblNlcnZpY2UuZ2V0UmVtb3ZlRW1pdHRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgcHJvdmlkZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkIGFuZCBkaXNwbGF5cyBhIHN1Y2Nlc3Mgbm90aWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBiZSBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC5cbiAgICAgKi9cbiAgICBjb3B5VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBpbnB1dCBlbGVtZW50IHRvIGhvbGQgdGhlIHRleHRcbiAgICAgICAgY29uc3QgdGVtcElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgaW5wdXQncyB2YWx1ZSB0byB0aGUgdGV4dCB0byBiZSBjb3BpZWRcbiAgICAgICAgdGVtcElucHV0LnZhbHVlID0gdGV4dDtcblxuICAgICAgICAvLyBBcHBlbmQgdGhlIHRlbXBvcmFyeSBpbnB1dCB0byB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBJbnB1dCk7XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSB0ZXh0IGluIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgIHRlbXBJbnB1dC5zZWxlY3QoKTtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBjb3B5IGNvbW1hbmRcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGlucHV0IGZyb20gdGhlIGRvY3VtZW50IGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wSW5wdXQpO1xuXG4gICAgICAgIC8vIFNob3cgYSBzdWNjZXNzIG5vdGlmaWNhdGlvblxuICAgICAgICB0aGlzLnNob3dTdWNjZXNzKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiXCIsXG4gICAgICAgICAgICB0aXRsZTogXCJDb3BpZWQgdG8gY2xpcGJvYXJkIVwiLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHRpbWVPdXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGFzczogJ3RvYXN0LXRvcC1jZW50ZXInLFxuICAgICAgICAgICAgICAgIGVhc2luZzogJ2Vhc2UtaW4nLFxuICAgICAgICAgICAgICAgIGVhc2VUaW1lOiAzMDAsXG4gICAgICAgICAgICAgICAgZXh0ZW5kZWRUaW1lT3V0OiAyMDAwLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIGN1cnJlbnQgVVJMIHRvIHRoZSBjbGlwYm9hcmQgYW5kIGRpc3BsYXlzIGEgc3VjY2VzcyBub3RpZmljYXRpb24uXG4gICAgICovXG4gICAgY29weUN1cnJlbnRVcmxUb0NsaXBib2FyZCgpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBjb3B5VG9DbGlwYm9hcmQgbWV0aG9kIHRvIGNvcHkgdGhlIGN1cnJlbnQgd2luZG93IFVSTFxuICAgICAgICB0aGlzLmNvcHlUb0NsaXBib2FyZCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgfVxufSJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class UtilService {
|
|
4
|
+
// Will store the services from context
|
|
5
|
+
_context = null;
|
|
6
|
+
_initialized = false;
|
|
7
|
+
/**
|
|
8
|
+
* Initializes the UtilService with context that contains service references
|
|
9
|
+
*
|
|
10
|
+
* @param context The context object containing service references
|
|
11
|
+
* @returns A proxy that intercepts and delegates method calls to the appropriate service
|
|
12
|
+
*/
|
|
13
|
+
init(context) {
|
|
14
|
+
if (this._initialized) {
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
this._context = context;
|
|
18
|
+
this._initialized = true;
|
|
19
|
+
// Return a proxy that will intercept method calls
|
|
20
|
+
return new Proxy(this, {
|
|
21
|
+
get: (target, prop) => {
|
|
22
|
+
// First check if the property exists directly on UtilService
|
|
23
|
+
if (prop in target) {
|
|
24
|
+
return target[prop];
|
|
25
|
+
}
|
|
26
|
+
// Convert symbol to string if needed
|
|
27
|
+
const propName = prop.toString();
|
|
28
|
+
// Check context services first
|
|
29
|
+
if (this._context && Object.keys(this._context).length > 0) {
|
|
30
|
+
// Loop through each service in the context
|
|
31
|
+
for (const serviceName of Object.keys(this._context)) {
|
|
32
|
+
const service = this._context[serviceName];
|
|
33
|
+
if (service && typeof service === 'object' && propName in service && typeof service[propName] === 'function') {
|
|
34
|
+
// Return the bound function from the service
|
|
35
|
+
return service[propName].bind(service);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// If property not found anywhere, return undefined
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
45
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilService, providedIn: 'root' });
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilService, decorators: [{
|
|
48
|
+
type: Injectable,
|
|
49
|
+
args: [{
|
|
50
|
+
providedIn: 'root'
|
|
51
|
+
}]
|
|
52
|
+
}] });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL3V0aWwvdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxXQUFXO0lBQ3BCLHVDQUF1QztJQUMvQixRQUFRLEdBQVEsSUFBSSxDQUFDO0lBQ3JCLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFN0I7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsT0FBWTtRQUNiLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixrREFBa0Q7UUFDbEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbkIsR0FBRyxFQUFFLENBQUMsTUFBVyxFQUFFLElBQXFCLEVBQUUsRUFBRTtnQkFDeEMsNkRBQTZEO2dCQUM3RCxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDakIsT0FBUSxNQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBRUQscUNBQXFDO2dCQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBRWpDLCtCQUErQjtnQkFDL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekQsMkNBQTJDO29CQUMzQyxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7d0JBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQzNDLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDOzRCQUMzRyw2Q0FBNkM7NEJBQzdDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDM0MsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsbURBQW1EO2dCQUNuRCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0E5Q1EsV0FBVzs0R0FBWCxXQUFXLGNBRlIsTUFBTTs7NEZBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVXRpbFNlcnZpY2Uge1xuICAgIC8vIFdpbGwgc3RvcmUgdGhlIHNlcnZpY2VzIGZyb20gY29udGV4dFxuICAgIHByaXZhdGUgX2NvbnRleHQ6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBVdGlsU2VydmljZSB3aXRoIGNvbnRleHQgdGhhdCBjb250YWlucyBzZXJ2aWNlIHJlZmVyZW5jZXNcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvYmplY3QgY29udGFpbmluZyBzZXJ2aWNlIHJlZmVyZW5jZXNcbiAgICAgKiBAcmV0dXJucyBBIHByb3h5IHRoYXQgaW50ZXJjZXB0cyBhbmQgZGVsZWdhdGVzIG1ldGhvZCBjYWxscyB0byB0aGUgYXBwcm9wcmlhdGUgc2VydmljZVxuICAgICAqL1xuICAgIGluaXQoY29udGV4dDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgLy8gUmV0dXJuIGEgcHJveHkgdGhhdCB3aWxsIGludGVyY2VwdCBtZXRob2QgY2FsbHNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICAgICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyBkaXJlY3RseSBvbiBVdGlsU2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc3ltYm9sIHRvIHN0cmluZyBpZiBuZWVkZWRcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHByb3AudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbnRleHQgc2VydmljZXMgZmlyc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29udGV4dCAmJiBPYmplY3Qua2V5cyh0aGlzLl9jb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHNlcnZpY2UgaW4gdGhlIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLl9jb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX2NvbnRleHRbc2VydmljZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgJiYgdHlwZW9mIHNlcnZpY2UgPT09ICdvYmplY3QnICYmIHByb3BOYW1lIGluIHNlcnZpY2UgJiYgdHlwZW9mIHNlcnZpY2VbcHJvcE5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBib3VuZCBmdW5jdGlvbiBmcm9tIHRoZSBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VbcHJvcE5hbWVdLmJpbmQoc2VydmljZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBwcm9wZXJ0eSBub3QgZm91bmQgYW55d2hlcmUsIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59Il19
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { TabBlueprintService } from '@techextensor/tab-core-utility';
|
|
3
|
+
import { firstValueFrom } from 'rxjs';
|
|
4
|
+
import { TabSdk } from '../tab-sdk.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class TransitionService {
|
|
7
|
+
_tabBlueprintService = inject(TabBlueprintService);
|
|
8
|
+
/**
|
|
9
|
+
* Retrieves the next status based on the provided payload.
|
|
10
|
+
*
|
|
11
|
+
* @param payload - The payload containing information to determine the next status.
|
|
12
|
+
* @returns A promise that resolves to the common API response.
|
|
13
|
+
*/
|
|
14
|
+
async getNextStatus(payload) {
|
|
15
|
+
// Await the response from the getNextStatus method of the tabBlueprintService
|
|
16
|
+
const response = await firstValueFrom(this._tabBlueprintService.getNextStatus(payload));
|
|
17
|
+
// Return the obtained response
|
|
18
|
+
return response;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Updates the status of an entity based on the provided payload.
|
|
22
|
+
*
|
|
23
|
+
* @param payload - The payload containing information to update the status.
|
|
24
|
+
* @returns A promise that resolves to the common API response.
|
|
25
|
+
*/
|
|
26
|
+
async updateStatus(payload) {
|
|
27
|
+
const response = await firstValueFrom(TabSdk.util?.updateStatus(payload));
|
|
28
|
+
// Return the obtained response
|
|
29
|
+
return response;
|
|
30
|
+
}
|
|
31
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
32
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionService, providedIn: 'root' });
|
|
33
|
+
}
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionService, decorators: [{
|
|
35
|
+
type: Injectable,
|
|
36
|
+
args: [{
|
|
37
|
+
providedIn: 'root'
|
|
38
|
+
}]
|
|
39
|
+
}] });
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL3dvcmtmbG93L3RyYW5zaXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQXdDLG1CQUFtQixFQUF1QixNQUFNLGdDQUFnQyxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUs1QyxNQUFNLE9BQU8saUJBQWlCO0lBQ1Qsb0JBQW9CLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXpGOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUEwQjtRQUMxQyw4RUFBOEU7UUFDOUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQ25ELENBQUM7UUFDRiwrQkFBK0I7UUFDL0IsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUMzQyxNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FDakMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQ3JDLENBQUM7UUFDRiwrQkFBK0I7UUFDL0IsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzt3R0E5QlEsaUJBQWlCOzRHQUFqQixpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgTmV4dFN0YXR1c1BheWxvYWQsIFRhYkJsdWVwcmludFNlcnZpY2UsIFVwZGF0ZVN0YXR1c1BheWxvYWQgfSBmcm9tICdAdGVjaGV4dGVuc29yL3RhYi1jb3JlLXV0aWxpdHknO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYlNkayB9IGZyb20gJy4uL3RhYi1zZGsuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvblNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkJsdWVwcmludFNlcnZpY2U6IFRhYkJsdWVwcmludFNlcnZpY2UgPSBpbmplY3QoVGFiQmx1ZXByaW50U2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG5leHQgc3RhdHVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXlsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgcGF5bG9hZCBjb250YWluaW5nIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgbmV4dCBzdGF0dXMuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbW1vbiBBUEkgcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TmV4dFN0YXR1cyhwYXlsb2FkOiBOZXh0U3RhdHVzUGF5bG9hZCk6IFByb21pc2U8Q29tbW9uQXBpUmVzcG9uc2U+IHtcbiAgICAgICAgLy8gQXdhaXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGdldE5leHRTdGF0dXMgbWV0aG9kIG9mIHRoZSB0YWJCbHVlcHJpbnRTZXJ2aWNlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLl90YWJCbHVlcHJpbnRTZXJ2aWNlLmdldE5leHRTdGF0dXMocGF5bG9hZClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBvYnRhaW5lZCByZXNwb25zZVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc3RhdHVzIG9mIGFuIGVudGl0eSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIC0gVGhlIHBheWxvYWQgY29udGFpbmluZyBpbmZvcm1hdGlvbiB0byB1cGRhdGUgdGhlIHN0YXR1cy5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tbW9uIEFQSSByZXNwb25zZS5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTdGF0dXMocGF5bG9hZDogVXBkYXRlU3RhdHVzUGF5bG9hZCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICBUYWJTZGsudXRpbD8udXBkYXRlU3RhdHVzKHBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICAgIC8vIFJldHVybiB0aGUgb2J0YWluZWQgcmVzcG9uc2VcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbn0iXX0=
|