cloud-ide-layout 0.0.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +466 -13
- package/esm2022/lib/cloud-ide-layout.routes.mjs +24 -10
- package/esm2022/lib/layout/console/console-wrapper/console-wrapper.component.mjs +6 -6
- package/esm2022/lib/layout/console/console.service.mjs +28 -0
- package/esm2022/lib/layout/footer/footer-wrapper/footer-wrapper.component.mjs +16 -8
- package/esm2022/lib/layout/footer/footer.service.mjs +28 -0
- package/esm2022/lib/layout/header/header-wrapper/header-wrapper.component.mjs +69 -18
- package/esm2022/lib/layout/header/header.service.mjs +17 -6
- package/esm2022/lib/layout/home/home-wrapper/home-wrapper.component.mjs +194 -7
- package/esm2022/lib/layout/layout/layout-wrapper/layout-wrapper.component.mjs +18 -9
- package/esm2022/lib/layout/request/request-wrapper/request-wrapper.component.mjs +54 -6
- package/esm2022/lib/layout/request/request.service.mjs +235 -0
- package/esm2022/lib/layout/request/tab-content/tab-content.component.mjs +84 -0
- package/esm2022/lib/layout/shared/shared-wrapper/shared-wrapper.component.mjs +32 -20
- package/esm2022/lib/layout/shared/shared.service.mjs +490 -14
- package/esm2022/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.mjs +480 -15
- package/esm2022/lib/layout/sidebar/sidebar.service.mjs +20 -7
- package/esm2022/lib/layout/sidedrawer/cide-lyt-drawer-base.class.mjs +40 -0
- package/esm2022/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.mjs +296 -0
- package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.mjs +175 -0
- package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.mjs +51 -0
- package/esm2022/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.mjs +254 -9
- package/esm2022/lib/layout/sidedrawer/sidedrawer.service.mjs +70 -0
- package/esm2022/lib/services/app-state/app-state-helper.service.mjs +222 -0
- package/esm2022/lib/services/app-state/app-state.service.mjs +256 -0
- package/esm2022/lib/services/app-state/index.mjs +3 -0
- package/esm2022/lib/services/cache-manager/cache-manager.service.mjs +112 -0
- package/esm2022/lib/services/file-manager/file-manager.service.mjs +7 -7
- package/esm2022/lib/services/tab-state.service.mjs +128 -0
- package/esm2022/lib/services/theme/theme.service.mjs +151 -0
- package/esm2022/lib/services/user-status/user-status.service.mjs +135 -0
- package/esm2022/lib/utils/custom-route-reuse-strategy.mjs +61 -0
- package/esm2022/lib/utils/index.mjs +2 -0
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-DqL3A73V.mjs +2914 -0
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-DqL3A73V.mjs.map +1 -0
- package/fesm2022/cloud-ide-layout-drawer-theme.component-xd8IG3WP.mjs +443 -0
- package/fesm2022/cloud-ide-layout-drawer-theme.component-xd8IG3WP.mjs.map +1 -0
- package/fesm2022/cloud-ide-layout-home-wrapper.component-DEdsEiaq.mjs +197 -0
- package/fesm2022/cloud-ide-layout-home-wrapper.component-DEdsEiaq.mjs.map +1 -0
- package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-ds12wZbh.mjs +260 -0
- package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-ds12wZbh.mjs.map +1 -0
- package/fesm2022/cloud-ide-layout.mjs +1 -261
- package/fesm2022/cloud-ide-layout.mjs.map +1 -1
- package/lib/cloud-ide-layout.routes.d.ts +1 -0
- package/lib/layout/console/console-wrapper/console-wrapper.component.d.ts +3 -3
- package/lib/layout/console/console.service.d.ts +9 -0
- package/lib/layout/footer/footer-wrapper/footer-wrapper.component.d.ts +7 -3
- package/lib/layout/footer/footer.service.d.ts +9 -0
- package/lib/layout/header/header-wrapper/header-wrapper.component.d.ts +17 -9
- package/lib/layout/header/header.service.d.ts +4 -3
- package/lib/layout/home/home-wrapper/home-wrapper.component.d.ts +90 -1
- package/lib/layout/request/request-wrapper/request-wrapper.component.d.ts +10 -1
- package/lib/layout/request/request.service.d.ts +60 -0
- package/lib/layout/request/tab-content/tab-content.component.d.ts +19 -0
- package/lib/layout/shared/shared-wrapper/shared-wrapper.component.d.ts +4 -5
- package/lib/layout/shared/shared.service.d.ts +104 -6
- package/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.d.ts +135 -6
- package/lib/layout/sidebar/sidebar.service.d.ts +3 -2
- package/lib/layout/sidedrawer/cide-lyt-drawer-base.class.d.ts +16 -0
- package/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.d.ts +71 -0
- package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.d.ts +48 -0
- package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.d.ts +13 -0
- package/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.d.ts +28 -3
- package/lib/layout/sidedrawer/sidedrawer.service.d.ts +30 -0
- package/lib/services/app-state/app-state-helper.service.d.ts +150 -0
- package/lib/services/app-state/app-state.service.d.ts +85 -0
- package/lib/services/app-state/index.d.ts +3 -0
- package/lib/services/cache-manager/cache-manager.service.d.ts +64 -0
- package/lib/services/file-manager/file-manager.service.d.ts +0 -2
- package/lib/services/tab-state.service.d.ts +79 -0
- package/lib/services/theme/theme.service.d.ts +71 -0
- package/lib/services/user-status/user-status.service.d.ts +57 -0
- package/lib/utils/custom-route-reuse-strategy.d.ts +15 -0
- package/lib/utils/index.d.ts +1 -0
- package/package.json +2 -2
- package/public-api.d.ts +4 -0
- package/src/lib/assets/css/cide-lyt-style.scss +182 -0
- package/src/lib/assets/css/cide-lyt-variable.scss +119 -0
- package/fesm2022/cloud-ide-layout-home-wrapper.component-BV7ptL0Y.mjs +0 -14
- package/fesm2022/cloud-ide-layout-home-wrapper.component-BV7ptL0Y.mjs.map +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
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,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
3
|
import { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common/http";
|
|
5
5
|
export class CideLytFileManagerService {
|
|
6
|
-
constructor(
|
|
7
|
-
this.http =
|
|
6
|
+
constructor() {
|
|
7
|
+
this.http = inject(HttpClient);
|
|
8
8
|
}
|
|
9
9
|
getFileDetails(body) {
|
|
10
10
|
return this.http.post(cidePath.join([hostManagerRoutesUrl.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.getFileDetails]), body);
|
|
11
11
|
}
|
|
12
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, deps: [
|
|
12
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13
13
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, providedIn: 'root' }); }
|
|
14
14
|
}
|
|
15
15
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytFileManagerService, decorators: [{
|
|
@@ -17,5 +17,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
17
17
|
args: [{
|
|
18
18
|
providedIn: 'root'
|
|
19
19
|
}]
|
|
20
|
-
}]
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
}] });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtbGF5b3V0L3NyYy9saWIvc2VydmljZXMvZmlsZS1tYW5hZ2VyL2ZpbGUtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBK0MsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLakksTUFBTSxPQUFPLHlCQUF5QjtJQUh0QztRQUlVLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FLbkM7SUFIQyxjQUFjLENBQUMsSUFBa0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUE4QyxDQUFDO0lBQ3RMLENBQUM7OEdBTFUseUJBQXlCO2tIQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNpZGVQYXRoLCBjb3JlUm91dGVzVXJsLCBob3N0TWFuYWdlclJvdXRlc1VybCwgTUZpbGVNYW5hZ2VyLCBmaWxlTWFuYWdlckNvbnRyb2xsZXJSZXNwb25zZSB9IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUx5dEZpbGVNYW5hZ2VyU2VydmljZSB7XG4gIHByaXZhdGUgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICBnZXRGaWxlRGV0YWlscyhib2R5OiBNRmlsZU1hbmFnZXIpOiBPYnNlcnZhYmxlPGZpbGVNYW5hZ2VyQ29udHJvbGxlclJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGNpZGVQYXRoLmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsLmNpZGVTdWl0ZUhvc3QsIGNvcmVSb3V0ZXNVcmw/Lm1vZHVsZSwgY29yZVJvdXRlc1VybD8uZ2V0RmlsZURldGFpbHNdKSwgYm9keSkgYXMgT2JzZXJ2YWJsZTxmaWxlTWFuYWdlckNvbnRyb2xsZXJSZXNwb25zZT47XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,128 @@
|
|
|
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==
|
|
@@ -0,0 +1,151 @@
|
|
|
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
|