@yuuvis/client-shell-core 0.6.5

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 (24) hide show
  1. package/esm2022/index.mjs +10 -0
  2. package/esm2022/lib/client-shell.assets.mjs +10 -0
  3. package/esm2022/lib/client-shell.interface.mjs +5 -0
  4. package/esm2022/lib/services/command-palette/command-palette/command-palette.component.mjs +175 -0
  5. package/esm2022/lib/services/command-palette/command-palette.interface.mjs +2 -0
  6. package/esm2022/lib/services/command-palette/command-palette.service.mjs +128 -0
  7. package/esm2022/lib/services/shell/shell.extentions.service.mjs +9 -0
  8. package/esm2022/lib/services/shell/shell.service.mjs +295 -0
  9. package/esm2022/lib/services/shell-notifications/shell-notifications.interface.mjs +2 -0
  10. package/esm2022/lib/services/shell-notifications/shell-notifications.service.mjs +89 -0
  11. package/esm2022/lib/tile-extension.interface.mjs +2 -0
  12. package/esm2022/yuuvis-client-shell-core.mjs +5 -0
  13. package/index.d.ts +9 -0
  14. package/lib/client-shell.assets.d.ts +8 -0
  15. package/lib/client-shell.interface.d.ts +55 -0
  16. package/lib/services/command-palette/command-palette/command-palette.component.d.ts +31 -0
  17. package/lib/services/command-palette/command-palette.interface.d.ts +16 -0
  18. package/lib/services/command-palette/command-palette.service.d.ts +41 -0
  19. package/lib/services/shell/shell.extentions.service.d.ts +2 -0
  20. package/lib/services/shell/shell.service.d.ts +124 -0
  21. package/lib/services/shell-notifications/shell-notifications.interface.d.ts +10 -0
  22. package/lib/services/shell-notifications/shell-notifications.service.d.ts +34 -0
  23. package/lib/tile-extension.interface.d.ts +12 -0
  24. package/package.json +27 -0
@@ -0,0 +1,295 @@
1
+ import { inject, Injectable, signal } from '@angular/core';
2
+ import { BaseObjectTypeField, DmsService, SystemService, TranslateService, UserService, Utils } from '@yuuvis/client-core';
3
+ import { YvcOverlayService } from '@yuuvis/components/overlay';
4
+ import { BehaviorSubject, debounceTime, filter, fromEvent, map, of, ReplaySubject, switchMap } from 'rxjs';
5
+ import { CLIENT_SHELL_ASSETS } from '../../client-shell.assets';
6
+ import * as i0 from "@angular/core";
7
+ export class ShellService {
8
+ constructor() {
9
+ this.#dmsService = inject(DmsService);
10
+ this.#overlay = inject(YvcOverlayService);
11
+ this.#system = inject(SystemService);
12
+ this.#userService = inject(UserService);
13
+ this.translate = inject(TranslateService);
14
+ this._busyCount = 0;
15
+ this.isBusySubject = new BehaviorSubject(false);
16
+ this.isBusy$ = this.isBusySubject.asObservable().pipe(debounceTime(500));
17
+ this.#appSettings = {};
18
+ this.#appSettingsSubject = new ReplaySubject();
19
+ this.appSettings$ = this.#appSettingsSubject.asObservable().pipe(debounceTime(500));
20
+ this.#appSchemata = [];
21
+ this.appBaseRoutes = {};
22
+ this.#defaultShellConfig = {
23
+ icons: {
24
+ appIcon: CLIENT_SHELL_ASSETS.icons?.appIcon,
25
+ logout: CLIENT_SHELL_ASSETS.icons?.logout,
26
+ settings: CLIENT_SHELL_ASSETS.icons?.settings,
27
+ notifications: CLIENT_SHELL_ASSETS.icons?.notifications
28
+ }
29
+ };
30
+ this.shellConfig = signal(this.#defaultShellConfig);
31
+ /** TODO: implement this feature ????
32
+ * Global shortcuts are captured by the shell to provide a consistent experience
33
+ * accross all apps. Search is one example. Apps should not define their own shourtcuts
34
+ * for search. Instead they should subscribe to the global shortcuts and initialize their
35
+ * search based on the global search shortcut.
36
+ */
37
+ this.globalShortcuts$ = fromEvent(document, 'keydown').pipe(map((e) => {
38
+ // global shortcut for search
39
+ // if (e.ctrlKey && e.code === 'KeyF') {
40
+ // e.preventDefault();
41
+ // return GlobalShortcut.search;
42
+ // }
43
+ return undefined;
44
+ }), filter((s) => s !== undefined), map((s) => s));
45
+ this._extensions = {};
46
+ this._objectFlavors = [];
47
+ this._objectCreateFlavors = [];
48
+ }
49
+ #dmsService;
50
+ #overlay;
51
+ #system;
52
+ #userService;
53
+ #appSettings;
54
+ #appSettingsSubject;
55
+ #appSchemata;
56
+ #defaultShellConfig;
57
+ setShellConfig(csc) {
58
+ this.shellConfig.update((sc) => ({
59
+ icons: {
60
+ appIcon: csc.icons?.appIcon ?? sc.icons?.appIcon,
61
+ logout: csc.icons?.logout ?? sc.icons?.logout,
62
+ settings: csc.icons?.settings ?? sc.icons?.settings,
63
+ notifications: csc.icons?.settings ?? sc.icons?.notifications
64
+ }
65
+ }));
66
+ }
67
+ setAppBaseRoutes(apps) {
68
+ apps.forEach((a) => (this.appBaseRoutes[a.id] = a.path || ''));
69
+ }
70
+ registerApp(schema) {
71
+ this.#appSchemata.push(schema);
72
+ }
73
+ getRegisteredApp(id) {
74
+ return this.#appSchemata.find((a) => a.id === id);
75
+ }
76
+ /**
77
+ * Register settings for apps to hook into shell settings page.
78
+ * These exposed settings will be saved in the users settings on the backend.
79
+ * @param appID ID of the app that exposes the settings
80
+ * @param cfg ShellAppSettings object containing the settings
81
+ */
82
+ registerAppSettings(appID, cfg) {
83
+ this.#appSettings[appID] = cfg;
84
+ this.#appSettingsSubject.next(this.#getAppSettings());
85
+ }
86
+ /**
87
+ * Load persisted settings for a specific app
88
+ * @param appID ID of the app to load the settings for
89
+ */
90
+ usersAppSettings$(appID) {
91
+ return this.#userService.user$.pipe(map((u) => {
92
+ return u && u.userSettings.clientAppSettings ? u.userSettings.clientAppSettings[appID] : undefined;
93
+ }));
94
+ }
95
+ saveUsersAppSettings(appID, settings) {
96
+ return this.#userService.saveUserSettings({ clientAppSettings: { [appID]: settings } });
97
+ }
98
+ #getAppSettings() {
99
+ return Object.keys(this.#appSettings)
100
+ .map((key) => ({
101
+ appID: this.#appSettings[key].appID,
102
+ label: this.#appSettings[key].label,
103
+ properties: this.#appSettings[key].properties
104
+ }))
105
+ .sort();
106
+ }
107
+ addBusy() {
108
+ if (this._busyCount === 0) {
109
+ this.isBusySubject.next(true);
110
+ }
111
+ this._busyCount++;
112
+ }
113
+ removeBusy() {
114
+ this._busyCount--;
115
+ if (this._busyCount === 0) {
116
+ this.isBusySubject.next(false);
117
+ }
118
+ }
119
+ exposeObjectCreateFlavors(flavors) {
120
+ flavors.forEach((flavor) => {
121
+ const idx = this._objectCreateFlavors.findIndex((f) => f.id === flavor.id);
122
+ if (idx === -1)
123
+ this._objectCreateFlavors.push(flavor);
124
+ });
125
+ }
126
+ concealObjectCreateFlavors(flavors) {
127
+ const fid = flavors.map((f) => f.id);
128
+ this._objectCreateFlavors = this._objectCreateFlavors.filter((f) => !fid.includes(f.id));
129
+ }
130
+ getObjectCreateFlavors() {
131
+ return this._objectCreateFlavors;
132
+ }
133
+ /**
134
+ * Exposes a list of object flavors to the shell.
135
+ * Flavors are able to be applied to objects and add new metadata properties to them.
136
+ * @param flavors Array of flavors to be exposed
137
+ * @param app Optional ID of the app that exposes the flavors (defaults to 'global' if not provided)
138
+ */
139
+ exposeObjectFlavors(flavors, app = 'global') {
140
+ flavors.forEach((f) => this.exposeObjectFlavor(f, app));
141
+ }
142
+ /**
143
+ * Removes exposed object flavors from the shell.
144
+ * @param flavors Array of flavors to be concealed
145
+ */
146
+ concealObjectFlavors(flavors, app = 'global') {
147
+ flavors.forEach((f) => this.concealObjectFlavor(f, app));
148
+ }
149
+ /**
150
+ * Exposes an object flavor to the shell. Flavors are able to be applied to objects
151
+ * in order to add a new aspect to them. An object containing an image for example could
152
+ * be added a flavor of 'EXIF Data' that will add the corresponding SOT to it. This way the
153
+ * object gets new metadata properties. If supported, these metadata could even be extracted
154
+ * from the file and filled out automatically.
155
+ * @param flavor The flavor object to be exposed
156
+ * @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)
157
+ */
158
+ exposeObjectFlavor(flavor, app = 'global') {
159
+ const idx = this._objectFlavors.findIndex((f) => f.id === flavor.id && f.app === app);
160
+ if (idx === -1)
161
+ this._objectFlavors.push({ ...flavor, app });
162
+ }
163
+ /**
164
+ * Removes an exposed object flavor from the shell.
165
+ * @param flavor Flavor to be concealed
166
+ * @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)
167
+ */
168
+ concealObjectFlavor(flavor, app = 'global') {
169
+ this._objectFlavors = this._objectFlavors.filter((f) => f.id !== flavor.id && f.app !== app);
170
+ }
171
+ /**
172
+ * Get registered object flavors
173
+ * @param app Optional app ID that restricts the returned flavors to the ones
174
+ * provided by a particular app. If not provided all flavors are returned
175
+ * @returns Array of matching object flavors
176
+ */
177
+ getObjectFlavors(app) {
178
+ return app ? this._objectFlavors.filter((of) => of.app === app) : this._objectFlavors;
179
+ }
180
+ /**
181
+ * Triggers the application of an object flavor. If the flavor has an applyComponent
182
+ * defined, the overlay will be opened with the component. Otherwise the flavor will
183
+ * be applied directly to the object.
184
+ * @param dmsObject The object to apply the flavor to
185
+ * @param flavor The flavor to apply
186
+ * @param data Optional data to be passed to the flavor component
187
+ * @returns Observable that emits true if the flavor was applied successfully
188
+ */
189
+ triggerApplyObjectFlavor(dmsObject, flavor, data) {
190
+ if (dmsObject) {
191
+ if (flavor.applyComponent) {
192
+ this.#overlay.open(flavor.applyComponent, {
193
+ dmsObject,
194
+ flavor,
195
+ data
196
+ });
197
+ return of(true);
198
+ }
199
+ else {
200
+ const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
201
+ const data = {};
202
+ data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];
203
+ return this.#dmsService.updateDmsObject(dmsObject?.id, data).pipe(map(() => true));
204
+ }
205
+ }
206
+ else
207
+ return of(false);
208
+ }
209
+ removeObjectFlavor(dmsObject, flavor) {
210
+ return this.#overlay
211
+ .confirm({
212
+ message: this.translate.instant('yuv.shell.flavor.remove.confirm.message', {
213
+ flavor: this.translate.instant(flavor.id)
214
+ })
215
+ })
216
+ .pipe(switchMap((confirmed) => {
217
+ if (confirmed) {
218
+ // remove SOT ...
219
+ const data = {
220
+ [BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS].filter((sot) => sot !== flavor.sot)
221
+ };
222
+ // ... and all the properties that came with it
223
+ this.#system.getSecondaryObjectType(flavor.sot)?.fields.forEach((p) => {
224
+ data[p.id] = null;
225
+ });
226
+ return this.#dmsService.updateDmsObject(dmsObject.id, data).pipe(map(() => true));
227
+ }
228
+ else
229
+ return of(false);
230
+ }));
231
+ }
232
+ /**
233
+ * Get object flavors applicable for a certain mimetype
234
+ * @param mimeType Mime type or mime type pattern like 'image/*'
235
+ * @param app Optional app ID that restricts the returned flavors to the ones
236
+ * provided by a particular app
237
+ * @param customFlavors Optional array of custom flavors to also take into account.
238
+ * This could be flavors managed by an app itself that are not supposed to be
239
+ * exposed to other apps
240
+ * @returns Array of matching object flavors
241
+ */
242
+ getApplicableObjectFlavors(mimeType, app, customFlavors) {
243
+ return [...(customFlavors || []), ...this._objectFlavors].filter((of) => of.applicableTo?.mimeTypes.some((mtp) => Utils.patternToRegExp(mtp).test(mimeType)) && (!app || of.app === app));
244
+ }
245
+ /**
246
+ * Get applied and applicable object flavors for a certain object
247
+ * @param dmsObject DmsObject to get flavors for
248
+ * @returns Object containing two arrays: applied and applicable flavors
249
+ */
250
+ getAppliedObjectFlavors(dmsObject) {
251
+ const applied = [];
252
+ const applicable = [];
253
+ if (dmsObject) {
254
+ const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
255
+ if (dmsObject.content) {
256
+ this.getApplicableObjectFlavors(dmsObject.content.mimeType).forEach((flavor) => {
257
+ if (sots.includes(flavor.sot)) {
258
+ applied.push(flavor);
259
+ }
260
+ else {
261
+ applicable.push(flavor);
262
+ }
263
+ });
264
+ }
265
+ }
266
+ return { applied, applicable };
267
+ }
268
+ applyObjectFlavor(dmsObject, flavor, data = {}) {
269
+ const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
270
+ data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];
271
+ return this.#dmsService.updateDmsObject(dmsObject.id, data);
272
+ }
273
+ registerTileExtension(ext) {
274
+ this._extensions[ext.typeId] = ext;
275
+ }
276
+ /**
277
+ * Get tile extensions for a certain type
278
+ * @param typeId ID of the type to fetch extesion for (objectTypeID or secondaryObjectTypeID)
279
+ * @returns
280
+ */
281
+ getRegisteredTileExtensions() {
282
+ return this._extensions;
283
+ }
284
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
285
+ _init() { }
286
+ static { this.ɵfac = function ShellService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ShellService)(); }; }
287
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ShellService, factory: ShellService.ɵfac, providedIn: 'root' }); }
288
+ }
289
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ShellService, [{
290
+ type: Injectable,
291
+ args: [{
292
+ providedIn: 'root'
293
+ }]
294
+ }], null, null); })();
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwvc2hlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixVQUFVLEVBRVYsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsS0FBSyxFQUVOLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBT2hFLE1BQU0sT0FBTyxZQUFZO0lBSHpCO1FBSUUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JDLFlBQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEMsaUJBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXJDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzVELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFB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cG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCYXNlT2JqZWN0VHlwZUZpZWxkLFxuICBEbXNPYmplY3QsXG4gIERtc1NlcnZpY2UsXG4gIE9iamVjdENyZWF0ZUZsYXZvcixcbiAgU3lzdGVtU2VydmljZSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgVXNlclNlcnZpY2UsXG4gIFV0aWxzLFxuICBZdXZVc2VyXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgWXZjT3ZlcmxheVNlcnZpY2UgfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvb3ZlcmxheSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ0xJRU5UX1NIRUxMX0FTU0VUUyB9IGZyb20gJy4uLy4uL2NsaWVudC1zaGVsbC5hc3NldHMnO1xuaW1wb3J0IHsgQXBwLCBBcHBTY2hlbWEsIEFwcFNjaGVtYUZsYXZvciwgQ2xpZW50U2hlbGxDb25maWcsIEdsb2JhbFNob3J0Y3V0LCBPYmplY3RGbGF2b3IsIFNoZWxsQXBwU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9jbGllbnQtc2hlbGwuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRpbGVFeHRlbnNpb24gfSBmcm9tICcuLi8uLi90aWxlLWV4dGVuc2lvbi5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTaGVsbFNlcnZpY2Uge1xuICAjZG1zU2VydmljZSA9IGluamVjdChEbXNTZXJ2aWNlKTtcbiAgI292ZXJsYXkgPSBpbmplY3QoWXZjT3ZlcmxheVNlcnZpY2UpO1xuICAjc3lzdGVtID0gaW5qZWN0KFN5c3RlbVNlcnZpY2UpO1xuICAjdXNlclNlcnZpY2UgPSBpbmplY3QoVXNlclNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBwcml2YXRlIF9idXN5Q291bnQgPSAwO1xuICBwcml2YXRlIGlzQnVzeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNCdXN5JCA9IHRoaXMuaXNCdXN5U3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRlYm91bmNlVGltZSg1MDApKTtcblxuICAjYXBwU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIFNoZWxsQXBwU2V0dGluZ3M+ID0ge307XG4gICNhcHBTZXR0aW5nc1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxTaGVsbEFwcFNldHRpbmdzW10+KCk7XG4gIGFwcFNldHRpbmdzJCA9IHRoaXMuI2FwcFNldHRpbmdzU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRlYm91bmNlVGltZSg1MDApKTtcblxuICAjYXBwU2NoZW1hdGE6IEFwcFNjaGVtYVtdID0gW107XG4gIGFwcEJhc2VSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAjZGVmYXVsdFNoZWxsQ29uZmlnOiBDbGllbnRTaGVsbENvbmZpZyA9IHtcbiAgICBpY29uczoge1xuICAgICAgYXBwSWNvbjogQ0xJRU5UX1NIRUxMX0FTU0VUUy5pY29ucz8uYXBwSWNvbixcbiAgICAgIGxvZ291dDogQ0xJRU5UX1NIRUxMX0FTU0VUUy5pY29ucz8ubG9nb3V0LFxuICAgICAgc2V0dGluZ3M6IENMSUVOVF9TSEVMTF9BU1NFVFMuaWNvbnM/LnNldHRpbmdzLFxuICAgICAgbm90aWZpY2F0aW9uczogQ0xJRU5UX1NIRUxMX0FTU0VUUy5pY29ucz8ubm90aWZpY2F0aW9uc1xuICAgIH1cbiAgfTtcbiAgc2hlbGxDb25maWcgPSBzaWduYWw8Q2xpZW50U2hlbGxDb25maWc+KHRoaXMuI2RlZmF1bHRTaGVsbENvbmZpZyk7XG5cbiAgLyoqIFRPRE86IGltcGxlbWVudCB0aGlzIGZlYXR1cmUgPz8/P1xuICAgKiBHbG9iYWwgc2hvcnRjdXRzIGFyZSBjYXB0dXJlZCBieSB0aGUgc2hlbGwgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgZXhwZXJpZW5jZVxuICAgKiBhY2Nyb3NzIGFsbCBhcHBzLiBTZWFyY2ggaXMgb25lIGV4YW1wbGUuIEFwcHMgc2hvdWxkIG5vdCBkZWZpbmUgdGhlaXIgb3duIHNob3VydGN1dHNcbiAgICogZm9yIHNlYXJjaC4gSW5zdGVhZCB0aGV5IHNob3VsZCBzdWJzY3JpYmUgdG8gdGhlIGdsb2JhbCBzaG9ydGN1dHMgYW5kIGluaXRpYWxpemUgdGhlaXJcbiAgICogc2VhcmNoIGJhc2VkIG9uIHRoZSBnbG9iYWwgc2VhcmNoIHNob3J0Y3V0LlxuICAgKi9cbiAgZ2xvYmFsU2hvcnRjdXRzJDogT2JzZXJ2YWJsZTxHbG9iYWxTaG9ydGN1dD4gPSBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJykucGlwZShcbiAgICBtYXAoKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIGdsb2JhbCBzaG9ydGN1dCBmb3Igc2VhcmNoXG4gICAgICAvLyBpZiAoZS5jdHJsS2V5ICYmIGUuY29kZSA9PT0gJ0tleUYnKSB7XG4gICAgICAvLyAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vICAgcmV0dXJuIEdsb2JhbFNob3J0Y3V0LnNlYXJjaDtcbiAgICAgIC8vIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSksXG4gICAgZmlsdGVyKChzOiBHbG9iYWxTaG9ydGN1dCB8IHVuZGVmaW5lZCkgPT4gcyAhPT0gdW5kZWZpbmVkKSxcbiAgICBtYXAoKHMpID0+IHMgYXMgR2xvYmFsU2hvcnRjdXQpXG4gICk7XG5cbiAgcHJpdmF0ZSBfZXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgVGlsZUV4dGVuc2lvbj4gPSB7fTtcbiAgcHJpdmF0ZSBfb2JqZWN0Rmxhdm9yczogT2JqZWN0Rmxhdm9yW10gPSBbXTtcbiAgcHJpdmF0ZSBfb2JqZWN0Q3JlYXRlRmxhdm9yczogT2JqZWN0Q3JlYXRlRmxhdm9yW10gPSBbXTtcblxuICBzZXRTaGVsbENvbmZpZyhjc2M6IENsaWVudFNoZWxsQ29uZmlnKSB7XG4gICAgdGhpcy5zaGVsbENvbmZpZy51cGRhdGUoKHNjKSA9PiAoe1xuICAgICAgaWNvbnM6IHtcbiAgICAgICAgYXBwSWNvbjogY3NjLmljb25zPy5hcHBJY29uID8/IHNjLmljb25zPy5hcHBJY29uLFxuICAgICAgICBsb2dvdXQ6IGNzYy5pY29ucz8ubG9nb3V0ID8/IHNjLmljb25zPy5sb2dvdXQsXG4gICAgICAgIHNldHRpbmdzOiBjc2MuaWNvbnM/LnNldHRpbmdzID8/IHNjLmljb25zPy5zZXR0aW5ncyxcbiAgICAgICAgbm90aWZpY2F0aW9uczogY3NjLmljb25zPy5zZXR0aW5ncyA/PyBzYy5pY29ucz8ubm90aWZpY2F0aW9uc1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIHNldEFwcEJhc2VSb3V0ZXMoYXBwczogQXBwW10pIHtcbiAgICBhcHBzLmZvckVhY2goKGEpID0+ICh0aGlzLmFwcEJhc2VSb3V0ZXNbYS5pZF0gPSBhLnBhdGggfHwgJycpKTtcbiAgfVxuXG4gIHJlZ2lzdGVyQXBwKHNjaGVtYTogQXBwU2NoZW1hKSB7XG4gICAgdGhpcy4jYXBwU2NoZW1hdGEucHVzaChzY2hlbWEpO1xuICB9XG5cbiAgZ2V0UmVnaXN0ZXJlZEFwcChpZDogc3RyaW5nKTogQXBwU2NoZW1hIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jYXBwU2NoZW1hdGEuZmluZCgoYSkgPT4gYS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHNldHRpbmdzIGZvciBhcHBzIHRvIGhvb2sgaW50byBzaGVsbCBzZXR0aW5ncyBwYWdlLlxuICAgKiBUaGVzZSBleHBvc2VkIHNldHRpbmdzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlIHVzZXJzIHNldHRpbmdzIG9uIHRoZSBiYWNrZW5kLlxuICAgKiBAcGFyYW0gYXBwSUQgSUQgb2YgdGhlIGFwcCB0aGF0IGV4cG9zZXMgdGhlIHNldHRpbmdzXG4gICAqIEBwYXJhbSBjZmcgU2hlbGxBcHBTZXR0aW5ncyBvYmplY3QgY29udGFpbmluZyB0aGUgc2V0dGluZ3NcbiAgICovXG4gIHJlZ2lzdGVyQXBwU2V0dGluZ3MoYXBwSUQ6IHN0cmluZywgY2ZnOiBTaGVsbEFwcFNldHRpbmdzKSB7XG4gICAgdGhpcy4jYXBwU2V0dGluZ3NbYXBwSURdID0gY2ZnO1xuICAgIHRoaXMuI2FwcFNldHRpbmdzU3ViamVjdC5uZXh0KHRoaXMuI2dldEFwcFNldHRpbmdzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgcGVyc2lzdGVkIHNldHRpbmdzIGZvciBhIHNwZWNpZmljIGFwcFxuICAgKiBAcGFyYW0gYXBwSUQgSUQgb2YgdGhlIGFwcCB0byBsb2FkIHRoZSBzZXR0aW5ncyBmb3JcbiAgICovXG4gIHVzZXJzQXBwU2V0dGluZ3MkKGFwcElEOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNoZWxsQXBwU2V0dGluZ3MgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy4jdXNlclNlcnZpY2UudXNlciQucGlwZShcbiAgICAgIG1hcCgodTogWXV2VXNlciB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICByZXR1cm4gdSAmJiB1LnVzZXJTZXR0aW5ncy5jbGllbnRBcHBTZXR0aW5ncyA/IHUudXNlclNldHRpbmdzLmNsaWVudEFwcFNldHRpbmdzW2FwcElEXSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNhdmVVc2Vyc0FwcFNldHRpbmdzKGFwcElEOiBzdHJpbmcsIHNldHRpbmdzOiBTaGVsbEFwcFNldHRpbmdzKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jdXNlclNlcnZpY2Uuc2F2ZVVzZXJTZXR0aW5ncyh7IGNsaWVudEFwcFNldHRpbmdzOiB7IFthcHBJRF06IHNldHRpbmdzIH0gfSk7XG4gIH1cblxuICAjZ2V0QXBwU2V0dGluZ3MoKTogU2hlbGxBcHBTZXR0aW5nc1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy4jYXBwU2V0dGluZ3MpXG4gICAgICAubWFwKChrZXk6IHN0cmluZykgPT4gKHtcbiAgICAgICAgYXBwSUQ6IHRoaXMuI2FwcFNldHRpbmdzW2tleV0uYXBwSUQsXG4gICAgICAgIGxhYmVsOiB0aGlzLiNhcHBTZXR0aW5nc1trZXldLmxhYmVsLFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLiNhcHBTZXR0aW5nc1trZXldLnByb3BlcnRpZXNcbiAgICAgIH0pKVxuICAgICAgLnNvcnQoKTtcbiAgfVxuXG4gIGFkZEJ1c3koKSB7XG4gICAgaWYgKHRoaXMuX2J1c3lDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0J1c3lTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2J1c3lDb3VudCsrO1xuICB9XG4gIHJlbW92ZUJ1c3koKSB7XG4gICAgdGhpcy5fYnVzeUNvdW50LS07XG4gICAgaWYgKHRoaXMuX2J1c3lDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0J1c3lTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9zZU9iamVjdENyZWF0ZUZsYXZvcnMoZmxhdm9yczogT2JqZWN0Q3JlYXRlRmxhdm9yW10pIHtcbiAgICBmbGF2b3JzLmZvckVhY2goKGZsYXZvcjogT2JqZWN0Q3JlYXRlRmxhdm9yKSA9PiB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLl9vYmplY3RDcmVhdGVGbGF2b3JzLmZpbmRJbmRleCgoZikgPT4gZi5pZCA9PT0gZmxhdm9yLmlkKTtcbiAgICAgIGlmIChpZHggPT09IC0xKSB0aGlzLl9vYmplY3RDcmVhdGVGbGF2b3JzLnB1c2goZmxhdm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbmNlYWxPYmplY3RDcmVhdGVGbGF2b3JzKGZsYXZvcnM6IE9iamVjdENyZWF0ZUZsYXZvcltdKSB7XG4gICAgY29uc3QgZmlkID0gZmxhdm9ycy5tYXAoKGYpID0+IGYuaWQpO1xuICAgIHRoaXMuX29iamVjdENyZWF0ZUZsYXZvcnMgPSB0aGlzLl9vYmplY3RDcmVhdGVGbGF2b3JzLmZpbHRlcigoZikgPT4gIWZpZC5pbmNsdWRlcyhmLmlkKSk7XG4gIH1cblxuICBnZXRPYmplY3RDcmVhdGVGbGF2b3JzKCk6IE9iamVjdENyZWF0ZUZsYXZvcltdIHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0Q3JlYXRlRmxhdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIGEgbGlzdCBvZiBvYmplY3QgZmxhdm9ycyB0byB0aGUgc2hlbGwuXG4gICAqIEZsYXZvcnMgYXJlIGFibGUgdG8gYmUgYXBwbGllZCB0byBvYmplY3RzIGFuZCBhZGQgbmV3IG1ldGFkYXRhIHByb3BlcnRpZXMgdG8gdGhlbS5cbiAgICogQHBhcmFtIGZsYXZvcnMgQXJyYXkgb2YgZmxhdm9ycyB0byBiZSBleHBvc2VkXG4gICAqIEBwYXJhbSBhcHAgT3B0aW9uYWwgSUQgb2YgdGhlIGFwcCB0aGF0IGV4cG9zZXMgdGhlIGZsYXZvcnMgKGRlZmF1bHRzIHRvICdnbG9iYWwnIGlmIG5vdCBwcm92aWRlZClcbiAgICovXG4gIGV4cG9zZU9iamVjdEZsYXZvcnMoZmxhdm9yczogQXBwU2NoZW1hRmxhdm9yW10sIGFwcCA9ICdnbG9iYWwnKSB7XG4gICAgZmxhdm9ycy5mb3JFYWNoKChmKSA9PiB0aGlzLmV4cG9zZU9iamVjdEZsYXZvcihmLCBhcHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV4cG9zZWQgb2JqZWN0IGZsYXZvcnMgZnJvbSB0aGUgc2hlbGwuXG4gICAqIEBwYXJhbSBmbGF2b3JzIEFycmF5IG9mIGZsYXZvcnMgdG8gYmUgY29uY2VhbGVkXG4gICAqL1xuICBjb25jZWFsT2JqZWN0Rmxhdm9ycyhmbGF2b3JzOiBBcHBTY2hlbWFGbGF2b3JbXSwgYXBwID0gJ2dsb2JhbCcpIHtcbiAgICBmbGF2b3JzLmZvckVhY2goKGYpID0+IHRoaXMuY29uY2VhbE9iamVjdEZsYXZvcihmLCBhcHApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2VzIGFuIG9iamVjdCBmbGF2b3IgdG8gdGhlIHNoZWxsLiBGbGF2b3JzIGFyZSBhYmxlIHRvIGJlIGFwcGxpZWQgdG8gb2JqZWN0c1xuICAgKiBpbiBvcmRlciB0byBhZGQgYSBuZXcgYXNwZWN0IHRvIHRoZW0uIEFuIG9iamVjdCBjb250YWluaW5nIGFuIGltYWdlIGZvciBleGFtcGxlIGNvdWxkXG4gICAqIGJlIGFkZGVkIGEgZmxhdm9yIG9mICdFWElGIERhdGEnIHRoYXQgd2lsbCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgU09UIHRvIGl0LiBUaGlzIHdheSB0aGVcbiAgICogb2JqZWN0IGdldHMgbmV3IG1ldGFkYXRhIHByb3BlcnRpZXMuIElmIHN1cHBvcnRlZCwgdGhlc2UgbWV0YWRhdGEgY291bGQgZXZlbiBiZSBleHRyYWN0ZWRcbiAgICogZnJvbSB0aGUgZmlsZSBhbmQgZmlsbGVkIG91dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmxhdm9yIFRoZSBmbGF2b3Igb2JqZWN0IHRvIGJlIGV4cG9zZWRcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBJRCBvZiB0aGUgYXBwIHRoYXQgZXhwb3NlcyB0aGUgZmxhdm9yIChkZWZhdWx0cyB0byAnZ2xvYmFsJyBpZiBub3QgcHJvdmlkZWQpXG4gICAqL1xuICBleHBvc2VPYmplY3RGbGF2b3IoZmxhdm9yOiBBcHBTY2hlbWFGbGF2b3IsIGFwcCA9ICdnbG9iYWwnKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fb2JqZWN0Rmxhdm9ycy5maW5kSW5kZXgoKGYpID0+IGYuaWQgPT09IGZsYXZvci5pZCAmJiBmLmFwcCA9PT0gYXBwKTtcbiAgICBpZiAoaWR4ID09PSAtMSkgdGhpcy5fb2JqZWN0Rmxhdm9ycy5wdXNoKHsgLi4uZmxhdm9yLCBhcHAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBleHBvc2VkIG9iamVjdCBmbGF2b3IgZnJvbSB0aGUgc2hlbGwuXG4gICAqIEBwYXJhbSBmbGF2b3IgRmxhdm9yIHRvIGJlIGNvbmNlYWxlZFxuICAgKiBAcGFyYW0gYXBwIE9wdGlvbmFsIElEIG9mIHRoZSBhcHAgdGhhdCBleHBvc2VzIHRoZSBmbGF2b3IgKGRlZmF1bHRzIHRvICdnbG9iYWwnIGlmIG5vdCBwcm92aWRlZClcbiAgICovXG4gIGNvbmNlYWxPYmplY3RGbGF2b3IoZmxhdm9yOiBBcHBTY2hlbWFGbGF2b3IsIGFwcCA9ICdnbG9iYWwnKSB7XG4gICAgdGhpcy5fb2JqZWN0Rmxhdm9ycyA9IHRoaXMuX29iamVjdEZsYXZvcnMuZmlsdGVyKChmKSA9PiBmLmlkICE9PSBmbGF2b3IuaWQgJiYgZi5hcHAgIT09IGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlZ2lzdGVyZWQgb2JqZWN0IGZsYXZvcnNcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBhcHAgSUQgdGhhdCByZXN0cmljdHMgdGhlIHJldHVybmVkIGZsYXZvcnMgdG8gdGhlIG9uZXNcbiAgICogcHJvdmlkZWQgYnkgYSBwYXJ0aWN1bGFyIGFwcC4gSWYgbm90IHByb3ZpZGVkIGFsbCBmbGF2b3JzIGFyZSByZXR1cm5lZFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBtYXRjaGluZyBvYmplY3QgZmxhdm9yc1xuICAgKi9cbiAgZ2V0T2JqZWN0Rmxhdm9ycyhhcHA/OiBzdHJpbmcpOiBPYmplY3RGbGF2b3JbXSB7XG4gICAgcmV0dXJuIGFwcCA/IHRoaXMuX29iamVjdEZsYXZvcnMuZmlsdGVyKChvZikgPT4gb2YuYXBwID09PSBhcHApIDogdGhpcy5fb2JqZWN0Rmxhdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgYXBwbGljYXRpb24gb2YgYW4gb2JqZWN0IGZsYXZvci4gSWYgdGhlIGZsYXZvciBoYXMgYW4gYXBwbHlDb21wb25lbnRcbiAgICogZGVmaW5lZCwgdGhlIG92ZXJsYXkgd2lsbCBiZSBvcGVuZWQgd2l0aCB0aGUgY29tcG9uZW50LiBPdGhlcndpc2UgdGhlIGZsYXZvciB3aWxsXG4gICAqIGJlIGFwcGxpZWQgZGlyZWN0bHkgdG8gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIGRtc09iamVjdCBUaGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBmbGF2b3IgdG9cbiAgICogQHBhcmFtIGZsYXZvciBUaGUgZmxhdm9yIHRvIGFwcGx5XG4gICAqIEBwYXJhbSBkYXRhIE9wdGlvbmFsIGRhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBmbGF2b3IgY29tcG9uZW50XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0cnVlIGlmIHRoZSBmbGF2b3Igd2FzIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5XG4gICAqL1xuICB0cmlnZ2VyQXBwbHlPYmplY3RGbGF2b3IoZG1zT2JqZWN0OiBEbXNPYmplY3QsIGZsYXZvcjogT2JqZWN0Rmxhdm9yLCBkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKGRtc09iamVjdCkge1xuICAgICAgaWYgKGZsYXZvci5hcHBseUNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLiNvdmVybGF5Lm9wZW4oZmxhdm9yLmFwcGx5Q29tcG9uZW50LCB7XG4gICAgICAgICAgZG1zT2JqZWN0LFxuICAgICAgICAgIGZsYXZvcixcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3RzOiBzdHJpbmdbXSA9IChkbXNPYmplY3QuZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0ge307XG4gICAgICAgIGRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSA9IFsuLi5zb3RzLCBmbGF2b3Iuc290XTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UudXBkYXRlRG1zT2JqZWN0KGRtc09iamVjdD8uaWQsIGRhdGEpLnBpcGUobWFwKCgpID0+IHRydWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgcmV0dXJuIG9mKGZhbHNlKTtcbiAgfVxuXG4gIHJlbW92ZU9iamVjdEZsYXZvcihkbXNPYmplY3Q6IERtc09iamVjdCwgZmxhdm9yOiBPYmplY3RGbGF2b3IpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLiNvdmVybGF5XG4gICAgICAuY29uZmlybSh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5zaGVsbC5mbGF2b3IucmVtb3ZlLmNvbmZpcm0ubWVzc2FnZScsIHtcbiAgICAgICAgICBmbGF2b3I6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZmxhdm9yLmlkKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNvbmZpcm1lZDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBTT1QgLi4uXG4gICAgICAgICAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICAgICAgW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU106IChkbXNPYmplY3QuZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdIGFzIHN0cmluZ1tdKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHNvdDogc3RyaW5nKSA9PiBzb3QgIT09IGZsYXZvci5zb3RcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIC4uLiBhbmQgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FtZSB3aXRoIGl0XG4gICAgICAgICAgICB0aGlzLiNzeXN0ZW0uZ2V0U2Vjb25kYXJ5T2JqZWN0VHlwZShmbGF2b3Iuc290KT8uZmllbGRzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgZGF0YVtwLmlkXSA9IG51bGw7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UudXBkYXRlRG1zT2JqZWN0KGRtc09iamVjdC5pZCwgZGF0YSkucGlwZShtYXAoKCkgPT4gdHJ1ZSkpO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb2JqZWN0IGZsYXZvcnMgYXBwbGljYWJsZSBmb3IgYSBjZXJ0YWluIG1pbWV0eXBlXG4gICAqIEBwYXJhbSBtaW1lVHlwZSBNaW1lIHR5cGUgb3IgbWltZSB0eXBlIHBhdHRlcm4gbGlrZSAnaW1hZ2UvKidcbiAgICogQHBhcmFtIGFwcCBPcHRpb25hbCBhcHAgSUQgdGhhdCByZXN0cmljdHMgdGhlIHJldHVybmVkIGZsYXZvcnMgdG8gdGhlIG9uZXNcbiAgICogcHJvdmlkZWQgYnkgYSBwYXJ0aWN1bGFyIGFwcFxuICAgKiBAcGFyYW0gY3VzdG9tRmxhdm9ycyBPcHRpb25hbCBhcnJheSBvZiBjdXN0b20gZmxhdm9ycyB0byBhbHNvIHRha2UgaW50byBhY2NvdW50LlxuICAgKiBUaGlzIGNvdWxkIGJlIGZsYXZvcnMgbWFuYWdlZCBieSBhbiBhcHAgaXRzZWxmIHRoYXQgYXJlIG5vdCBzdXBwb3NlZCB0byBiZVxuICAgKiBleHBvc2VkIHRvIG90aGVyIGFwcHNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWF0Y2hpbmcgb2JqZWN0IGZsYXZvcnNcbiAgICovXG4gIGdldEFwcGxpY2FibGVPYmplY3RGbGF2b3JzKG1pbWVUeXBlOiBzdHJpbmcsIGFwcD86IHN0cmluZywgY3VzdG9tRmxhdm9ycz86IE9iamVjdEZsYXZvcltdKTogT2JqZWN0Rmxhdm9yW10ge1xuICAgIHJldHVybiBbLi4uKGN1c3RvbUZsYXZvcnMgfHwgW10pLCAuLi50aGlzLl9vYmplY3RGbGF2b3JzXS5maWx0ZXIoXG4gICAgICAob2Y6IE9iamVjdEZsYXZvcikgPT4gb2YuYXBwbGljYWJsZVRvPy5taW1lVHlwZXMuc29tZSgobXRwKSA9PiBVdGlscy5wYXR0ZXJuVG9SZWdFeHAobXRwKS50ZXN0KG1pbWVUeXBlKSkgJiYgKCFhcHAgfHwgb2YuYXBwID09PSBhcHApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXBwbGllZCBhbmQgYXBwbGljYWJsZSBvYmplY3QgZmxhdm9ycyBmb3IgYSBjZXJ0YWluIG9iamVjdFxuICAgKiBAcGFyYW0gZG1zT2JqZWN0IERtc09iamVjdCB0byBnZXQgZmxhdm9ycyBmb3JcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdHdvIGFycmF5czogYXBwbGllZCBhbmQgYXBwbGljYWJsZSBmbGF2b3JzXG4gICAqL1xuICBnZXRBcHBsaWVkT2JqZWN0Rmxhdm9ycyhkbXNPYmplY3Q6IERtc09iamVjdCk6IHtcbiAgICBhcHBsaWVkOiBPYmplY3RGbGF2b3JbXTtcbiAgICBhcHBsaWNhYmxlOiBPYmplY3RGbGF2b3JbXTtcbiAgfSB7XG4gICAgY29uc3QgYXBwbGllZDogT2JqZWN0Rmxhdm9yW10gPSBbXTtcbiAgICBjb25zdCBhcHBsaWNhYmxlOiBPYmplY3RGbGF2b3JbXSA9IFtdO1xuICAgIGlmIChkbXNPYmplY3QpIHtcbiAgICAgIGNvbnN0IHNvdHM6IHN0cmluZ1tdID0gKGRtc09iamVjdC5kYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gYXMgc3RyaW5nW10pIHx8IFtdO1xuICAgICAgaWYgKGRtc09iamVjdC5jb250ZW50KSB7XG4gICAgICAgIHRoaXMuZ2V0QXBwbGljYWJsZU9iamVjdEZsYXZvcnMoZG1zT2JqZWN0LmNvbnRlbnQubWltZVR5cGUpLmZvckVhY2goKGZsYXZvcjogT2JqZWN0Rmxhdm9yKSA9PiB7XG4gICAgICAgICAgaWYgKHNvdHMuaW5jbHVkZXMoZmxhdm9yLnNvdCkpIHtcbiAgICAgICAgICAgIGFwcGxpZWQucHVzaChmbGF2b3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBsaWNhYmxlLnB1c2goZmxhdm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBhcHBsaWVkLCBhcHBsaWNhYmxlIH07XG4gIH1cblxuICBhcHBseU9iamVjdEZsYXZvcihkbXNPYmplY3Q6IERtc09iamVjdCwgZmxhdm9yOiBPYmplY3RGbGF2b3IsIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIGNvbnN0IHNvdHM6IHN0cmluZ1tdID0gKGRtc09iamVjdC5kYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEU10gYXMgc3RyaW5nW10pIHx8IFtdO1xuICAgIGRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSA9IFsuLi5zb3RzLCBmbGF2b3Iuc290XTtcbiAgICByZXR1cm4gdGhpcy4jZG1zU2VydmljZS51cGRhdGVEbXNPYmplY3QoZG1zT2JqZWN0LmlkLCBkYXRhKTtcbiAgfVxuXG4gIHJlZ2lzdGVyVGlsZUV4dGVuc2lvbihleHQ6IFRpbGVFeHRlbnNpb24pIHtcbiAgICB0aGlzLl9leHRlbnNpb25zW2V4dC50eXBlSWRdID0gZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aWxlIGV4dGVuc2lvbnMgZm9yIGEgY2VydGFpbiB0eXBlXG4gICAqIEBwYXJhbSB0eXBlSWQgSUQgb2YgdGhlIHR5cGUgdG8gZmV0Y2ggZXh0ZXNpb24gZm9yIChvYmplY3RUeXBlSUQgb3Igc2Vjb25kYXJ5T2JqZWN0VHlwZUlEKVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0UmVnaXN0ZXJlZFRpbGVFeHRlbnNpb25zKCk6IFJlY29yZDxzdHJpbmcsIFRpbGVFeHRlbnNpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fZXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgX2luaXQoKSB7fVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtbm90aWZpY2F0aW9ucy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwtY29yZS9zcmMvbGliL3NlcnZpY2VzL3NoZWxsLW5vdGlmaWNhdGlvbnMvc2hlbGwtbm90aWZpY2F0aW9ucy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2hlbGxOb3RpZmljYXRpb24ge1xuICAgIC8vIG5vdGlmaWNhdGlvbnMgdGl0bGVcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8vIG5vdGlmaWNhdGlvbnMgZGVzY3JpcHRpb25cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvLyBhbiBpY29uIChTVkcgc3RyaW5nKVxuICAgIGljb24/OiBzdHJpbmc7XG4gICAgLy8gdGhlIGFwcCB0aGF0IHRyaWdnZXJlZCB0aGUgbm90aWZpY2F0aW9uXG4gICAgYXBwPzogc3RyaW5nO1xuICAgIC8vIGxldmVsIGluZGljYXRpbmcgdGhlIHR5cGUgb2Ygbm90aWZpY2F0aW9uIChpdHMgaW1wb3J0YW5jZSlcbiAgICBsZXZlbD86IFNoZWxsTm90aWZpY2F0aW9uTGV2ZWw7XG4gICAgLy8gYSByb3V0ZSB0byBvcGVuIGNsaWNraW5nIHRoZSBub3RpZmljYXRpb25cbiAgICB0YXJnZXRSb3V0ZT86IHN0cmluZztcbiAgICAvLyByZW1vdmUgdGhlIG5vdGlmaWNhdGlvbiBhZnRlciB0aGUgdGFyZ2V0IHJvdXRlIGhhcyBiZWVuIG5hdmlnYXRlZCB0b1xuICAgIHJlbW92ZU9uVGFyZ2V0Um91dGVOYXZpZ2F0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBTaGVsbE5vdGlmaWNhdGlvbkxldmVsID0gJ2FsZXJ0JyB8ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdzdWNjZXNzJyJdfQ==
@@ -0,0 +1,89 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { ReplaySubject } from 'rxjs';
3
+ import { AppCacheService, NativeNotificationService, TranslateService, Utils } from '@yuuvis/client-core';
4
+ import { ShellService } from '../shell/shell.service';
5
+ import { Router } from '@angular/router';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Service managing shell notifications.
9
+ * Every app could propagate shell notifications. They will be published
10
+ * in the notifications section of the shell. Incoming new messahes will
11
+ * also add an indicator to the icon in the shell bar.
12
+ *
13
+ */
14
+ export class ShellNotificationsService {
15
+ #shell;
16
+ #router;
17
+ #nativeNotificationService;
18
+ constructor() {
19
+ this.LOCAL_STORAGE_KEY = 'yuv.shell.notifications';
20
+ this.appCache = inject(AppCacheService);
21
+ this.#shell = inject(ShellService);
22
+ this.#router = inject(Router);
23
+ this.translate = inject(TranslateService);
24
+ this.#nativeNotificationService = inject(NativeNotificationService);
25
+ this._notifications = [];
26
+ this._notificationsSource = new ReplaySubject();
27
+ this.shellNotifications$ = this._notificationsSource.asObservable();
28
+ this.appCache.getItem(this.LOCAL_STORAGE_KEY).subscribe((res) => {
29
+ this._notifications = res || [];
30
+ this._notificationsSource.next(this._notifications);
31
+ });
32
+ }
33
+ // getNotifications(id: string) {
34
+ // const file = [
35
+ // { id: 'io.yuuvis.app.drive', count: 2, maxLevel: 'info' },
36
+ // { id: 'io.yuuvis.app.tasks', count: 222, maxLevel: 'warning' }
37
+ // ];
38
+ // return file.find((f) => f.id === id);
39
+ // }
40
+ add(notification, nativeNotification = false) {
41
+ this._notifications.push({
42
+ ...notification,
43
+ id: Utils.uuid(),
44
+ timestamp: new Date().getTime(),
45
+ seen: false
46
+ });
47
+ // check for unseen items
48
+ if (document.hidden && nativeNotification && this._notifications.some((n) => !n.seen)) {
49
+ this.#nativeNotificationService.showNotification(this.translate.instant('yuv.shell.notification.native.title'), {
50
+ onClick: () => this.#router.navigate([{ outlets: { aside: 'notifications' } }]),
51
+ options: {
52
+ body: this.translate.instant('yuv.shell.notification.native.message'),
53
+ // badge: this.#shell.shellConfig().icons!.appIcon,
54
+ icon: 'https://budgie.enaioci.net/client/assets/_yuuvis/theme/favicon.svg'
55
+ }
56
+ });
57
+ }
58
+ this._updateNotifications();
59
+ }
60
+ remove(id) {
61
+ this._notifications = this._notifications.filter((n) => n.id !== id);
62
+ this._updateNotifications();
63
+ }
64
+ removeAll() {
65
+ this._notifications = [];
66
+ this._updateNotifications();
67
+ }
68
+ markAllAsSeen() {
69
+ this._notifications.forEach((n) => (n.seen = true));
70
+ this._updateNotifications();
71
+ }
72
+ getNotificationById(id) {
73
+ return this._notifications.find((n) => n.id === id);
74
+ }
75
+ _updateNotifications() {
76
+ this._notifications = this._notifications.sort((a, b) => b.timestamp - a.timestamp);
77
+ this._notificationsSource.next(this._notifications);
78
+ this.appCache.setItem(this.LOCAL_STORAGE_KEY, this._notifications).subscribe();
79
+ }
80
+ static { this.ɵfac = function ShellNotificationsService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ShellNotificationsService)(); }; }
81
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ShellNotificationsService, factory: ShellNotificationsService.ɵfac, providedIn: 'root' }); }
82
+ }
83
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ShellNotificationsService, [{
84
+ type: Injectable,
85
+ args: [{
86
+ providedIn: 'root'
87
+ }]
88
+ }], () => [], null); })();
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtbm90aWZpY2F0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC1ub3RpZmljYXRpb25zL3NoZWxsLW5vdGlmaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFFekM7Ozs7OztHQU1HO0FBSUgsTUFBTSxPQUFPLHlCQUF5QjtJQUdwQyxNQUFNLENBQXdCO0lBQzlCLE9BQU8sQ0FBa0I7SUFFekIsMEJBQTBCLENBQXFDO0lBTS9EO1FBWFEsc0JBQWlCLEdBQUcseUJBQXlCLENBQUM7UUFDOUMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxXQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlCLFlBQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLCtCQUEwQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRXZELG1CQUFjLEdBQTRCLEVBQUUsQ0FBQztRQUM3Qyx5QkFBb0IsR0FBRyxJQUFJLGFBQWEsRUFBMkIsQ0FBQztRQUM1RSx3QkFBbUIs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QUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNqRixDQUFDOzBIQXhFVSx5QkFBeUI7dUVBQXpCLHlCQUF5QixXQUF6Qix5QkFBeUIsbUJBRnhCLE1BQU07O2lGQUVQLHlCQUF5QjtjQUhyQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoZWxsTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9zaGVsbC1ub3RpZmljYXRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcHBDYWNoZVNlcnZpY2UsIE5hdGl2ZU5vdGlmaWNhdGlvblNlcnZpY2UsIFRyYW5zbGF0ZVNlcnZpY2UsIFV0aWxzIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBTaGVsbFNlcnZpY2UgfSBmcm9tICcuLi9zaGVsbC9zaGVsbC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbi8qKlxuICogU2VydmljZSBtYW5hZ2luZyBzaGVsbCBub3RpZmljYXRpb25zLlxuICogRXZlcnkgYXBwIGNvdWxkIHByb3BhZ2F0ZSBzaGVsbCBub3RpZmljYXRpb25zLiBUaGV5IHdpbGwgYmUgcHVibGlzaGVkXG4gKiBpbiB0aGUgbm90aWZpY2F0aW9ucyBzZWN0aW9uIG9mIHRoZSBzaGVsbC4gSW5jb21pbmcgbmV3IG1lc3NhaGVzIHdpbGxcbiAqIGFsc28gYWRkIGFuIGluZGljYXRvciB0byB0aGUgaWNvbiBpbiB0aGUgc2hlbGwgYmFyLlxuICpcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2hlbGxOb3RpZmljYXRpb25zU2VydmljZSB7XG4gIHByaXZhdGUgTE9DQUxfU1RPUkFHRV9LRVkgPSAneXV2LnNoZWxsLm5vdGlmaWNhdGlvbnMnO1xuICBwcml2YXRlIGFwcENhY2hlID0gaW5qZWN0KEFwcENhY2hlU2VydmljZSk7XG4gICNzaGVsbCA9IGluamVjdChTaGVsbFNlcnZpY2UpO1xuICAjcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAjbmF0aXZlTm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChOYXRpdmVOb3RpZmljYXRpb25TZXJ2aWNlKTtcblxuICBwcml2YXRlIF9ub3RpZmljYXRpb25zOiBTaGVsbE5vdGlmaWNhdGlvbkl0ZW1bXSA9IFtdO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25zU291cmNlID0gbmV3IFJlcGxheVN1YmplY3Q8U2hlbGxOb3RpZmljYXRpb25JdGVtW10+KCk7XG4gIHNoZWxsTm90aWZpY2F0aW9ucyQ6IE9ic2VydmFibGU8U2hlbGxOb3RpZmljYXRpb25JdGVtW10+ID0gdGhpcy5fbm90aWZpY2F0aW9uc1NvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFwcENhY2hlLmdldEl0ZW0odGhpcy5MT0NBTF9TVE9SQUdFX0tFWSkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMgPSByZXMgfHwgW107XG4gICAgICB0aGlzLl9ub3RpZmljYXRpb25zU291cmNlLm5leHQodGhpcy5fbm90aWZpY2F0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBnZXROb3RpZmljYXRpb25zKGlkOiBzdHJpbmcpIHtcbiAgLy8gICBjb25zdCBmaWxlID0gW1xuICAvLyAgICAgeyBpZDogJ2lvLnl1dXZpcy5hcHAuZHJpdmUnLCBjb3VudDogMiwgbWF4TGV2ZWw6ICdpbmZvJyB9LFxuICAvLyAgICAgeyBpZDogJ2lvLnl1dXZpcy5hcHAudGFza3MnLCBjb3VudDogMjIyLCBtYXhMZXZlbDogJ3dhcm5pbmcnIH1cbiAgLy8gICBdO1xuXG4gIC8vICAgcmV0dXJuIGZpbGUuZmluZCgoZikgPT4gZi5pZCA9PT0gaWQpO1xuICAvLyB9XG5cbiAgYWRkKG5vdGlmaWNhdGlvbjogU2hlbGxOb3RpZmljYXRpb24sIG5hdGl2ZU5vdGlmaWNhdGlvbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9ucy5wdXNoKHtcbiAgICAgIC4uLm5vdGlmaWNhdGlvbixcbiAgICAgIGlkOiBVdGlscy51dWlkKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgc2VlbjogZmFsc2VcbiAgICB9KTtcbiAgICAvLyBjaGVjayBmb3IgdW5zZWVuIGl0ZW1zXG4gICAgaWYgKGRvY3VtZW50LmhpZGRlbiAmJiBuYXRpdmVOb3RpZmljYXRpb24gJiYgdGhpcy5fbm90aWZpY2F0aW9ucy5zb21lKChuKSA9PiAhbi5zZWVuKSkge1xuICAgICAgdGhpcy4jbmF0aXZlTm90aWZpY2F0aW9uU2VydmljZS5zaG93Tm90aWZpY2F0aW9uKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5zaGVsbC5ub3RpZmljYXRpb24ubmF0aXZlLnRpdGxlJyksIHtcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy4jcm91dGVyLm5hdmlnYXRlKFt7IG91dGxldHM6IHsgYXNpZGU6ICdub3RpZmljYXRpb25zJyB9IH1dKSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvZHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5zaGVsbC5ub3RpZmljYXRpb24ubmF0aXZlLm1lc3NhZ2UnKSxcbiAgICAgICAgICAvLyBiYWRnZTogdGhpcy4jc2hlbGwuc2hlbGxDb25maWcoKS5pY29ucyEuYXBwSWNvbixcbiAgICAgICAgICBpY29uOiAnaHR0cHM6Ly9idWRnaWUuZW5haW9jaS5uZXQvY2xpZW50L2Fzc2V0cy9feXV1dmlzL3RoZW1lL2Zhdmljb24uc3ZnJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlTm90aWZpY2F0aW9ucygpO1xuICB9XG5cbiAgcmVtb3ZlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25zID0gdGhpcy5fbm90aWZpY2F0aW9ucy5maWx0ZXIoKG4pID0+IG4uaWQgIT09IGlkKTtcbiAgICB0aGlzLl91cGRhdGVOb3RpZmljYXRpb25zKCk7XG4gIH1cblxuICByZW1vdmVBbGwoKSB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9ucyA9IFtdO1xuICAgIHRoaXMuX3VwZGF0ZU5vdGlmaWNhdGlvbnMoKTtcbiAgfVxuXG4gIG1hcmtBbGxBc1NlZW4oKSB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9ucy5mb3JFYWNoKChuKSA9PiAobi5zZWVuID0gdHJ1ZSkpO1xuICAgIHRoaXMuX3VwZGF0ZU5vdGlmaWNhdGlvbnMoKTtcbiAgfVxuXG4gIGdldE5vdGlmaWNhdGlvbkJ5SWQoaWQ6IHN0cmluZyk6IFNoZWxsTm90aWZpY2F0aW9uSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25vdGlmaWNhdGlvbnMuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlTm90aWZpY2F0aW9ucygpIHtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25zID0gdGhpcy5fbm90aWZpY2F0aW9ucy5zb3J0KChhLCBiKSA9PiBiLnRpbWVzdGFtcCAtIGEudGltZXN0YW1wKTtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25zU291cmNlLm5leHQodGhpcy5fbm90aWZpY2F0aW9ucyk7XG4gICAgdGhpcy5hcHBDYWNoZS5zZXRJdGVtKHRoaXMuTE9DQUxfU1RPUkFHRV9LRVksIHRoaXMuX25vdGlmaWNhdGlvbnMpLnN1YnNjcmliZSgpO1xuICB9XG59XG5cbnR5cGUgU2hlbGxOb3RpZmljYXRpb25JdGVtID0gU2hlbGxOb3RpZmljYXRpb24gJiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBzZWVuOiBib29sZWFuO1xufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS1leHRlbnNpb24uaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi90aWxlLWV4dGVuc2lvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVFeHRlbnNpb24ge1xuICAgIHR5cGVJZDogc3RyaW5nO1xuICAgIGNtcDogVHlwZTxUaWxlRXh0ZW5zaW9uQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaWxlRXh0ZW5zaW9uQ29tcG9uZW50IHtcbiAgICBkYXRhOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlsZUV4dGVuc2lvbkRpcmVjdGl2ZUlucHV0IHtcbiAgICB0eXBlSWQ6IHN0cmluZztcbiAgICBkYXRhOiBhbnlcbn0iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXV1dmlzLWNsaWVudC1zaGVsbC1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL3l1dXZpcy1jbGllbnQtc2hlbGwtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
package/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export * from './lib/client-shell.interface';
2
+ export * from './lib/services/command-palette/command-palette.interface';
3
+ export * from './lib/services/command-palette/command-palette.service';
4
+ export * from './lib/services/command-palette/command-palette/command-palette.component';
5
+ export * from './lib/services/shell-notifications/shell-notifications.interface';
6
+ export * from './lib/services/shell-notifications/shell-notifications.service';
7
+ export * from './lib/services/shell/shell.service';
8
+ export * from './lib/tile-extension.interface';
9
+ export * from './lib/services/shell/shell.extentions.service';
@@ -0,0 +1,8 @@
1
+ export declare const CLIENT_SHELL_ASSETS: {
2
+ icons: {
3
+ appIcon: string;
4
+ settings: string;
5
+ logout: string;
6
+ notifications: string;
7
+ };
8
+ };
@@ -0,0 +1,55 @@
1
+ import { Type } from '@angular/core';
2
+ import { Route } from '@angular/router';
3
+ import { ObjectCreateFlavor, ObjectTypeFlavor, VirtualObjectType } from '@yuuvis/client-core';
4
+ export interface ClientShellConfig {
5
+ icons?: {
6
+ appIcon?: string;
7
+ logout?: string;
8
+ settings?: string;
9
+ notifications?: string;
10
+ };
11
+ }
12
+ export interface App extends Route {
13
+ id: string;
14
+ icon?: string;
15
+ permissions?: AppPermission;
16
+ }
17
+ export interface AppPermission {
18
+ allow: string[];
19
+ deny: string[];
20
+ }
21
+ export interface AccentColor {
22
+ label: string;
23
+ name: string;
24
+ tone: string;
25
+ }
26
+ export interface ShellAppSettings {
27
+ appID: string;
28
+ label: string;
29
+ properties: ShellAppSettingProperty[];
30
+ }
31
+ export interface ShellAppSettingProperty {
32
+ label: string;
33
+ name: string;
34
+ type: string;
35
+ value?: string | boolean | number;
36
+ }
37
+ export interface AppSchema {
38
+ id: string;
39
+ name: string;
40
+ icon: string;
41
+ types: Record<string, VirtualObjectType>;
42
+ flavors: AppSchemaFlavor[];
43
+ createFlavors?: ObjectCreateFlavor[];
44
+ }
45
+ export type ObjectFlavor = AppSchemaFlavor & {
46
+ app: string;
47
+ };
48
+ export interface AppSchemaFlavor extends ObjectTypeFlavor {
49
+ objectTypeID: string;
50
+ descriptionKey?: string;
51
+ applyComponent?: Type<any>;
52
+ }
53
+ export declare enum GlobalShortcut {
54
+ search = "search"
55
+ }
@@ -0,0 +1,31 @@
1
+ import { AfterViewInit, ElementRef, EventEmitter, OnInit } from '@angular/core';
2
+ import { CommandPaletteCommand, DisabledCause } from '../command-palette.interface';
3
+ import { CommandPaletteService } from '../command-palette.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class CommandPaletteComponent implements OnInit, AfterViewInit {
6
+ private cmdService;
7
+ private elRef;
8
+ private _commands;
9
+ private _cci;
10
+ set currentCommandIndex(i: number);
11
+ get currentCommandIndex(): number;
12
+ commands: CommandPaletteCommand[];
13
+ searchTerm: string;
14
+ keepFocus: boolean;
15
+ message: string | undefined;
16
+ disabledCauses: DisabledCause[];
17
+ placeholder: string | undefined;
18
+ searchTermChange: EventEmitter<string>;
19
+ onArrowDown(e: KeyboardEvent): void;
20
+ onArrowUp(e: KeyboardEvent): void;
21
+ onEnter(): void;
22
+ constructor(cmdService: CommandPaletteService, elRef: ElementRef);
23
+ onTermChange(term: string): void;
24
+ onInputBlur(): void;
25
+ triggerCommand(command?: CommandPaletteCommand): void;
26
+ highlight(txt: string | undefined): string | undefined;
27
+ ngOnInit(): void;
28
+ ngAfterViewInit(): void;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<CommandPaletteComponent, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<CommandPaletteComponent, "yuv-command-palette", never, {}, { "searchTermChange": "searchTermChange"; }, never, never, true, never>;
31
+ }
@@ -0,0 +1,16 @@
1
+ export interface CommandPaletteModuleConfig {
2
+ triggerKey?: string;
3
+ accentColor?: string;
4
+ searchModeIndicator?: string;
5
+ placeholder?: string;
6
+ }
7
+ export interface CommandPaletteCommand {
8
+ id: string;
9
+ label: string;
10
+ description?: string;
11
+ callback?: () => void;
12
+ }
13
+ export interface DisabledCause {
14
+ id: string;
15
+ message: string;
16
+ }
@@ -0,0 +1,41 @@
1
+ import { Observable } from 'rxjs';
2
+ import { CommandPaletteCommand, DisabledCause } from './command-palette.interface';
3
+ import * as i0 from "@angular/core";
4
+ export declare class CommandPaletteService {
5
+ private overlayService;
6
+ readonly actionKey: string;
7
+ private _ac;
8
+ private overlayRef;
9
+ private overlayVisible;
10
+ disabledCauses: DisabledCause[];
11
+ placeholder: string;
12
+ private overlayVisibleSource;
13
+ overlayVisible$: Observable<boolean>;
14
+ private commands;
15
+ private commandSource;
16
+ command$: Observable<CommandPaletteCommand>;
17
+ onSearchTerm: (term: string, cb: (res: CommandPaletteCommand[]) => void) => void;
18
+ constructor();
19
+ getCommands(): CommandPaletteCommand[];
20
+ registerCommand(command: CommandPaletteCommand): Observable<CommandPaletteCommand>;
21
+ registerCommands(commands: CommandPaletteCommand[]): Observable<CommandPaletteCommand>;
22
+ unregisterCommand(id: string): void;
23
+ unregisterCommands(ids: string[]): void;
24
+ /**
25
+ * Updates the properties of the registered commands. This is usefull when
26
+ * the language of the app changes and you want to update the commands labels.
27
+ * Based on the IDs propeties of the registered commands will be updated.
28
+ * @param cmds Commands containing the updated properties
29
+ */
30
+ updateCommands(cmds: CommandPaletteCommand[]): void;
31
+ triggerCommand(cmd: CommandPaletteCommand): void;
32
+ addDisabledCause(cause: DisabledCause): void;
33
+ removeDisabledCause(id: string): void;
34
+ removeAllDisabledCauses(): void;
35
+ private _processCommands;
36
+ private _actionKeyClick;
37
+ private appendComponentToBody;
38
+ private removeComponentFromBody;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<CommandPaletteService, never>;
40
+ static ɵprov: i0.ɵɵInjectableDeclaration<CommandPaletteService>;
41
+ }
@@ -0,0 +1,2 @@
1
+ import { EnvironmentProviders, ImportProvidersSource } from '@angular/core';
2
+ export declare const importShellExtentions: (extentions: ImportProvidersSource[]) => EnvironmentProviders[];