cloud-ide-layout 1.0.8 → 1.0.10

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 (83) hide show
  1. package/README.md +34 -448
  2. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs} +335 -343
  3. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs.map → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs.map} +1 -1
  4. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs} +69 -67
  5. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs.map → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs.map} +1 -1
  6. package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs} +56 -51
  7. package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs.map → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs.map} +1 -1
  8. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs} +28 -32
  9. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs.map → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs.map} +1 -1
  10. package/fesm2022/cloud-ide-layout.mjs +1 -1
  11. package/index.d.ts +579 -3
  12. package/package.json +4 -6
  13. package/esm2022/cloud-ide-layout.mjs +0 -5
  14. package/esm2022/lib/cloud-ide-layout.component.mjs +0 -16
  15. package/esm2022/lib/cloud-ide-layout.routes.mjs +0 -28
  16. package/esm2022/lib/cloud-ide-layout.service.mjs +0 -14
  17. package/esm2022/lib/layout/console/console-wrapper/console-wrapper.component.mjs +0 -11
  18. package/esm2022/lib/layout/console/console.service.mjs +0 -28
  19. package/esm2022/lib/layout/footer/footer-wrapper/footer-wrapper.component.mjs +0 -20
  20. package/esm2022/lib/layout/footer/footer.service.mjs +0 -28
  21. package/esm2022/lib/layout/header/header-wrapper/header-wrapper.component.mjs +0 -84
  22. package/esm2022/lib/layout/header/header.service.mjs +0 -28
  23. package/esm2022/lib/layout/home/home-wrapper/home-wrapper.component.mjs +0 -198
  24. package/esm2022/lib/layout/layout/layout-wrapper/layout-wrapper.component.mjs +0 -28
  25. package/esm2022/lib/layout/request/request-wrapper/request-wrapper.component.mjs +0 -60
  26. package/esm2022/lib/layout/request/request.service.mjs +0 -235
  27. package/esm2022/lib/layout/request/tab-content/tab-content.component.mjs +0 -84
  28. package/esm2022/lib/layout/shared/shared-wrapper/shared-wrapper.component.mjs +0 -49
  29. package/esm2022/lib/layout/shared/shared.service.mjs +0 -508
  30. package/esm2022/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.mjs +0 -488
  31. package/esm2022/lib/layout/sidebar/sidebar.service.mjs +0 -35
  32. package/esm2022/lib/layout/sidedrawer/cide-lyt-drawer-base.class.mjs +0 -40
  33. package/esm2022/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.mjs +0 -296
  34. package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.mjs +0 -175
  35. package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.mjs +0 -51
  36. package/esm2022/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.mjs +0 -257
  37. package/esm2022/lib/layout/sidedrawer/sidedrawer.service.mjs +0 -70
  38. package/esm2022/lib/services/app-state/app-state-helper.service.mjs +0 -222
  39. package/esm2022/lib/services/app-state/app-state.service.mjs +0 -256
  40. package/esm2022/lib/services/app-state/index.mjs +0 -3
  41. package/esm2022/lib/services/cache-manager/cache-manager.service.mjs +0 -112
  42. package/esm2022/lib/services/file-manager/file-manager.service.mjs +0 -21
  43. package/esm2022/lib/services/tab-state.service.mjs +0 -128
  44. package/esm2022/lib/services/theme/theme.service.mjs +0 -151
  45. package/esm2022/lib/services/user-status/user-status.service.mjs +0 -135
  46. package/esm2022/lib/utils/custom-route-reuse-strategy.mjs +0 -61
  47. package/esm2022/lib/utils/index.mjs +0 -2
  48. package/esm2022/public-api.mjs +0 -18
  49. package/lib/cloud-ide-layout.component.d.ts +0 -5
  50. package/lib/cloud-ide-layout.routes.d.ts +0 -3
  51. package/lib/cloud-ide-layout.service.d.ts +0 -6
  52. package/lib/layout/console/console-wrapper/console-wrapper.component.d.ts +0 -5
  53. package/lib/layout/console/console.service.d.ts +0 -9
  54. package/lib/layout/footer/footer-wrapper/footer-wrapper.component.d.ts +0 -9
  55. package/lib/layout/footer/footer.service.d.ts +0 -9
  56. package/lib/layout/header/header-wrapper/header-wrapper.component.d.ts +0 -25
  57. package/lib/layout/header/header.service.d.ts +0 -9
  58. package/lib/layout/home/home-wrapper/home-wrapper.component.d.ts +0 -94
  59. package/lib/layout/layout/layout-wrapper/layout-wrapper.component.d.ts +0 -5
  60. package/lib/layout/request/request-wrapper/request-wrapper.component.d.ts +0 -14
  61. package/lib/layout/request/request.service.d.ts +0 -60
  62. package/lib/layout/request/tab-content/tab-content.component.d.ts +0 -19
  63. package/lib/layout/shared/shared-wrapper/shared-wrapper.component.d.ts +0 -17
  64. package/lib/layout/shared/shared.service.d.ts +0 -114
  65. package/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.d.ts +0 -140
  66. package/lib/layout/sidebar/sidebar.service.d.ts +0 -12
  67. package/lib/layout/sidedrawer/cide-lyt-drawer-base.class.d.ts +0 -16
  68. package/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.d.ts +0 -71
  69. package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.d.ts +0 -48
  70. package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.d.ts +0 -13
  71. package/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.d.ts +0 -30
  72. package/lib/layout/sidedrawer/sidedrawer.service.d.ts +0 -30
  73. package/lib/services/app-state/app-state-helper.service.d.ts +0 -150
  74. package/lib/services/app-state/app-state.service.d.ts +0 -85
  75. package/lib/services/app-state/index.d.ts +0 -3
  76. package/lib/services/cache-manager/cache-manager.service.d.ts +0 -64
  77. package/lib/services/file-manager/file-manager.service.d.ts +0 -9
  78. package/lib/services/tab-state.service.d.ts +0 -79
  79. package/lib/services/theme/theme.service.d.ts +0 -71
  80. package/lib/services/user-status/user-status.service.d.ts +0 -57
  81. package/lib/utils/custom-route-reuse-strategy.d.ts +0 -15
  82. package/lib/utils/index.d.ts +0 -1
  83. package/public-api.d.ts +0 -12
@@ -1,112 +0,0 @@
1
- import { Injectable, inject, computed } from '@angular/core';
2
- import { CideLytSharedService } from '../../layout/shared/shared.service';
3
- import * as i0 from "@angular/core";
4
- export class CacheManagerService {
5
- constructor() {
6
- this.sharedService = inject(CideLytSharedService);
7
- // Computed cache statistics
8
- this.cacheStats = computed(() => {
9
- const info = this.sharedService.cacheInfo();
10
- return {
11
- ...info,
12
- hitRatio: info.totalCached > 0 ? (info.validCached / info.totalCached) * 100 : 0,
13
- memoryEstimate: this.estimateCacheMemoryUsage()
14
- };
15
- });
16
- // Public access to cache state
17
- this.isLoading = (pageCode) => this.sharedService.isLoading(pageCode);
18
- this.getCachedData = (pageCode) => this.sharedService.getCachedPageData(pageCode);
19
- }
20
- /**
21
- * Get page data with caching - this is the main method components should use
22
- */
23
- getPageData(pageCode, forceRefresh = false) {
24
- return this.sharedService.loadAndProcessPageData({ sypg_page_code: pageCode }, { forceRefresh, setTitle: true, setSidebarContext: true, updateLayout: true });
25
- }
26
- /**
27
- * Preload multiple pages for better performance
28
- */
29
- preloadPages(pageCodes) {
30
- console.log(`🚀 PRELOADING: Starting preload for ${pageCodes.length} pages`);
31
- this.sharedService.preloadPageData(pageCodes);
32
- }
33
- /**
34
- * Invalidate specific page cache
35
- */
36
- invalidatePage(pageCode) {
37
- this.sharedService.invalidateCache(pageCode);
38
- }
39
- /**
40
- * Clear all cache
41
- */
42
- clearCache() {
43
- this.sharedService.clearAllCache();
44
- }
45
- /**
46
- * Get cache status for debugging
47
- */
48
- getCacheStatus() {
49
- const cache = this.sharedService.pageDataCache();
50
- const loadingStates = this.sharedService.loadingStates();
51
- const allPageCodes = new Set([
52
- ...Object.keys(cache),
53
- ...Object.keys(loadingStates)
54
- ]);
55
- return Array.from(allPageCodes).map(pageCode => ({
56
- pageCode,
57
- cached: !!cache[pageCode],
58
- expired: cache[pageCode] ? !this.isCacheValid(cache[pageCode]) : false,
59
- loading: !!loadingStates[pageCode]
60
- }));
61
- }
62
- /**
63
- * Estimate memory usage of cache (rough estimate)
64
- */
65
- estimateCacheMemoryUsage() {
66
- const cache = this.sharedService.pageDataCache();
67
- const jsonString = JSON.stringify(cache);
68
- const bytes = new Blob([jsonString]).size;
69
- if (bytes < 1024)
70
- return `${bytes} B`;
71
- if (bytes < 1024 * 1024)
72
- return `${(bytes / 1024).toFixed(1)} KB`;
73
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
74
- }
75
- /**
76
- * Check if cache entry is valid
77
- */
78
- isCacheValid(cached) {
79
- if (!cached)
80
- return false;
81
- return Date.now() - cached.timestamp < cached.ttl;
82
- }
83
- /**
84
- * Export cache data for debugging or backup
85
- */
86
- exportCacheData() {
87
- return JSON.stringify(this.sharedService.pageDataCache(), null, 2);
88
- }
89
- /**
90
- * Get performance metrics
91
- */
92
- getPerformanceMetrics() {
93
- const stats = this.cacheStats();
94
- const loadingStates = this.sharedService.loadingStates();
95
- return {
96
- totalPages: stats.totalCached,
97
- cachedPages: stats.validCached,
98
- loadingPages: Object.keys(loadingStates).length,
99
- cacheHitRatio: stats.hitRatio,
100
- // averageResponseTime could be implemented with timing tracking
101
- };
102
- }
103
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CacheManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
104
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CacheManagerService, providedIn: 'root' }); }
105
- }
106
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CacheManagerService, decorators: [{
107
- type: Injectable,
108
- args: [{
109
- providedIn: 'root'
110
- }]
111
- }] });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWxheW91dC9zcmMvbGliL3NlcnZpY2VzL2NhY2hlLW1hbmFnZXIvY2FjaGUtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFPMUUsTUFBTSxPQUFPLG1CQUFtQjtJQUhoQztRQUlVLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFckQsNEJBQTRCO1FBQ1osZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixjQUFjLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFO2FBQ2hELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILCtCQUErQjtRQUNmLGNBQVMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pFLGtCQUFhLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tB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O0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxxQkFBcUI7UUFPbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFekQsT0FBTztZQUNMLFVBQVUsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTTtZQUMvQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDN0IsZ0VBQWdFO1NBQ2pFLENBQUM7SUFDSixDQUFDOzhHQXJIVSxtQkFBbUI7a0hBQW5CLG1CQUFtQixjQUZsQixNQUFNOzsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaWRlTHl0U2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL2xheW91dC9zaGFyZWQvc2hhcmVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlc2lnbkNvbmZpZ0NvbnRyb2xsZXJSZXNwb25zZSB9IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FjaGVNYW5hZ2VyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBzaGFyZWRTZXJ2aWNlID0gaW5qZWN0KENpZGVMeXRTaGFyZWRTZXJ2aWNlKTtcclxuXHJcbiAgLy8gQ29tcHV0ZWQgY2FjaGUgc3RhdGlzdGljc1xyXG4gIHB1YmxpYyByZWFkb25seSBjYWNoZVN0YXRzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc2hhcmVkU2VydmljZS5jYWNoZUluZm8oKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmluZm8sXHJcbiAgICAgIGhpdFJhdGlvOiBpbmZvLnRvdGFsQ2FjaGVkID4gMCA/IChpbmZvLnZhbGlkQ2FjaGVkIC8gaW5mby50b3RhbENhY2hlZCkgKiAxMDAgOiAwLFxyXG4gICAgICBtZW1vcnlFc3RpbWF0ZTogdGhpcy5lc3RpbWF0ZUNhY2hlTWVtb3J5VXNhZ2UoKVxyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgLy8gUHVibGljIGFjY2VzcyB0byBjYWNoZSBzdGF0ZVxyXG4gIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmcgPSAocGFnZUNvZGU6IHN0cmluZykgPT4gdGhpcy5zaGFyZWRTZXJ2aWNlLmlzTG9hZGluZyhwYWdlQ29kZSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGdldENhY2hlZERhdGEgPSAocGFnZUNvZGU6IHN0cmluZykgPT4gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENhY2hlZFBhZ2VEYXRhKHBhZ2VDb2RlKTtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHBhZ2UgZGF0YSB3aXRoIGNhY2hpbmcgLSB0aGlzIGlzIHRoZSBtYWluIG1ldGhvZCBjb21wb25lbnRzIHNob3VsZCB1c2VcclxuICAgKi9cclxuICBnZXRQYWdlRGF0YShwYWdlQ29kZTogc3RyaW5nLCBmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IE9ic2VydmFibGU8ZGVzaWduQ29uZmlnQ29udHJvbGxlclJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRTZXJ2aWNlLmxvYWRBbmRQcm9jZXNzUGFnZURhdGEoXHJcbiAgICAgIHsgc3lwZ19wYWdlX2NvZGU6IHBhZ2VDb2RlIH0sXHJcbiAgICAgIHsgZm9yY2VSZWZyZXNoLCBzZXRUaXRsZTogdHJ1ZSwgc2V0U2lkZWJhckNvbnRleHQ6IHRydWUsIHVwZGF0ZUxheW91dDogdHJ1ZSB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJlbG9hZCBtdWx0aXBsZSBwYWdlcyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXHJcbiAgICovXHJcbiAgcHJlbG9hZFBhZ2VzKHBhZ2VDb2Rlczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKGDwn5qAIFBSRUxPQURJTkc6IFN0YXJ0aW5nIHByZWxvYWQgZm9yICR7cGFnZUNvZGVzLmxlbmd0aH0gcGFnZXNgKTtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5wcmVsb2FkUGFnZURhdGEocGFnZUNvZGVzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludmFsaWRhdGUgc3BlY2lmaWMgcGFnZSBjYWNoZVxyXG4gICAqL1xyXG4gIGludmFsaWRhdGVQYWdlKHBhZ2VDb2RlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5pbnZhbGlkYXRlQ2FjaGUocGFnZUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIGNhY2hlXHJcbiAgICovXHJcbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jbGVhckFsbENhY2hlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY2FjaGUgc3RhdHVzIGZvciBkZWJ1Z2dpbmdcclxuICAgKi9cclxuICBnZXRDYWNoZVN0YXR1cygpOiB7IHBhZ2VDb2RlOiBzdHJpbmc7IGNhY2hlZDogYm9vbGVhbjsgZXhwaXJlZDogYm9vbGVhbjsgbG9hZGluZzogYm9vbGVhbiB9W10ge1xyXG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnNoYXJlZFNlcnZpY2UucGFnZURhdGFDYWNoZSgpO1xyXG4gICAgY29uc3QgbG9hZGluZ1N0YXRlcyA9IHRoaXMuc2hhcmVkU2VydmljZS5sb2FkaW5nU3RhdGVzKCk7XHJcbiAgICBcclxuICAgIGNvbnN0IGFsbFBhZ2VDb2RlcyA9IG5ldyBTZXQoW1xyXG4gICAgICAuLi5PYmplY3Qua2V5cyhjYWNoZSksXHJcbiAgICAgIC4uLk9iamVjdC5rZXlzKGxvYWRpbmdTdGF0ZXMpXHJcbiAgICBdKTtcclxuXHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhbGxQYWdlQ29kZXMpLm1hcChwYWdlQ29kZSA9PiAoe1xyXG4gICAgICBwYWdlQ29kZSxcclxuICAgICAgY2FjaGVkOiAhIWNhY2hlW3BhZ2VDb2RlXSxcclxuICAgICAgZXhwaXJlZDogY2FjaGVbcGFnZUNvZGVdID8gIXRoaXMuaXNDYWNoZVZhbGlkKGNhY2hlW3BhZ2VDb2RlXSkgOiBmYWxzZSxcclxuICAgICAgbG9hZGluZzogISFsb2FkaW5nU3RhdGVzW3BhZ2VDb2RlXVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXN0aW1hdGUgbWVtb3J5IHVzYWdlIG9mIGNhY2hlIChyb3VnaCBlc3RpbWF0ZSlcclxuICAgKi9cclxuICBwcml2YXRlIGVzdGltYXRlQ2FjaGVNZW1vcnlVc2FnZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnNoYXJlZFNlcnZpY2UucGFnZURhdGFDYWNoZSgpO1xyXG4gICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNhY2hlKTtcclxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IEJsb2IoW2pzb25TdHJpbmddKS5zaXplO1xyXG4gICAgXHJcbiAgICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYCR7Ynl0ZXN9IEJgO1xyXG4gICAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEwMjQpIHJldHVybiBgJHsoYnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmA7XHJcbiAgICByZXR1cm4gYCR7KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKX0gTUJgO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgY2FjaGUgZW50cnkgaXMgdmFsaWRcclxuICAgKi9cclxuICBwcml2YXRlIGlzQ2FjaGVWYWxpZChjYWNoZWQ6IHsgdGltZXN0YW1wOiBudW1iZXI7IHR0bDogbnVtYmVyIH0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgIGlmICghY2FjaGVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGNhY2hlZC50aW1lc3RhbXAgPCBjYWNoZWQudHRsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwb3J0IGNhY2hlIGRhdGEgZm9yIGRlYnVnZ2luZyBvciBiYWNrdXBcclxuICAgKi9cclxuICBleHBvcnRDYWNoZURhdGEoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UucGFnZURhdGFDYWNoZSgpLCBudWxsLCAyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwZXJmb3JtYW5jZSBtZXRyaWNzXHJcbiAgICovXHJcbiAgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk6IHtcclxuICAgIHRvdGFsUGFnZXM6IG51bWJlcjtcclxuICAgIGNhY2hlZFBhZ2VzOiBudW1iZXI7XHJcbiAgICBsb2FkaW5nUGFnZXM6IG51bWJlcjtcclxuICAgIGNhY2hlSGl0UmF0aW86IG51bWJlcjtcclxuICAgIGF2ZXJhZ2VSZXNwb25zZVRpbWU/OiBudW1iZXI7XHJcbiAgfSB7XHJcbiAgICBjb25zdCBzdGF0cyA9IHRoaXMuY2FjaGVTdGF0cygpO1xyXG4gICAgY29uc3QgbG9hZGluZ1N0YXRlcyA9IHRoaXMuc2hhcmVkU2VydmljZS5sb2FkaW5nU3RhdGVzKCk7XHJcbiAgICBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvdGFsUGFnZXM6IHN0YXRzLnRvdGFsQ2FjaGVkLFxyXG4gICAgICBjYWNoZWRQYWdlczogc3RhdHMudmFsaWRDYWNoZWQsXHJcbiAgICAgIGxvYWRpbmdQYWdlczogT2JqZWN0LmtleXMobG9hZGluZ1N0YXRlcykubGVuZ3RoLFxyXG4gICAgICBjYWNoZUhpdFJhdGlvOiBzdGF0cy5oaXRSYXRpbyxcclxuICAgICAgLy8gYXZlcmFnZVJlc3BvbnNlVGltZSBjb3VsZCBiZSBpbXBsZW1lbnRlZCB3aXRoIHRpbWluZyB0cmFja2luZ1xyXG4gICAgfTtcclxuICB9XHJcbn0gIl19
@@ -1,21 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable, inject } from '@angular/core';
3
- import { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
4
- import * as i0 from "@angular/core";
5
- export class CideLytFileManagerService {
6
- constructor() {
7
- this.http = inject(HttpClient);
8
- }
9
- getFileDetails(body) {
10
- return this.http.post(cidePath.join([hostManagerRoutesUrl.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.getFileDetails]), body);
11
- }
12
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
13
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, providedIn: 'root' }); }
14
- }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, decorators: [{
16
- type: Injectable,
17
- args: [{
18
- providedIn: 'root'
19
- }]
20
- }] });
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtbGF5b3V0L3NyYy9saWIvc2VydmljZXMvZmlsZS1tYW5hZ2VyL2ZpbGUtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBK0MsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLakksTUFBTSxPQUFPLHlCQUF5QjtJQUh0QztRQUlVLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FLbkM7SUFIQyxjQUFjLENBQUMsSUFBa0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUE4QyxDQUFDO0lBQ3RMLENBQUM7OEdBTFUseUJBQXlCO2tIQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNpZGVQYXRoLCBjb3JlUm91dGVzVXJsLCBob3N0TWFuYWdlclJvdXRlc1VybCwgTUZpbGVNYW5hZ2VyLCBmaWxlTWFuYWdlckNvbnRyb2xsZXJSZXNwb25zZSB9IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUx5dEZpbGVNYW5hZ2VyU2VydmljZSB7XG4gIHByaXZhdGUgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICBnZXRGaWxlRGV0YWlscyhib2R5OiBNRmlsZU1hbmFnZXIpOiBPYnNlcnZhYmxlPGZpbGVNYW5hZ2VyQ29udHJvbGxlclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGNpZGVQYXRoLmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsLmNpZGVTdWl0ZUhvc3QsIGNvcmVSb3V0ZXNVcmw/Lm1vZHVsZSwgY29yZVJvdXRlc1VybD8uZ2V0RmlsZURldGFpbHNdKSwgYm9keSkgYXMgT2JzZXJ2YWJsZTxmaWxlTWFuYWdlckNvbnRyb2xsZXJSZXNwb25zZT47XG4gIH1cbn1cbiJdfQ==
@@ -1,128 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { distinctUntilChanged, map } from 'rxjs/operators';
4
- import { merge } from 'lodash';
5
- import * as i0 from "@angular/core";
6
- /**
7
- * Creates the default state for a new tab.
8
- */
9
- const createDefaultComponentState = () => ({
10
- sideDrawer: { isOpen: false, activeComponent: null, componentState: {} },
11
- footer: { someData: '' },
12
- console: { history: [] },
13
- });
14
- export class TabStateService {
15
- /**
16
- * Adds a new tab to the state.
17
- * @param title The title for the new tab.
18
- * @param id An optional unique ID. If not provided, one will be generated.
19
- * @returns The ID of the newly created tab.
20
- */
21
- addTab(title, id) {
22
- const newTabId = id || `tab_${Date.now()}_${Math.random()}`;
23
- const newTab = {
24
- id: newTabId,
25
- title,
26
- componentState: createDefaultComponentState(),
27
- };
28
- const currentTabs = this._tabsState.getValue();
29
- const newTabs = new Map(currentTabs).set(newTabId, newTab);
30
- this._tabsState.next(newTabs);
31
- this.setActiveTab(newTabId);
32
- return newTabId;
33
- }
34
- /**
35
- * Removes a tab from the state.
36
- * @param tabIdToRemove The ID of the tab to remove.
37
- */
38
- removeTab(tabIdToRemove) {
39
- const currentTabs = this._tabsState.getValue();
40
- if (!currentTabs.has(tabIdToRemove)) {
41
- return;
42
- }
43
- const newTabs = new Map(currentTabs);
44
- newTabs.delete(tabIdToRemove);
45
- this._tabsState.next(newTabs);
46
- }
47
- constructor() {
48
- // Holds the state for all open tabs, keyed by tab ID.
49
- this._tabsState = new BehaviorSubject(new Map());
50
- // Holds the ID of the currently active tab.
51
- this._activeTabId = new BehaviorSubject(null);
52
- /** An observable of all open tabs. */
53
- this.tabs$ = this._tabsState.pipe(map(tabsMap => Array.from(tabsMap.values())));
54
- /** An observable of the currently active tab's ID. */
55
- this.activeTabId$ = this._activeTabId.asObservable().pipe(distinctUntilChanged());
56
- /** An observable of the state of the currently active tab. */
57
- this.activeTabState$ = this.activeTabId$.pipe(map(activeId => (activeId ? this._tabsState.getValue().get(activeId) ?? null : null)),
58
- // Use a deep-ish comparison to prevent emissions when only the object reference changes
59
- distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)));
60
- /** An observable of just the component-specific state for the active tab. */
61
- this.activeComponentState$ = this.activeTabState$.pipe(map(activeTab => activeTab?.componentState ?? null));
62
- // You can initialize with default tabs if needed
63
- // For example:
64
- // this.addTab('Welcome Tab');
65
- }
66
- /**
67
- * Sets the currently active tab.
68
- * @param tabId The unique identifier of the tab to activate.
69
- */
70
- setActiveTab(tabId) {
71
- if (this._activeTabId.getValue() !== tabId) {
72
- this._activeTabId.next(tabId);
73
- }
74
- }
75
- /**
76
- * Updates the state for the currently active tab.
77
- * This performs a deep merge to avoid overwriting nested state.
78
- * @param partialState The partial state to update for the active tab.
79
- */
80
- updateActiveTabState(partialState) {
81
- const activeId = this._activeTabId.getValue();
82
- if (!activeId) {
83
- console.warn('Cannot update state, no active tab.');
84
- return;
85
- }
86
- const tabs = this._tabsState.getValue();
87
- const activeTabState = tabs.get(activeId);
88
- if (activeTabState) {
89
- // Use lodash merge for a deep merge
90
- const updatedState = merge({}, activeTabState, { componentState: partialState });
91
- const newTabsState = new Map(tabs);
92
- newTabsState.set(activeId, updatedState);
93
- this._tabsState.next(newTabsState);
94
- }
95
- }
96
- /**
97
- * Gets an observable for a specific tab's state.
98
- * @param tabId The ID of the tab to observe.
99
- */
100
- getTabState(tabId) {
101
- return this._tabsState.pipe(map(tabs => tabs.get(tabId)));
102
- }
103
- /**
104
- * Determines the ID of the next tab to activate when a tab is closed.
105
- * @param idToRemove The ID of the tab being removed.
106
- * @returns The ID of the next tab to activate, or null if no tabs are left.
107
- */
108
- getNextActiveTabId(idToRemove) {
109
- const tabsMap = this._tabsState.getValue();
110
- if (tabsMap.size <= 1) {
111
- return null;
112
- }
113
- const tabIds = Array.from(tabsMap.keys());
114
- const removedIndex = tabIds.indexOf(idToRemove);
115
- // If it's the last tab in the list, activate the one before it. Otherwise, activate the next one.
116
- const nextIndex = removedIndex === tabIds.length - 1 ? removedIndex - 1 : removedIndex + 1;
117
- return tabIds[nextIndex];
118
- }
119
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: TabStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
120
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: TabStateService, providedIn: 'root' }); }
121
- }
122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: TabStateService, decorators: [{
123
- type: Injectable,
124
- args: [{
125
- providedIn: 'root',
126
- }]
127
- }], ctorParameters: () => [] });
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtbGF5b3V0L3NyYy9saWIvc2VydmljZXMvdGFiLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQThCL0I7O0dBRUc7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFO0lBQ3hFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7SUFDeEIsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtDQUN6QixDQUFDLENBQUM7QUFLSCxNQUFNLE9BQU8sZUFBZTtJQTJCMUI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsS0FBYSxFQUFFLEVBQVc7UUFDdEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzVELE1BQU0sTUFBTSxHQUFhO1lBQ3ZCLEVBQUUsRUFBRSxRQUFRO1lBQ1osS0FBSztZQUNMLGNBQWMsRUFBRSwyQkFBMkIsRUFBRTtTQUM5QyxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxNQUFN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SyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUMzRixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQixDQUFDOzhHQWpJVSxlQUFlO2tIQUFmLGVBQWUsY0FGZCxNQUFNOzsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoJztcclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIHRoZSBzaGFwZSBvZiB0aGUgc3RhdGUgZm9yIGNvbXBvbmVudHMgdGhhdCBuZWVkIHRvIHBlcnNpc3RcclxuICogZGF0YSBvbiBhIHBlci10YWIgYmFzaXMuIFVzaW5nIFBhcnRpYWw8PiBmb3IgZmxleGliaWxpdHkuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBlclRhYlN0YXRlIHtcclxuICBzaWRlRHJhd2VyPzoge1xyXG4gICAgaXNPcGVuOiBib29sZWFuO1xyXG4gICAgYWN0aXZlQ29tcG9uZW50OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgY29tcG9uZW50U3RhdGU/OiB7IFtjb21wb25lbnRLZXk6IHN0cmluZ106IHVua25vd24gfTtcclxuICB9O1xyXG4gIGZvb3Rlcj86IHtcclxuICAgIHNvbWVEYXRhPzogc3RyaW5nO1xyXG4gIH07XHJcbiAgY29uc29sZT86IHtcclxuICAgIGhpc3Rvcnk6IHN0cmluZ1tdO1xyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBlbnRpcmUgc3RhdGUgZm9yIGEgc2luZ2xlIHRhYiwgaW5jbHVkaW5nIGl0cyBtZXRhZGF0YVxyXG4gKiBhbmQgdGhlIHN0YXRlIG9mIHZhcmlvdXMgY29tcG9uZW50cy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFiU3RhdGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBjb21wb25lbnRTdGF0ZTogUGVyVGFiU3RhdGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIHRoZSBkZWZhdWx0IHN0YXRlIGZvciBhIG5ldyB0YWIuXHJcbiAqL1xyXG5jb25zdCBjcmVhdGVEZWZhdWx0Q29tcG9uZW50U3RhdGUgPSAoKTogUGVyVGFiU3RhdGUgPT4gKHtcclxuICBzaWRlRHJhd2VyOiB7IGlzT3BlbjogZmFsc2UsIGFjdGl2ZUNvbXBvbmVudDogbnVsbCwgY29tcG9uZW50U3RhdGU6IHt9IH0sXHJcbiAgZm9vdGVyOiB7IHNvbWVEYXRhOiAnJyB9LFxyXG4gIGNvbnNvbGU6IHsgaGlzdG9yeTogW10gfSxcclxufSk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFiU3RhdGVTZXJ2aWNlIHtcclxuICAvLyBIb2xkcyB0aGUgc3RhdGUgZm9yIGFsbCBvcGVuIHRhYnMsIGtleWVkIGJ5IHRhYiBJRC5cclxuICBwcml2YXRlIHJlYWRvbmx5IF90YWJzU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hcDxzdHJpbmcsIFRhYlN0YXRlPj4obmV3IE1hcCgpKTtcclxuXHJcbiAgLy8gSG9sZHMgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYi5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVUYWJJZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIGFsbCBvcGVuIHRhYnMuICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHRhYnMkOiBPYnNlcnZhYmxlPFRhYlN0YXRlW10+ID0gdGhpcy5fdGFic1N0YXRlLnBpcGUoXHJcbiAgICBtYXAodGFic01hcCA9PiBBcnJheS5mcm9tKHRhYnNNYXAudmFsdWVzKCkpKVxyXG4gICk7XHJcblxyXG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYidzIElELiAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmVUYWJJZCQgPSB0aGlzLl9hY3RpdmVUYWJJZC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG5cclxuICAvKiogQW4gb2JzZXJ2YWJsZSBvZiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiLiAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmVUYWJTdGF0ZSQ6IE9ic2VydmFibGU8VGFiU3RhdGUgfCBudWxsPiA9IHRoaXMuYWN0aXZlVGFiSWQkLnBpcGUoXHJcbiAgICBtYXAoYWN0aXZlSWQgPT4gKGFjdGl2ZUlkID8gdGhpcy5fdGFic1N0YXRlLmdldFZhbHVlKCkuZ2V0KGFjdGl2ZUlkKSA/PyBudWxsIDogbnVsbCkpLFxyXG4gICAgLy8gVXNlIGEgZGVlcC1pc2ggY29tcGFyaXNvbiB0byBwcmV2ZW50IGVtaXNzaW9ucyB3aGVuIG9ubHkgdGhlIG9iamVjdCByZWZlcmVuY2UgY2hhbmdlc1xyXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IEpTT04uc3RyaW5naWZ5KHByZXYpID09PSBKU09OLnN0cmluZ2lmeShjdXJyKSlcclxuICApO1xyXG5cclxuICAvKiogQW4gb2JzZXJ2YWJsZSBvZiBqdXN0IHRoZSBjb21wb25lbnQtc3BlY2lmaWMgc3RhdGUgZm9yIHRoZSBhY3RpdmUgdGFiLiAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBhY3RpdmVDb21wb25lbnRTdGF0ZSQ6IE9ic2VydmFibGU8UGVyVGFiU3RhdGUgfCBudWxsPiA9IHRoaXMuYWN0aXZlVGFiU3RhdGUkLnBpcGUoXHJcbiAgICBtYXAoYWN0aXZlVGFiID0+IGFjdGl2ZVRhYj8uY29tcG9uZW50U3RhdGUgPz8gbnVsbClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgbmV3IHRhYiB0byB0aGUgc3RhdGUuXHJcbiAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSBmb3IgdGhlIG5ldyB0YWIuXHJcbiAgICogQHBhcmFtIGlkIEFuIG9wdGlvbmFsIHVuaXF1ZSBJRC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuXHJcbiAgICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBuZXdseSBjcmVhdGVkIHRhYi5cclxuICAgKi9cclxuICBwdWJsaWMgYWRkVGFiKHRpdGxlOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5ld1RhYklkID0gaWQgfHwgYHRhYl8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKX1gO1xyXG4gICAgY29uc3QgbmV3VGFiOiBUYWJTdGF0ZSA9IHtcclxuICAgICAgaWQ6IG5ld1RhYklkLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgY29tcG9uZW50U3RhdGU6IGNyZWF0ZURlZmF1bHRDb21wb25lbnRTdGF0ZSgpLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50VGFicyA9IHRoaXMuX3RhYnNTdGF0ZS5nZXRWYWx1ZSgpO1xyXG4gICAgY29uc3QgbmV3VGFicyA9IG5ldyBNYXAoY3VycmVudFRhYnMpLnNldChuZXdUYWJJZCwgbmV3VGFiKTtcclxuICAgIHRoaXMuX3RhYnNTdGF0ZS5uZXh0KG5ld1RhYnMpO1xyXG4gICAgdGhpcy5zZXRBY3RpdmVUYWIobmV3VGFiSWQpO1xyXG5cclxuICAgIHJldHVybiBuZXdUYWJJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYSB0YWIgZnJvbSB0aGUgc3RhdGUuXHJcbiAgICogQHBhcmFtIHRhYklkVG9SZW1vdmUgVGhlIElEIG9mIHRoZSB0YWIgdG8gcmVtb3ZlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW1vdmVUYWIodGFiSWRUb1JlbW92ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50VGFicyA9IHRoaXMuX3RhYnNTdGF0ZS5nZXRWYWx1ZSgpO1xyXG4gICAgaWYgKCFjdXJyZW50VGFicy5oYXModGFiSWRUb1JlbW92ZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1RhYnMgPSBuZXcgTWFwKGN1cnJlbnRUYWJzKTtcclxuICAgIG5ld1RhYnMuZGVsZXRlKHRhYklkVG9SZW1vdmUpO1xyXG4gICAgdGhpcy5fdGFic1N0YXRlLm5leHQobmV3VGFicyk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIFlvdSBjYW4gaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgdGFicyBpZiBuZWVkZWRcclxuICAgIC8vIEZvciBleGFtcGxlOlxyXG4gICAgLy8gdGhpcy5hZGRUYWIoJ1dlbGNvbWUgVGFiJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYi5cclxuICAgKiBAcGFyYW0gdGFiSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0YWIgdG8gYWN0aXZhdGUuXHJcbiAgICovXHJcbiAgcHVibGljIHNldEFjdGl2ZVRhYih0YWJJZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVRhYklkLmdldFZhbHVlKCkgIT09IHRhYklkKSB7XHJcbiAgICAgIHRoaXMuX2FjdGl2ZVRhYklkLm5leHQodGFiSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgc3RhdGUgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYi5cclxuICAgKiBUaGlzIHBlcmZvcm1zIGEgZGVlcCBtZXJnZSB0byBhdm9pZCBvdmVyd3JpdGluZyBuZXN0ZWQgc3RhdGUuXHJcbiAgICogQHBhcmFtIHBhcnRpYWxTdGF0ZSBUaGUgcGFydGlhbCBzdGF0ZSB0byB1cGRhdGUgZm9yIHRoZSBhY3RpdmUgdGFiLlxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVBY3RpdmVUYWJTdGF0ZShwYXJ0aWFsU3RhdGU6IFBhcnRpYWw8UGVyVGFiU3RhdGU+KTogdm9pZCB7XHJcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuX2FjdGl2ZVRhYklkLmdldFZhbHVlKCk7XHJcbiAgICBpZiAoIWFjdGl2ZUlkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHVwZGF0ZSBzdGF0ZSwgbm8gYWN0aXZlIHRhYi4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhYnMgPSB0aGlzLl90YWJzU3RhdGUuZ2V0VmFsdWUoKTtcclxuICAgIGNvbnN0IGFjdGl2ZVRhYlN0YXRlID0gdGFicy5nZXQoYWN0aXZlSWQpO1xyXG5cclxuICAgIGlmIChhY3RpdmVUYWJTdGF0ZSkge1xyXG4gICAgICAvLyBVc2UgbG9kYXNoIG1lcmdlIGZvciBhIGRlZXAgbWVyZ2VcclxuICAgICAgY29uc3QgdXBkYXRlZFN0YXRlID0gbWVyZ2Uoe30sIGFjdGl2ZVRhYlN0YXRlLCB7IGNvbXBvbmVudFN0YXRlOiBwYXJ0aWFsU3RhdGUgfSk7XHJcbiAgICAgIGNvbnN0IG5ld1RhYnNTdGF0ZSA9IG5ldyBNYXAodGFicyk7XHJcbiAgICAgIG5ld1RhYnNTdGF0ZS5zZXQoYWN0aXZlSWQsIHVwZGF0ZWRTdGF0ZSk7XHJcbiAgICAgIHRoaXMuX3RhYnNTdGF0ZS5uZXh0KG5ld1RhYnNTdGF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFuIG9ic2VydmFibGUgZm9yIGEgc3BlY2lmaWMgdGFiJ3Mgc3RhdGUuXHJcbiAgICogQHBhcmFtIHRhYklkIFRoZSBJRCBvZiB0aGUgdGFiIHRvIG9ic2VydmUuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFRhYlN0YXRlKHRhYklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRhYlN0YXRlIHwgdW5kZWZpbmVkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFic1N0YXRlLnBpcGUobWFwKHRhYnMgPT4gdGFicy5nZXQodGFiSWQpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBJRCBvZiB0aGUgbmV4dCB0YWIgdG8gYWN0aXZhdGUgd2hlbiBhIHRhYiBpcyBjbG9zZWQuXHJcbiAgICogQHBhcmFtIGlkVG9SZW1vdmUgVGhlIElEIG9mIHRoZSB0YWIgYmVpbmcgcmVtb3ZlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIG5leHQgdGFiIHRvIGFjdGl2YXRlLCBvciBudWxsIGlmIG5vIHRhYnMgYXJlIGxlZnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXROZXh0QWN0aXZlVGFiSWQoaWRUb1JlbW92ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCB0YWJzTWFwID0gdGhpcy5fdGFic1N0YXRlLmdldFZhbHVlKCk7XHJcbiAgICBpZiAodGFic01hcC5zaXplIDw9IDEpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFiSWRzID0gQXJyYXkuZnJvbSh0YWJzTWFwLmtleXMoKSk7XHJcbiAgICBjb25zdCByZW1vdmVkSW5kZXggPSB0YWJJZHMuaW5kZXhPZihpZFRvUmVtb3ZlKTtcclxuXHJcbiAgICAvLyBJZiBpdCdzIHRoZSBsYXN0IHRhYiBpbiB0aGUgbGlzdCwgYWN0aXZhdGUgdGhlIG9uZSBiZWZvcmUgaXQuIE90aGVyd2lzZSwgYWN0aXZhdGUgdGhlIG5leHQgb25lLlxyXG4gICAgY29uc3QgbmV4dEluZGV4ID0gcmVtb3ZlZEluZGV4ID09PSB0YWJJZHMubGVuZ3RoIC0gMSA/IHJlbW92ZWRJbmRleCAtIDEgOiByZW1vdmVkSW5kZXggKyAxO1xyXG4gICAgcmV0dXJuIHRhYklkc1tuZXh0SW5kZXhdO1xyXG4gIH1cclxufSJdfQ==
@@ -1,151 +0,0 @@
1
- import { Injectable, PLATFORM_ID, InjectionToken, signal, inject } from '@angular/core';
2
- import { HttpClient } from '@angular/common/http';
3
- import { tap } from 'rxjs/operators';
4
- import { of } from 'rxjs';
5
- import { cidePath, designConfigRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
6
- import { isPlatformBrowser } from '@angular/common';
7
- import * as i0 from "@angular/core";
8
- // Define an InjectionToken for the environment configuration
9
- // This is needed to inject environment variables into services provided in 'root'
10
- export const ENVIRONMENT_CONFIG = new InjectionToken('ENVIRONMENT_CONFIG');
11
- /**
12
- * Utility function to convert database format keys to CSS format and handle units
13
- * @param key - The database format key (e.g., 'font_size_xxxl')
14
- * @param value - The value to be set
15
- * @returns Object with cssVarName and processed value
16
- */
17
- export function processThemeVariable(key, value) {
18
- // 1. Convert the key from the DB format to the CSS format.
19
- const cssVarName = `${key.replace(/_/g, '-')}`;
20
- // 2. Append the font_size and line_height value to rem
21
- let processedValue = value;
22
- if (cssVarName.includes('font-size') || cssVarName.includes('line-height')) {
23
- processedValue = parseFloat(value) + 'rem';
24
- }
25
- return { cssVarName, processedValue: processedValue };
26
- }
27
- /**
28
- * Sets a single CSS variable on the document root element
29
- * @param key - The database format key (e.g., 'font_size_xxxl')
30
- * @param value - The value to be set
31
- * @param platformId - Platform ID for browser check
32
- */
33
- export function setCSSVariable(key, value, platformId) {
34
- if (isPlatformBrowser(platformId)) {
35
- const { cssVarName, processedValue } = processThemeVariable(key, value);
36
- const root = document.documentElement;
37
- root.style.setProperty(cssVarName, processedValue);
38
- }
39
- }
40
- export class CideLytThemeService {
41
- constructor() {
42
- // Modern Angular signals for reactive state management
43
- this.selectedThemeSignal = signal("");
44
- this.selectedTheme = this.selectedThemeSignal.asReadonly();
45
- // Modern dependency injection
46
- this.http = inject(HttpClient);
47
- this.platformId = inject(PLATFORM_ID);
48
- this.environment = inject(ENVIRONMENT_CONFIG);
49
- }
50
- /**
51
- * Fetches the theme from the API and applies it to the document.
52
- * This method is intended to be called when the theme should actually be applied.
53
- */
54
- fetchAndApplyTheme() {
55
- console.log('Fetching and applying theme via CideLytThemeService...');
56
- return this.loadTheme(); // Use the existing loadTheme logic
57
- }
58
- /**
59
- * Fetches the list of system themes from the API.
60
- */
61
- fetchSystemThemesList() {
62
- return this.http.get(cidePath.join([
63
- hostManagerRoutesUrl.cideSuiteHost,
64
- designConfigRoutesUrl?.module,
65
- designConfigRoutesUrl?.getSystemThemesList
66
- ]));
67
- }
68
- /**
69
- * Internal method to fetch the theme from the API and apply it.
70
- */
71
- loadTheme() {
72
- return this.http.post(cidePath.join([hostManagerRoutesUrl.cideSuiteHost, designConfigRoutesUrl?.module, designConfigRoutesUrl?.getSystemTheme]), { syupth_user_id_user: "659a7ea0a1f0e08246661766" }).pipe(tap(theme => {
73
- console.log("Applying theme:", theme);
74
- this.applyTheme(theme?.data);
75
- }));
76
- }
77
- /**
78
- * Sets the CSS variables on the root element.
79
- * @param theme - An object where keys are CSS variable names (e.g., '--color-text-body')
80
- * and values are the color strings (e.g., '#ffffff').
81
- */
82
- applyTheme(theme) {
83
- console.log("Applying theme:", theme);
84
- let merged = {};
85
- if (theme?.core_system_themes?.syth_properties) {
86
- merged = { ...merged, ...theme.core_system_themes.syth_properties };
87
- this.selectedThemeSignal.set(theme.core_system_themes._id);
88
- }
89
- if (theme?.core_system_organization_themes?.syoth_overrides) {
90
- merged = { ...merged, ...theme.core_system_organization_themes.syoth_overrides };
91
- }
92
- if (theme?.core_system_theme_user_preferences?.syupth_overrides) {
93
- merged = { ...merged, ...theme.core_system_theme_user_preferences.syupth_overrides };
94
- }
95
- console.log("Merged theme:", merged);
96
- // Check if the code is running in a browser environment.
97
- if (isPlatformBrowser(this.platformId)) {
98
- const root = document.documentElement;
99
- for (const [key, value] of Object.entries(merged)) {
100
- const { cssVarName, processedValue } = processThemeVariable(key, value);
101
- // Set the CSS custom property on the root element.
102
- root.style.setProperty(cssVarName, processedValue);
103
- }
104
- }
105
- }
106
- /**
107
- * Saves the system theme user preferences.
108
- * @param themeVars - The theme variables to save.
109
- * @returns An observable of the system theme user preferences.
110
- */
111
- saveSystemThemeUserPreferences(themeVars) {
112
- return this.http.post(cidePath.join([hostManagerRoutesUrl.cideSuiteHost, designConfigRoutesUrl?.module, designConfigRoutesUrl?.systemThemeUserPreferences]), themeVars);
113
- }
114
- /**
115
- * Updates a single CSS variable using the utility function
116
- * @param key - The database format key (e.g., 'font_size_xxxl')
117
- * @param value - The value to be set
118
- */
119
- updateCSSVariable(key, value) {
120
- setCSSVariable(key, value, this.platformId);
121
- }
122
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
123
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytThemeService, providedIn: 'root' }); }
124
- }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytThemeService, decorators: [{
126
- type: Injectable,
127
- args: [{
128
- providedIn: 'root'
129
- }]
130
- }] });
131
- /**
132
- * Factory function for APP_INITIALIZER.
133
- * This function is used in your app.config.ts.
134
- * It conditionally triggers theme loading based on the environment setting.
135
- */
136
- export function themeFactory(themeService, environmentConfig) {
137
- return () => {
138
- if (!environmentConfig.applyThemeOnLogin) {
139
- // If theme should be applied on app initialize, fetch and apply it.
140
- console.log('APP_INITIALIZER: Applying theme...');
141
- return themeService.fetchAndApplyTheme();
142
- }
143
- else {
144
- // If theme should be applied on login, APP_INITIALIZER does nothing for the theme.
145
- // We return an observable that immediately completes.
146
- console.log('APP_INITIALIZER: Theme application deferred to after login (per environment config).');
147
- return of(undefined); // Return an observable that completes immediately
148
- }
149
- };
150
- }
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9zZXJ2aWNlcy90aGVtZS90aGVtZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFrTixNQUFNLHFCQUFxQixDQUFDO0FBQzVTLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUVwRCw2REFBNkQ7QUFDN0Qsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFxQixvQkFBb0IsQ0FBQyxDQUFDO0FBTy9GOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQzdELDJEQUEyRDtJQUMzRCxNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFFL0MsdURBQXVEO0lBQ3ZELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzNFLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFD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QUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7OEdBMUZVLG1CQUFtQjtrSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07OzJGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBOEZEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFlBQWlDLEVBQUUsaUJBQXFDO0lBQ25HLE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekMsb0VBQW9FO1lBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNsRCxPQUFPLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ04sbUZBQW1GO1lBQ25GLHNEQUFzRDtZQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLHNGQUFzRixDQUFDLENBQUM7WUFDcEcsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxrREFBa0Q7UUFDMUUsQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEluamVjdGFibGUsIFBMQVRGT1JNX0lELCBJbmplY3Rpb25Ub2tlbiwgc2lnbmFsLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2lkZVBhdGgsIGRlc2lnbkNvbmZpZ1JvdXRlc1VybCwgaG9zdE1hbmFnZXJSb3V0ZXNVcmwsIFN5c3RlbVRoZW1lQ29udHJvbGxlclJlc3Bvb25zZSwgU3lzdGVtVGhlbWVzTGlzdENvbnRyb2xsZXJSZXNwb29uc2UsIElFbnZpcm9ubWVudENvbmZpZywgU3lzdGVtVGhlbWVVc2VyUHJlZmVyZW5jZXNDb250cm9sbGVyUmVzcG9vbnNlLCBNU3lzdGVtVGhlbWVVc2VyUHJlZmVyZW5jZXNSZXF1ZXN0LCBTeXN0ZW1UaGVtZUNvbnRyb2xsZXJSZXNwb29uc2VEYXRhIH0gZnJvbSAnY2xvdWQtaWRlLWxtcy1tb2RlbCc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8vIERlZmluZSBhbiBJbmplY3Rpb25Ub2tlbiBmb3IgdGhlIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbi8vIFRoaXMgaXMgbmVlZGVkIHRvIGluamVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW50byBzZXJ2aWNlcyBwcm92aWRlZCBpbiAncm9vdCdcbmV4cG9ydCBjb25zdCBFTlZJUk9OTUVOVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48SUVudmlyb25tZW50Q29uZmlnPignRU5WSVJPTk1FTlRfQ09ORklHJyk7XG5cbi8vIERlZmluZSBhbiBpbnRlcmZhY2UgZm9yIHlvdXIgdGhlbWUgZm9yIHR5cGUgc2FmZXR5XG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lIHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nOyAvLyBBbGxvd3MgYW55IHN0cmluZyBrZXksIGUuZy4sICdjb2xvci10ZXh0LWJvZHknXG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGRhdGFiYXNlIGZvcm1hdCBrZXlzIHRvIENTUyBmb3JtYXQgYW5kIGhhbmRsZSB1bml0c1xuICogQHBhcmFtIGtleSAtIFRoZSBkYXRhYmFzZSBmb3JtYXQga2V5IChlLmcuLCAnZm9udF9zaXplX3h4eGwnKVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHNldFxuICogQHJldHVybnMgT2JqZWN0IHdpdGggY3NzVmFyTmFtZSBhbmQgcHJvY2Vzc2VkIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzVGhlbWVWYXJpYWJsZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHsgY3NzVmFyTmFtZTogc3RyaW5nOyBwcm9jZXNzZWRWYWx1ZTogc3RyaW5nIH0ge1xuICAvLyAxLiBDb252ZXJ0IHRoZSBrZXkgZnJvbSB0aGUgREIgZm9ybWF0IHRvIHRoZSBDU1MgZm9ybWF0LlxuICBjb25zdCBjc3NWYXJOYW1lID0gYCR7a2V5LnJlcGxhY2UoL18vZywgJy0nKX1gO1xuXG4gIC8vIDIuIEFwcGVuZCB0aGUgZm9udF9zaXplIGFuZCBsaW5lX2hlaWdodCB2YWx1ZSB0byByZW1cbiAgbGV0IHByb2Nlc3NlZFZhbHVlID0gdmFsdWU7XG4gIGlmIChjc3NWYXJOYW1lLmluY2x1ZGVzKCdmb250LXNpemUnKSB8fCBjc3NWYXJOYW1lLmluY2x1ZGVzKCdsaW5lLWhlaWdodCcpKSB7XG4gICAgcHJvY2Vzc2VkVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKSArICdyZW0nO1xuICB9XG5cbiAgcmV0dXJuIHsgY3NzVmFyTmFtZSwgcHJvY2Vzc2VkVmFsdWU6IHByb2Nlc3NlZFZhbHVlIH07XG59XG5cbi8qKlxuICogU2V0cyBhIHNpbmdsZSBDU1MgdmFyaWFibGUgb24gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudFxuICogQHBhcmFtIGtleSAtIFRoZSBkYXRhYmFzZSBmb3JtYXQga2V5IChlLmcuLCAnZm9udF9zaXplX3h4eGwnKVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHNldFxuICogQHBhcmFtIHBsYXRmb3JtSWQgLSBQbGF0Zm9ybSBJRCBmb3IgYnJvd3NlciBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q1NTVmFyaWFibGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHBsYXRmb3JtSWQ6IG9iamVjdCk6IHZvaWQge1xuICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCkpIHtcbiAgICBjb25zdCB7IGNzc1Zhck5hbWUsIHByb2Nlc3NlZFZhbHVlIH0gPSBwcm9jZXNzVGhlbWVWYXJpYWJsZShrZXksIHZhbHVlKTtcbiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHJvb3Quc3R5bGUuc2V0UHJvcGVydHkoY3NzVmFyTmFtZSwgcHJvY2Vzc2VkVmFsdWUpO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENpZGVMeXRUaGVtZVNlcnZpY2Uge1xuICAvLyBNb2Rlcm4gQW5ndWxhciBzaWduYWxzIGZvciByZWFjdGl2ZSBzdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgc2VsZWN0ZWRUaGVtZVNpZ25hbCA9IHNpZ25hbDxzdHJpbmc+KFwiXCIpO1xuICBwdWJsaWMgc2VsZWN0ZWRUaGVtZSA9IHRoaXMuc2VsZWN0ZWRUaGVtZVNpZ25hbC5hc1JlYWRvbmx5KCk7XG4gIFxuICAvLyBNb2Rlcm4gZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAgcHJpdmF0ZSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcml2YXRlIHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIGVudmlyb25tZW50ID0gaW5qZWN0KEVOVklST05NRU5UX0NPTkZJRyk7XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHRoZW1lIGZyb20gdGhlIEFQSSBhbmQgYXBwbGllcyBpdCB0byB0aGUgZG9jdW1lbnQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB0aGVtZSBzaG91bGQgYWN0dWFsbHkgYmUgYXBwbGllZC5cbiAgICovXG4gIHB1YmxpYyBmZXRjaEFuZEFwcGx5VGhlbWUoKTogT2JzZXJ2YWJsZTxTeXN0ZW1UaGVtZUNvbnRyb2xsZXJSZXNwb29uc2U+IHtcbiAgICBjb25zb2xlLmxvZygnRmV0Y2hpbmcgYW5kIGFwcGx5aW5nIHRoZW1lIHZpYSBDaWRlTHl0VGhlbWVTZXJ2aWNlLi4uJyk7XG4gICAgcmV0dXJuIHRoaXMubG9hZFRoZW1lKCk7IC8vIFVzZSB0aGUgZXhpc3RpbmcgbG9hZFRoZW1lIGxvZ2ljXG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiBzeXN0ZW0gdGhlbWVzIGZyb20gdGhlIEFQSS5cbiAgICovXG4gIHB1YmxpYyBmZXRjaFN5c3RlbVRoZW1lc0xpc3QoKTogT2JzZXJ2YWJsZTxTeXN0ZW1UaGVtZXNMaXN0Q29udHJvbGxlclJlc3Bvb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFN5c3RlbVRoZW1lc0xpc3RDb250cm9sbGVyUmVzcG9vbnNlPihcbiAgICAgIGNpZGVQYXRoLmpvaW4oW1xuICAgICAgICBob3N0TWFuYWdlclJvdXRlc1VybC5jaWRlU3VpdGVIb3N0LFxuICAgICAgICBkZXNpZ25Db25maWdSb3V0ZXNVcmw/Lm1vZHVsZSxcbiAgICAgICAgZGVzaWduQ29uZmlnUm91dGVzVXJsPy5nZXRTeXN0ZW1UaGVtZXNMaXN0XG4gICAgICBdKSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGZldGNoIHRoZSB0aGVtZSBmcm9tIHRoZSBBUEkgYW5kIGFwcGx5IGl0LlxuICAgKi9cbiAgbG9hZFRoZW1lKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTeXN0ZW1UaGVtZUNvbnRyb2xsZXJSZXNwb29uc2U+KGNpZGVQYXRoLmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsLmNpZGVTdWl0ZUhvc3QsIGRlc2lnbkNvbmZpZ1JvdXRlc1VybD8ubW9kdWxlLCBkZXNpZ25Db25maWdSb3V0ZXNVcmw/LmdldFN5c3RlbVRoZW1lXSksIHsgc3l1cHRoX3VzZXJfaWRfdXNlcjogXCI2NTlhN2VhMGExZjBlMDgyNDY2NjE3NjZcIiB9KS5waXBlKFxuICAgICAgdGFwKHRoZW1lID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJBcHBseWluZyB0aGVtZTpcIiwgdGhlbWUpO1xuICAgICAgICB0aGlzLmFwcGx5VGhlbWUodGhlbWU/LmRhdGEgYXMgU3lzdGVtVGhlbWVDb250cm9sbGVyUmVzcG9vbnNlRGF0YSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgQ1NTIHZhcmlhYmxlcyBvbiB0aGUgcm9vdCBlbGVtZW50LlxuICAgKiBAcGFyYW0gdGhlbWUgLSBBbiBvYmplY3Qgd2hlcmUga2V5cyBhcmUgQ1NTIHZhcmlhYmxlIG5hbWVzIChlLmcuLCAnLS1jb2xvci10ZXh0LWJvZHknKVxuICAgKiBhbmQgdmFsdWVzIGFyZSB0aGUgY29sb3Igc3RyaW5ncyAoZS5nLiwgJyNmZmZmZmYnKS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlUaGVtZSh0aGVtZTogU3lzdGVtVGhlbWVDb250cm9sbGVyUmVzcG9vbnNlRGF0YSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiQXBwbHlpbmcgdGhlbWU6XCIsIHRoZW1lKTtcbiAgICBsZXQgbWVyZ2VkID0ge307XG4gICAgaWYgKHRoZW1lPy5jb3JlX3N5c3RlbV90aGVtZXM/LnN5dGhfcHJvcGVydGllcykge1xuICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLnRoZW1lLmNvcmVfc3lzdGVtX3RoZW1lcy5zeXRoX3Byb3BlcnRpZXMgfTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtZVNpZ25hbC5zZXQodGhlbWUuY29yZV9zeXN0ZW1fdGhlbWVzLl9pZCBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICBpZiAodGhlbWU/LmNvcmVfc3lzdGVtX29yZ2FuaXphdGlvbl90aGVtZXM/LnN5b3RoX292ZXJyaWRlcykge1xuICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLnRoZW1lLmNvcmVfc3lzdGVtX29yZ2FuaXphdGlvbl90aGVtZXMuc3lvdGhfb3ZlcnJpZGVzIH07XG4gICAgfVxuICAgIGlmICh0aGVtZT8uY29yZV9zeXN0ZW1fdGhlbWVfdXNlcl9wcmVmZXJlbmNlcz8uc3l1cHRoX292ZXJyaWRlcykge1xuICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLnRoZW1lLmNvcmVfc3lzdGVtX3RoZW1lX3VzZXJfcHJlZmVyZW5jZXMuc3l1cHRoX292ZXJyaWRlcyB9O1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcIk1lcmdlZCB0aGVtZTpcIiwgbWVyZ2VkKTtcbiAgICAvLyBDaGVjayBpZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgY29uc3Qgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWVyZ2VkKSkge1xuICAgICAgICBjb25zdCB7IGNzc1Zhck5hbWUsIHByb2Nlc3NlZFZhbHVlIH0gPSBwcm9jZXNzVGhlbWVWYXJpYWJsZShrZXksIHZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIGN1c3RvbSBwcm9wZXJ0eSBvbiB0aGUgcm9vdCBlbGVtZW50LlxuICAgICAgICByb290LnN0eWxlLnNldFByb3BlcnR5KGNzc1Zhck5hbWUsIHByb2Nlc3NlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIHN5c3RlbSB0aGVtZSB1c2VyIHByZWZlcmVuY2VzLlxuICAgKiBAcGFyYW0gdGhlbWVWYXJzIC0gVGhlIHRoZW1lIHZhcmlhYmxlcyB0byBzYXZlLlxuICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIG9mIHRoZSBzeXN0ZW0gdGhlbWUgdXNlciBwcmVmZXJlbmNlcy5cbiAgICovXG4gIHNhdmVTeXN0ZW1UaGVtZVVzZXJQcmVmZXJlbmNlcyh0aGVtZVZhcnM6IE1TeXN0ZW1UaGVtZVVzZXJQcmVmZXJlbmNlc1JlcXVlc3QpOiBPYnNlcnZhYmxlPFN5c3RlbVRoZW1lVXNlclByZWZlcmVuY2VzQ29udHJvbGxlclJlc3Bvb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTeXN0ZW1UaGVtZVVzZXJQcmVmZXJlbmNlc0NvbnRyb2xsZXJSZXNwb29uc2U+KGNpZGVQYXRoLmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsLmNpZGVTdWl0ZUhvc3QsIGRlc2lnbkNvbmZpZ1JvdXRlc1VybD8ubW9kdWxlLCBkZXNpZ25Db25maWdSb3V0ZXNVcmw/LnN5c3RlbVRoZW1lVXNlclByZWZlcmVuY2VzXSksIHRoZW1lVmFycyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHNpbmdsZSBDU1MgdmFyaWFibGUgdXNpbmcgdGhlIHV0aWxpdHkgZnVuY3Rpb25cbiAgICogQHBhcmFtIGtleSAtIFRoZSBkYXRhYmFzZSBmb3JtYXQga2V5IChlLmcuLCAnZm9udF9zaXplX3h4eGwnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc2V0XG4gICAqL1xuICB1cGRhdGVDU1NWYXJpYWJsZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldENTU1ZhcmlhYmxlKGtleSwgdmFsdWUsIHRoaXMucGxhdGZvcm1JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBBUFBfSU5JVElBTElaRVIuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4geW91ciBhcHAuY29uZmlnLnRzLlxuICogSXQgY29uZGl0aW9uYWxseSB0cmlnZ2VycyB0aGVtZSBsb2FkaW5nIGJhc2VkIG9uIHRoZSBlbnZpcm9ubWVudCBzZXR0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWVGYWN0b3J5KHRoZW1lU2VydmljZTogQ2lkZUx5dFRoZW1lU2VydmljZSwgZW52aXJvbm1lbnRDb25maWc6IElFbnZpcm9ubWVudENvbmZpZyk6ICgpID0+IE9ic2VydmFibGU8U3lzdGVtVGhlbWVDb250cm9sbGVyUmVzcG9vbnNlIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKCFlbnZpcm9ubWVudENvbmZpZy5hcHBseVRoZW1lT25Mb2dpbikge1xuICAgICAgLy8gSWYgdGhlbWUgc2hvdWxkIGJlIGFwcGxpZWQgb24gYXBwIGluaXRpYWxpemUsIGZldGNoIGFuZCBhcHBseSBpdC5cbiAgICAgIGNvbnNvbGUubG9nKCdBUFBfSU5JVElBTElaRVI6IEFwcGx5aW5nIHRoZW1lLi4uJyk7XG4gICAgICByZXR1cm4gdGhlbWVTZXJ2aWNlLmZldGNoQW5kQXBwbHlUaGVtZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGVtZSBzaG91bGQgYmUgYXBwbGllZCBvbiBsb2dpbiwgQVBQX0lOSVRJQUxJWkVSIGRvZXMgbm90aGluZyBmb3IgdGhlIHRoZW1lLlxuICAgICAgLy8gV2UgcmV0dXJuIGFuIG9ic2VydmFibGUgdGhhdCBpbW1lZGlhdGVseSBjb21wbGV0ZXMuXG4gICAgICBjb25zb2xlLmxvZygnQVBQX0lOSVRJQUxJWkVSOiBUaGVtZSBhcHBsaWNhdGlvbiBkZWZlcnJlZCB0byBhZnRlciBsb2dpbiAocGVyIGVudmlyb25tZW50IGNvbmZpZykuJyk7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTsgLy8gUmV0dXJuIGFuIG9ic2VydmFibGUgdGhhdCBjb21wbGV0ZXMgaW1tZWRpYXRlbHlcbiAgICB9XG4gIH07XG59Il19
@@ -1,135 +0,0 @@
1
- import { Injectable, signal, computed } from '@angular/core';
2
- import { BehaviorSubject, interval } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- export class CideLytUserStatusService {
5
- constructor() {
6
- // Modern Angular Signals pattern
7
- this._userStatus = signal({
8
- status: 'online',
9
- lastActive: new Date(),
10
- message: undefined
11
- });
12
- // Public readonly access to status
13
- this.userStatus = this._userStatus.asReadonly();
14
- // Computed properties
15
- this.isOnline = computed(() => this._userStatus().status !== 'offline');
16
- this.statusColor = computed(() => this.getStatusColor(this._userStatus().status));
17
- this.statusText = computed(() => this.getStatusText(this._userStatus().status));
18
- // Legacy observable for compatibility
19
- this.statusSubject = new BehaviorSubject(this._userStatus());
20
- this.status$ = this.statusSubject.asObservable();
21
- // Auto-away functionality
22
- this.lastActivityTime = Date.now();
23
- this.autoAwayTimeout = 5 * 60 * 1000; // 5 minutes
24
- this.autoAwayEnabled = true;
25
- this.initializeActivityTracking();
26
- this.startAutoAwayTimer();
27
- }
28
- /**
29
- * Sets the user status
30
- * @param status The new status to set
31
- * @param message Optional custom status message
32
- */
33
- setStatus(status, message) {
34
- const statusData = {
35
- status,
36
- lastActive: new Date(),
37
- message
38
- };
39
- this._userStatus.set(statusData);
40
- this.statusSubject.next(statusData);
41
- this.lastActivityTime = Date.now();
42
- }
43
- /**
44
- * Marks user as active (resets away timer)
45
- */
46
- markUserActive() {
47
- this.lastActivityTime = Date.now();
48
- // If user was away, bring them back to online
49
- if (this._userStatus().status === 'away') {
50
- this.setStatus('online');
51
- }
52
- }
53
- /**
54
- * Gets CSS class for status color
55
- */
56
- getStatusColor(status) {
57
- switch (status) {
58
- case 'online': return 'tw-bg-green-500';
59
- case 'away': return 'tw-bg-yellow-500';
60
- case 'busy': return 'tw-bg-orange-500';
61
- case 'do-not-disturb': return 'tw-bg-red-500';
62
- case 'offline': return 'tw-bg-gray-400';
63
- default: return 'tw-bg-gray-400';
64
- }
65
- }
66
- /**
67
- * Gets human-readable status text
68
- */
69
- getStatusText(status) {
70
- const current = this._userStatus();
71
- const baseText = this.getBaseStatusText(status);
72
- return current.message ? `${baseText} - ${current.message}` : baseText;
73
- }
74
- getBaseStatusText(status) {
75
- switch (status) {
76
- case 'online': return 'Online';
77
- case 'away': return 'Away';
78
- case 'busy': return 'Busy';
79
- case 'do-not-disturb': return 'Do not disturb';
80
- case 'offline': return 'Offline';
81
- default: return 'Unknown';
82
- }
83
- }
84
- /**
85
- * Initialize activity tracking for auto-away
86
- */
87
- initializeActivityTracking() {
88
- if (typeof window === 'undefined')
89
- return;
90
- const events = ['mousedown', 'mousemove', 'keypress', 'scroll', 'touchstart', 'click'];
91
- events.forEach(event => {
92
- document.addEventListener(event, () => {
93
- this.markUserActive();
94
- }, { passive: true });
95
- });
96
- }
97
- /**
98
- * Start the auto-away timer
99
- */
100
- startAutoAwayTimer() {
101
- if (!this.autoAwayEnabled)
102
- return;
103
- interval(30000).subscribe({
104
- next: () => {
105
- const now = Date.now();
106
- const timeSinceActivity = now - this.lastActivityTime;
107
- if (timeSinceActivity > this.autoAwayTimeout &&
108
- this._userStatus().status === 'online') {
109
- this.setStatus('away', 'Auto-away due to inactivity');
110
- }
111
- }
112
- });
113
- }
114
- /**
115
- * Enable or disable auto-away functionality
116
- */
117
- setAutoAwayEnabled(enabled) {
118
- this.autoAwayEnabled = enabled;
119
- }
120
- /**
121
- * Set the auto-away timeout (in milliseconds)
122
- */
123
- setAutoAwayTimeout(timeout) {
124
- this.autoAwayTimeout = timeout;
125
- }
126
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytUserStatusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
127
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytUserStatusService, providedIn: 'root' }); }
128
- }
129
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytUserStatusService, decorators: [{
130
- type: Injectable,
131
- args: [{
132
- providedIn: 'root'
133
- }]
134
- }], ctorParameters: () => [] });
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1zdGF0dXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9zZXJ2aWNlcy91c2VyLXN0YXR1cy91c2VyLXN0YXR1cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFhakQsTUFBTSxPQUFPLHdCQUF3QjtJQXlCbkM7UUF4QkEsaUNBQWlDO1FBQ3pCLGdCQUFXLEdBQUcsTUFBTSxDQUFpQjtZQUMzQyxNQUFNLEVBQUUsUUFBUTtZQUNoQixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDdEIsT0FBTyxFQUFFLFNBQVM7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsbUNBQW1DO1FBQ25CLGVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTNELHNCQUFzQjtRQUNOLGFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQztRQUNuRSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzdFLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUUzRixzQ0FBc0M7UUFDOUIsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBaUIsSUFBSSxDQUFD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QkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCB0eXBlIFVzZXJTdGF0dXMgPSAnb25saW5lJyB8ICdvZmZsaW5lJyB8ICdhd2F5JyB8ICdidXN5JyB8ICdkby1ub3QtZGlzdHVyYic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTdGF0dXNEYXRhIHtcclxuICBzdGF0dXM6IFVzZXJTdGF0dXM7XHJcbiAgbGFzdEFjdGl2ZTogRGF0ZTtcclxuICBtZXNzYWdlPzogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaWRlTHl0VXNlclN0YXR1c1NlcnZpY2Uge1xyXG4gIC8vIE1vZGVybiBBbmd1bGFyIFNpZ25hbHMgcGF0dGVyblxyXG4gIHByaXZhdGUgX3VzZXJTdGF0dXMgPSBzaWduYWw8VXNlclN0YXR1c0RhdGE+KHtcclxuICAgIHN0YXR1czogJ29ubGluZScsXHJcbiAgICBsYXN0QWN0aXZlOiBuZXcgRGF0ZSgpLFxyXG4gICAgbWVzc2FnZTogdW5kZWZpbmVkXHJcbiAgfSk7XHJcblxyXG4gIC8vIFB1YmxpYyByZWFkb25seSBhY2Nlc3MgdG8gc3RhdHVzXHJcbiAgcHVibGljIHJlYWRvbmx5IHVzZXJTdGF0dXMgPSB0aGlzLl91c2VyU3RhdHVzLmFzUmVhZG9ubHkoKTtcclxuXHJcbiAgLy8gQ29tcHV0ZWQgcHJvcGVydGllc1xyXG4gIHB1YmxpYyByZWFkb25seSBpc09ubGluZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3VzZXJTdGF0dXMoKS5zdGF0dXMgIT09ICdvZmZsaW5lJyk7XHJcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvbG9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXRTdGF0dXNDb2xvcih0aGlzLl91c2VyU3RhdHVzKCkuc3RhdHVzKSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c1RleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldFN0YXR1c1RleHQodGhpcy5fdXNlclN0YXR1cygpLnN0YXR1cykpO1xyXG5cclxuICAvLyBMZWdhY3kgb2JzZXJ2YWJsZSBmb3IgY29tcGF0aWJpbGl0eVxyXG4gIHByaXZhdGUgc3RhdHVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclN0YXR1c0RhdGE+KHRoaXMuX3VzZXJTdGF0dXMoKSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1cyQgPSB0aGlzLnN0YXR1c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8vIEF1dG8tYXdheSBmdW5jdGlvbmFsaXR5XHJcbiAgcHJpdmF0ZSBsYXN0QWN0aXZpdHlUaW1lID0gRGF0ZS5ub3coKTtcclxuICBwcml2YXRlIGF1dG9Bd2F5VGltZW91dCA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlc1xyXG4gIHByaXZhdGUgYXV0b0F3YXlFbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVBY3Rpdml0eVRyYWNraW5nKCk7XHJcbiAgICB0aGlzLnN0YXJ0QXV0b0F3YXlUaW1lcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdXNlciBzdGF0dXNcclxuICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBuZXcgc3RhdHVzIHRvIHNldFxyXG4gICAqIEBwYXJhbSBtZXNzYWdlIE9wdGlvbmFsIGN1c3RvbSBzdGF0dXMgbWVzc2FnZVxyXG4gICAqL1xyXG4gIHNldFN0YXR1cyhzdGF0dXM6IFVzZXJTdGF0dXMsIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXR1c0RhdGE6IFVzZXJTdGF0dXNEYXRhID0ge1xyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIGxhc3RBY3RpdmU6IG5ldyBEYXRlKCksXHJcbiAgICAgIG1lc3NhZ2VcclxuICAgIH07XHJcbiAgICBcclxuICAgIHRoaXMuX3VzZXJTdGF0dXMuc2V0KHN0YXR1c0RhdGEpO1xyXG4gICAgdGhpcy5zdGF0dXNTdWJqZWN0Lm5leHQoc3RhdHVzRGF0YSk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpdml0eVRpbWUgPSBEYXRlLm5vdygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFya3MgdXNlciBhcyBhY3RpdmUgKHJlc2V0cyBhd2F5IHRpbWVyKVxyXG4gICAqL1xyXG4gIG1hcmtVc2VyQWN0aXZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0QWN0aXZpdHlUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgIFxyXG4gICAgLy8gSWYgdXNlciB3YXMgYXdheSwgYnJpbmcgdGhlbSBiYWNrIHRvIG9ubGluZVxyXG4gICAgaWYgKHRoaXMuX3VzZXJTdGF0dXMoKS5zdGF0dXMgPT09ICdhd2F5Jykge1xyXG4gICAgICB0aGlzLnNldFN0YXR1cygnb25saW5lJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIENTUyBjbGFzcyBmb3Igc3RhdHVzIGNvbG9yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRTdGF0dXNDb2xvcihzdGF0dXM6IFVzZXJTdGF0dXMpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSAnb25saW5lJzogcmV0dXJuICd0dy1iZy1ncmVlbi01MDAnO1xyXG4gICAgICBjYXNlICdhd2F5JzogcmV0dXJuICd0dy1iZy15ZWxsb3ctNTAwJztcclxuICAgICAgY2FzZSAnYnVzeSc6IHJldHVybiAndHctYmctb3JhbmdlLTUwMCc7XHJcbiAgICAgIGNhc2UgJ2RvLW5vdC1kaXN0dXJiJzogcmV0dXJuICd0dy1iZy1yZWQtNTAwJztcclxuICAgICAgY2FzZSAnb2ZmbGluZSc6IHJldHVybiAndHctYmctZ3JheS00MDAnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3R3LWJnLWdyYXktNDAwJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgaHVtYW4tcmVhZGFibGUgc3RhdHVzIHRleHRcclxuICAgKi9cclxuICBwcml2YXRlIGdldFN0YXR1c1RleHQoc3RhdHVzOiBVc2VyU3RhdHVzKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl91c2VyU3RhdHVzKCk7XHJcbiAgICBjb25zdCBiYXNlVGV4dCA9IHRoaXMuZ2V0QmFzZVN0YXR1c1RleHQoc3RhdHVzKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGN1cnJlbnQubWVzc2FnZSA/IGAke2Jhc2VUZXh0fSAtICR7Y3VycmVudC5tZXNzYWdlfWAgOiBiYXNlVGV4dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QmFzZVN0YXR1c1RleHQoc3RhdHVzOiBVc2VyU3RhdHVzKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XHJcbiAgICAgIGNhc2UgJ29ubGluZSc6IHJldHVybiAnT25saW5lJztcclxuICAgICAgY2FzZSAnYXdheSc6IHJldHVybiAnQXdheSc7XHJcbiAgICAgIGNhc2UgJ2J1c3knOiByZXR1cm4gJ0J1c3knO1xyXG4gICAgICBjYXNlICdkby1ub3QtZGlzdHVyYic6IHJldHVybiAnRG8gbm90IGRpc3R1cmInO1xyXG4gICAgICBjYXNlICdvZmZsaW5lJzogcmV0dXJuICdPZmZsaW5lJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuICdVbmtub3duJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgYWN0aXZpdHkgdHJhY2tpbmcgZm9yIGF1dG8tYXdheVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFjdGl2aXR5VHJhY2tpbmcoKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBldmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAna2V5cHJlc3MnLCAnc2Nyb2xsJywgJ3RvdWNoc3RhcnQnLCAnY2xpY2snXTtcclxuICAgIFxyXG4gICAgZXZlbnRzLmZvckVhY2goZXZlbnQgPT4ge1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tYXJrVXNlckFjdGl2ZSgpO1xyXG4gICAgICB9LCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0IHRoZSBhdXRvLWF3YXkgdGltZXJcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXJ0QXV0b0F3YXlUaW1lcigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5hdXRvQXdheUVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBpbnRlcnZhbCgzMDAwMCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4geyAvLyBDaGVjayBldmVyeSAzMCBzZWNvbmRzXHJcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBjb25zdCB0aW1lU2luY2VBY3Rpdml0eSA9IG5vdyAtIHRoaXMubGFzdEFjdGl2aXR5VGltZTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGltZVNpbmNlQWN0aXZpdHkgPiB0aGlzLmF1dG9Bd2F5VGltZW91dCAmJiBcclxuICAgICAgICAgICAgdGhpcy5fdXNlclN0YXR1cygpLnN0YXR1cyA9PT0gJ29ubGluZScpIHtcclxuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzKCdhd2F5JywgJ0F1dG8tYXdheSBkdWUgdG8gaW5hY3Rpdml0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvLWF3YXkgZnVuY3Rpb25hbGl0eVxyXG4gICAqL1xyXG4gIHNldEF1dG9Bd2F5RW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1dG9Bd2F5RW5hYmxlZCA9IGVuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGF1dG8tYXdheSB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpXHJcbiAgICovXHJcbiAgc2V0QXV0b0F3YXlUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hdXRvQXdheVRpbWVvdXQgPSB0aW1lb3V0O1xyXG4gIH1cclxufSAiXX0=