cloud-ide-layout 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -448
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs} +335 -343
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-D3xzVSNA.mjs.map → cloud-ide-layout-cloud-ide-layout-DLceZY3Y.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-BSUFE_o2.mjs → cloud-ide-layout-drawer-theme.component-Bn5--C_Q.mjs} +69 -67
- 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
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs} +56 -51
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-Dr4MO4MB.mjs.map → cloud-ide-layout-home-wrapper.component-Bo-4LNLx.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs} +28 -32
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-BWx03JYS.mjs.map → cloud-ide-layout-sidedrawer-notes.component-BmadMzdl.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout.mjs +1 -1
- package/index.d.ts +579 -3
- package/package.json +4 -6
- package/esm2022/cloud-ide-layout.mjs +0 -5
- package/esm2022/lib/cloud-ide-layout.component.mjs +0 -16
- package/esm2022/lib/cloud-ide-layout.routes.mjs +0 -28
- package/esm2022/lib/cloud-ide-layout.service.mjs +0 -14
- package/esm2022/lib/layout/console/console-wrapper/console-wrapper.component.mjs +0 -11
- package/esm2022/lib/layout/console/console.service.mjs +0 -28
- package/esm2022/lib/layout/footer/footer-wrapper/footer-wrapper.component.mjs +0 -20
- package/esm2022/lib/layout/footer/footer.service.mjs +0 -28
- package/esm2022/lib/layout/header/header-wrapper/header-wrapper.component.mjs +0 -84
- package/esm2022/lib/layout/header/header.service.mjs +0 -28
- package/esm2022/lib/layout/home/home-wrapper/home-wrapper.component.mjs +0 -198
- package/esm2022/lib/layout/layout/layout-wrapper/layout-wrapper.component.mjs +0 -28
- package/esm2022/lib/layout/request/request-wrapper/request-wrapper.component.mjs +0 -60
- package/esm2022/lib/layout/request/request.service.mjs +0 -235
- package/esm2022/lib/layout/request/tab-content/tab-content.component.mjs +0 -84
- package/esm2022/lib/layout/shared/shared-wrapper/shared-wrapper.component.mjs +0 -49
- package/esm2022/lib/layout/shared/shared.service.mjs +0 -508
- package/esm2022/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.mjs +0 -488
- package/esm2022/lib/layout/sidebar/sidebar.service.mjs +0 -35
- package/esm2022/lib/layout/sidedrawer/cide-lyt-drawer-base.class.mjs +0 -40
- package/esm2022/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.mjs +0 -296
- package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.mjs +0 -175
- package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.mjs +0 -51
- package/esm2022/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.mjs +0 -257
- package/esm2022/lib/layout/sidedrawer/sidedrawer.service.mjs +0 -70
- package/esm2022/lib/services/app-state/app-state-helper.service.mjs +0 -222
- package/esm2022/lib/services/app-state/app-state.service.mjs +0 -256
- package/esm2022/lib/services/app-state/index.mjs +0 -3
- package/esm2022/lib/services/cache-manager/cache-manager.service.mjs +0 -112
- package/esm2022/lib/services/file-manager/file-manager.service.mjs +0 -21
- package/esm2022/lib/services/tab-state.service.mjs +0 -128
- package/esm2022/lib/services/theme/theme.service.mjs +0 -151
- package/esm2022/lib/services/user-status/user-status.service.mjs +0 -135
- package/esm2022/lib/utils/custom-route-reuse-strategy.mjs +0 -61
- package/esm2022/lib/utils/index.mjs +0 -2
- package/esm2022/public-api.mjs +0 -18
- package/lib/cloud-ide-layout.component.d.ts +0 -5
- package/lib/cloud-ide-layout.routes.d.ts +0 -3
- package/lib/cloud-ide-layout.service.d.ts +0 -6
- package/lib/layout/console/console-wrapper/console-wrapper.component.d.ts +0 -5
- package/lib/layout/console/console.service.d.ts +0 -9
- package/lib/layout/footer/footer-wrapper/footer-wrapper.component.d.ts +0 -9
- package/lib/layout/footer/footer.service.d.ts +0 -9
- package/lib/layout/header/header-wrapper/header-wrapper.component.d.ts +0 -25
- package/lib/layout/header/header.service.d.ts +0 -9
- package/lib/layout/home/home-wrapper/home-wrapper.component.d.ts +0 -94
- package/lib/layout/layout/layout-wrapper/layout-wrapper.component.d.ts +0 -5
- package/lib/layout/request/request-wrapper/request-wrapper.component.d.ts +0 -14
- package/lib/layout/request/request.service.d.ts +0 -60
- package/lib/layout/request/tab-content/tab-content.component.d.ts +0 -19
- package/lib/layout/shared/shared-wrapper/shared-wrapper.component.d.ts +0 -17
- package/lib/layout/shared/shared.service.d.ts +0 -114
- package/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.d.ts +0 -140
- package/lib/layout/sidebar/sidebar.service.d.ts +0 -12
- package/lib/layout/sidedrawer/cide-lyt-drawer-base.class.d.ts +0 -16
- package/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.d.ts +0 -71
- package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.d.ts +0 -48
- package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.d.ts +0 -13
- package/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.d.ts +0 -30
- package/lib/layout/sidedrawer/sidedrawer.service.d.ts +0 -30
- package/lib/services/app-state/app-state-helper.service.d.ts +0 -150
- package/lib/services/app-state/app-state.service.d.ts +0 -85
- package/lib/services/app-state/index.d.ts +0 -3
- package/lib/services/cache-manager/cache-manager.service.d.ts +0 -64
- package/lib/services/file-manager/file-manager.service.d.ts +0 -9
- package/lib/services/tab-state.service.d.ts +0 -79
- package/lib/services/theme/theme.service.d.ts +0 -71
- package/lib/services/user-status/user-status.service.d.ts +0 -57
- package/lib/utils/custom-route-reuse-strategy.d.ts +0 -15
- package/lib/utils/index.d.ts +0 -1
- 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=
|