raain-app 1.5.25 → 1.5.28
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/CHANGELOG.md +15 -1
- package/LICENSE +27 -21
- package/README.md +3 -2
- package/esm2020/index.mjs +3 -1
- package/esm2020/pipes.module.mjs +68 -0
- package/esm2020/profile-icon.directive.mjs +143 -0
- package/esm2020/profile.service.mjs +10 -1
- package/esm2020/raain-date-dynamic/raain-date-dynamic.component.mjs +3 -1
- package/esm2020/raain-details/raain-details.component.mjs +35 -14
- package/esm2020/raain-map/raain-map.component.mjs +3 -3
- package/esm2020/shared.module.mjs +13 -61
- package/fesm2015/raain-app.mjs +271 -78
- package/fesm2015/raain-app.mjs.map +1 -1
- package/fesm2020/raain-app.mjs +265 -78
- package/fesm2020/raain-app.mjs.map +1 -1
- package/gh/lab/README.md +20 -0
- package/gh/sandbox/README.md +23 -0
- package/index.d.ts +2 -0
- package/package.json +2 -2
- package/pipes.module.d.ts +7 -0
- package/profile-icon.directive.d.ts +26 -0
- package/profile.service.d.ts +3 -0
- package/raain-details/raain-details.component.d.ts +2 -2
- package/shared.module.d.ts +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [1.5.
|
|
10
|
+
## [1.5.27] - 2025-06-30
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- RAD-92: UI refacto
|
|
15
|
+
|
|
16
|
+
### Documentation
|
|
17
|
+
|
|
18
|
+
- Updated README.md with latest version information
|
|
19
|
+
- Updated Memory Bank files with current project status
|
|
20
|
+
- Improved documentation clarity and consistency
|
|
21
|
+
|
|
22
|
+
## [1.5.26] - 2025-06-26
|
|
23
|
+
|
|
24
|
+
## [1.5.25] - 2025-06-24
|
|
11
25
|
|
|
12
26
|
### Dependencies
|
|
13
27
|
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 raain.io
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
RAAIN.IO PROPRIETARY LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 raain.io. All rights reserved.
|
|
4
|
+
|
|
5
|
+
This software and associated documentation files (the "Software") are the proprietary and confidential information of raain.io. The Software is protected by copyright laws and international treaty provisions.
|
|
6
|
+
|
|
7
|
+
By accessing or using the Software, you agree to the following terms:
|
|
8
|
+
|
|
9
|
+
1. RESTRICTIONS:
|
|
10
|
+
a. You may NOT copy, reproduce, or duplicate the Software, in whole or in part.
|
|
11
|
+
b. You may NOT reverse engineer, decompile, disassemble, or attempt to derive the source code of the Software.
|
|
12
|
+
c. You may NOT use the Software for any commercial purposes without explicit written permission from raain.io.
|
|
13
|
+
d. You may NOT distribute, sublicense, lease, rent, loan, or otherwise make the Software available to any third party.
|
|
14
|
+
|
|
15
|
+
2. OWNERSHIP:
|
|
16
|
+
All title, ownership rights, and intellectual property rights in and to the Software remain with raain.io.
|
|
17
|
+
|
|
18
|
+
3. TERMINATION:
|
|
19
|
+
This license is effective until terminated. Your rights under this license will terminate automatically without notice if you fail to comply with any of its terms.
|
|
20
|
+
|
|
21
|
+
4. DISCLAIMER OF WARRANTY:
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL RAAIN.IO BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
+
|
|
24
|
+
5. GOVERNING LAW:
|
|
25
|
+
This license shall be governed by and construed in accordance with the laws of the jurisdiction in which raain.io operates, without regard to its conflict of law provisions.
|
|
26
|
+
|
|
27
|
+
By using the Software, you acknowledge that you have read this license, understand it, and agree to be bound by its terms and conditions.
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">RAAIN App</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<img src="https://img.shields.io/badge/version-1.5.
|
|
8
|
+
<img src="https://img.shields.io/badge/version-1.5.26-blue" alt="Version 1.5.26">
|
|
9
9
|
<img src="https://img.shields.io/badge/angular-latest-red" alt="Angular">
|
|
10
10
|
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
|
11
11
|
<img src="https://img.shields.io/badge/mobile-capacitor-blueviolet" alt="Mobile">
|
|
@@ -143,7 +143,8 @@ The application is in active development with a focus on stability, performance,
|
|
|
143
143
|
- Code cleanup and best practices implementation
|
|
144
144
|
|
|
145
145
|
### Version History
|
|
146
|
-
- **v1.5.
|
|
146
|
+
- **v1.5.26** (2025-06-26): Updated documentation and UI refactoring
|
|
147
|
+
- **v1.5.25** (2025-06-24): Updated raain-model to 3.0.14 and added progress bar
|
|
147
148
|
- **v1.5.24** (2025-06-16): Updated dependencies and enhanced build pipeline
|
|
148
149
|
- **v1.5.21** (2025-06-09): Minor updates and fixes
|
|
149
150
|
- **v1.5.20** (2025-06-09): Fixed compare functionality
|
package/esm2020/index.mjs
CHANGED
|
@@ -17,4 +17,6 @@ export * from './shared.pipe';
|
|
|
17
17
|
export * from './shared.module';
|
|
18
18
|
export * from './storage.service';
|
|
19
19
|
export * from './xytype';
|
|
20
|
-
|
|
20
|
+
export * from './profile-icon.directive';
|
|
21
|
+
export * from './pipes.module';
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9zaGFyZWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMscURBQXFELENBQUM7QUFDcEUsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxxREFBcUQsQ0FBQztBQUNwRSxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMseUNBQXlDLENBQUM7QUFFeEQsY0FBYyxTQUFTLENBQUM7QUFFeEIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3JhYWluLW1hcC9yYWFpbi1tYXAuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmFhaW4tY29tcGFyZS9yYWFpbi1jb21wYXJlLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JhYWluLWNvbmZpZ3VyYXRpb24vcmFhaW4tY29uZmlndXJhdGlvbi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1kYXRlLWZvY3VzL3JhYWluLWRhdGUtZm9jdXMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmFhaW4tZGF0ZS1keW5hbWljL3JhYWluLWRhdGUtZHluYW1pYy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1zcGVlZC9yYWFpbi1zcGVlZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWFpbi1jb21wYXJlLXN0YWNrL3JhYWluLWNvbXBhcmUtc3RhY2suY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmFhaW4tZ2xvYmUvcmFhaW4tZ2xvYmUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdG9vbHMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NhY2hlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9maWRqLXN0b3JhZ2UubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9maWxlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9yYWRhci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkLmNvbnN0JztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zaGFyZWQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4veHl0eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZmlsZS1pY29uLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVzLm1vZHVsZSc7XG4iXX0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { AreInProgressPipe, AreReady, AreStopped, HasGoodQuality, HasNotGoodQuality, HaveNotBeenRed, IsNotReady, IsReady, ProgressBuffer, ProgressValue, TimeframeComputationProgress, TimeframeQualityProgress, WaitForValidation, } from './shared.pipe';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class PipesModule {
|
|
5
|
+
}
|
|
6
|
+
PipesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PipesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
7
|
+
PipesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: PipesModule, declarations: [AreStopped,
|
|
8
|
+
AreInProgressPipe,
|
|
9
|
+
AreReady,
|
|
10
|
+
IsReady,
|
|
11
|
+
IsNotReady,
|
|
12
|
+
WaitForValidation,
|
|
13
|
+
HasGoodQuality,
|
|
14
|
+
HasNotGoodQuality,
|
|
15
|
+
ProgressValue,
|
|
16
|
+
ProgressBuffer,
|
|
17
|
+
HaveNotBeenRed,
|
|
18
|
+
TimeframeComputationProgress,
|
|
19
|
+
TimeframeQualityProgress], exports: [AreStopped,
|
|
20
|
+
AreInProgressPipe,
|
|
21
|
+
AreReady,
|
|
22
|
+
IsReady,
|
|
23
|
+
IsNotReady,
|
|
24
|
+
WaitForValidation,
|
|
25
|
+
HasGoodQuality,
|
|
26
|
+
HasNotGoodQuality,
|
|
27
|
+
ProgressValue,
|
|
28
|
+
ProgressBuffer,
|
|
29
|
+
HaveNotBeenRed,
|
|
30
|
+
TimeframeComputationProgress,
|
|
31
|
+
TimeframeQualityProgress] });
|
|
32
|
+
PipesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PipesModule });
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PipesModule, decorators: [{
|
|
34
|
+
type: NgModule,
|
|
35
|
+
args: [{
|
|
36
|
+
declarations: [
|
|
37
|
+
AreStopped,
|
|
38
|
+
AreInProgressPipe,
|
|
39
|
+
AreReady,
|
|
40
|
+
IsReady,
|
|
41
|
+
IsNotReady,
|
|
42
|
+
WaitForValidation,
|
|
43
|
+
HasGoodQuality,
|
|
44
|
+
HasNotGoodQuality,
|
|
45
|
+
ProgressValue,
|
|
46
|
+
ProgressBuffer,
|
|
47
|
+
HaveNotBeenRed,
|
|
48
|
+
TimeframeComputationProgress,
|
|
49
|
+
TimeframeQualityProgress,
|
|
50
|
+
],
|
|
51
|
+
exports: [
|
|
52
|
+
AreStopped,
|
|
53
|
+
AreInProgressPipe,
|
|
54
|
+
AreReady,
|
|
55
|
+
IsReady,
|
|
56
|
+
IsNotReady,
|
|
57
|
+
WaitForValidation,
|
|
58
|
+
HasGoodQuality,
|
|
59
|
+
HasNotGoodQuality,
|
|
60
|
+
ProgressValue,
|
|
61
|
+
ProgressBuffer,
|
|
62
|
+
HaveNotBeenRed,
|
|
63
|
+
TimeframeComputationProgress,
|
|
64
|
+
TimeframeQualityProgress,
|
|
65
|
+
],
|
|
66
|
+
}]
|
|
67
|
+
}] });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZXMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc2hhcmVkL3BpcGVzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFVBQVUsRUFDVixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGNBQWMsRUFDZCxhQUFhLEVBQ2IsNEJBQTRCLEVBQzVCLHdCQUF3QixFQUN4QixpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7O0FBa0N2QixNQUFNLE9BQU8sV0FBVzs7eUdBQVgsV0FBVzswR0FBWCxXQUFXLGlCQTlCaEIsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixRQUFRO1FBQ1IsT0FBTztRQUNQLFVBQVU7UUFDVixpQkFBaUI7UUFDakIsY0FBYztRQUNkLGlCQUFpQjtRQUNqQixhQUFhO1FBQ2IsY0FBYztRQUNkLGNBQWM7UUFDZCw0QkFBNEI7UUFDNUIsd0JBQXdCLGFBR3hCLFVBQVU7UUFDVixpQkFBaUI7UUFDakIsUUFBUTtRQUNSLE9BQU87UUFDUCxVQUFVO1FBQ1YsaUJBQWlCO1FBQ2pCLGNBQWM7UUFDZCxpQkFBaUI7UUFDakIsYUFBYTtRQUNiLGNBQWM7UUFDZCxjQUFjO1FBQ2QsNEJBQTRCO1FBQzVCLHdCQUF3QjswR0FHbkIsV0FBVzs0RkFBWCxXQUFXO2tCQWhDdkIsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUU7d0JBQ1YsVUFBVTt3QkFDVixpQkFBaUI7d0JBQ2pCLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLDRCQUE0Qjt3QkFDNUIsd0JBQXdCO3FCQUMzQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ0wsVUFBVTt3QkFDVixpQkFBaUI7d0JBQ2pCLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLDRCQUE0Qjt3QkFDNUIsd0JBQXdCO3FCQUMzQjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBcmVJblByb2dyZXNzUGlwZSxcbiAgICBBcmVSZWFkeSxcbiAgICBBcmVTdG9wcGVkLFxuICAgIEhhc0dvb2RRdWFsaXR5LFxuICAgIEhhc05vdEdvb2RRdWFsaXR5LFxuICAgIEhhdmVOb3RCZWVuUmVkLFxuICAgIElzTm90UmVhZHksXG4gICAgSXNSZWFkeSxcbiAgICBQcm9ncmVzc0J1ZmZlcixcbiAgICBQcm9ncmVzc1ZhbHVlLFxuICAgIFRpbWVmcmFtZUNvbXB1dGF0aW9uUHJvZ3Jlc3MsXG4gICAgVGltZWZyYW1lUXVhbGl0eVByb2dyZXNzLFxuICAgIFdhaXRGb3JWYWxpZGF0aW9uLFxufSBmcm9tICcuL3NoYXJlZC5waXBlJztcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgQXJlU3RvcHBlZCxcbiAgICAgICAgQXJlSW5Qcm9ncmVzc1BpcGUsXG4gICAgICAgIEFyZVJlYWR5LFxuICAgICAgICBJc1JlYWR5LFxuICAgICAgICBJc05vdFJlYWR5LFxuICAgICAgICBXYWl0Rm9yVmFsaWRhdGlvbixcbiAgICAgICAgSGFzR29vZFF1YWxpdHksXG4gICAgICAgIEhhc05vdEdvb2RRdWFsaXR5LFxuICAgICAgICBQcm9ncmVzc1ZhbHVlLFxuICAgICAgICBQcm9ncmVzc0J1ZmZlcixcbiAgICAgICAgSGF2ZU5vdEJlZW5SZWQsXG4gICAgICAgIFRpbWVmcmFtZUNvbXB1dGF0aW9uUHJvZ3Jlc3MsXG4gICAgICAgIFRpbWVmcmFtZVF1YWxpdHlQcm9ncmVzcyxcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgQXJlU3RvcHBlZCxcbiAgICAgICAgQXJlSW5Qcm9ncmVzc1BpcGUsXG4gICAgICAgIEFyZVJlYWR5LFxuICAgICAgICBJc1JlYWR5LFxuICAgICAgICBJc05vdFJlYWR5LFxuICAgICAgICBXYWl0Rm9yVmFsaWRhdGlvbixcbiAgICAgICAgSGFzR29vZFF1YWxpdHksXG4gICAgICAgIEhhc05vdEdvb2RRdWFsaXR5LFxuICAgICAgICBQcm9ncmVzc1ZhbHVlLFxuICAgICAgICBQcm9ncmVzc0J1ZmZlcixcbiAgICAgICAgSGF2ZU5vdEJlZW5SZWQsXG4gICAgICAgIFRpbWVmcmFtZUNvbXB1dGF0aW9uUHJvZ3Jlc3MsXG4gICAgICAgIFRpbWVmcmFtZVF1YWxpdHlQcm9ncmVzcyxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQaXBlc01vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./profile.service";
|
|
4
|
+
import * as i2 from "@angular/router";
|
|
5
|
+
// Helper function to pause execution for a specified time in milliseconds
|
|
6
|
+
function sleep(ms) {
|
|
7
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
8
|
+
}
|
|
9
|
+
export class ProfileIconDirective {
|
|
10
|
+
constructor(el, profileService, router) {
|
|
11
|
+
this.el = el;
|
|
12
|
+
this.profileService = profileService;
|
|
13
|
+
this.router = router;
|
|
14
|
+
this.isConnected = true;
|
|
15
|
+
}
|
|
16
|
+
ngOnInit() {
|
|
17
|
+
// Check if the user is logged in and if the toolbar is not inside a modal
|
|
18
|
+
if (this.profileService.isLoggedIn() && !this.isInsideModal()) {
|
|
19
|
+
// Get the email from the profile service
|
|
20
|
+
const email = this.profileService.getEmail();
|
|
21
|
+
// Create the profile button element
|
|
22
|
+
const profileButtons = document.createElement('ion-buttons');
|
|
23
|
+
profileButtons.setAttribute('slot', 'primary');
|
|
24
|
+
// Create the button
|
|
25
|
+
const button = document.createElement('ion-button');
|
|
26
|
+
// Store references for later use
|
|
27
|
+
this.profileButton = button;
|
|
28
|
+
// Create the skeleton text element (hidden initially)
|
|
29
|
+
const skeleton = document.createElement('ion-skeleton-text');
|
|
30
|
+
skeleton.setAttribute('animated', 'true');
|
|
31
|
+
skeleton.style.width = '100px';
|
|
32
|
+
skeleton.style.height = '20px';
|
|
33
|
+
skeleton.style.borderRadius = '4px';
|
|
34
|
+
skeleton.style.margin = '8px 16px';
|
|
35
|
+
skeleton.style.display = 'none';
|
|
36
|
+
// Store reference to the skeleton text
|
|
37
|
+
this.skeletonText = skeleton;
|
|
38
|
+
// Add the skeleton text to the buttons container
|
|
39
|
+
profileButtons.appendChild(skeleton);
|
|
40
|
+
// Create the icon
|
|
41
|
+
const icon = document.createElement('ion-icon');
|
|
42
|
+
icon.setAttribute('name', 'person-circle-outline');
|
|
43
|
+
icon.setAttribute('slot', 'start');
|
|
44
|
+
// Create the label
|
|
45
|
+
const label = document.createElement('ion-label');
|
|
46
|
+
label.textContent = email;
|
|
47
|
+
// Assemble the button
|
|
48
|
+
button.appendChild(icon);
|
|
49
|
+
button.appendChild(label);
|
|
50
|
+
// Add click event listener to the button
|
|
51
|
+
button.addEventListener('click', () => {
|
|
52
|
+
this.navigateToProfile();
|
|
53
|
+
});
|
|
54
|
+
// Assemble the buttons container
|
|
55
|
+
profileButtons.appendChild(button);
|
|
56
|
+
// Append the buttons to the toolbar
|
|
57
|
+
this.el.nativeElement.appendChild(profileButtons);
|
|
58
|
+
// Start the background refresh timer (check every minute)
|
|
59
|
+
this.startBackgroundRefresh();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
ngOnDestroy() {
|
|
63
|
+
// Clear the timer when the directive is destroyed
|
|
64
|
+
if (this.refreshTimer) {
|
|
65
|
+
clearInterval(this.refreshTimer);
|
|
66
|
+
this.refreshTimer = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
navigateToProfile() {
|
|
70
|
+
this.router.navigateByUrl('/profile');
|
|
71
|
+
}
|
|
72
|
+
startBackgroundRefresh() {
|
|
73
|
+
this.refreshTimer = setInterval(() => {
|
|
74
|
+
this.checkAndRefreshConnection();
|
|
75
|
+
}, 20000);
|
|
76
|
+
}
|
|
77
|
+
checkAndRefreshConnection() {
|
|
78
|
+
this.performConnectionRefresh();
|
|
79
|
+
}
|
|
80
|
+
showSkeletonText() {
|
|
81
|
+
if (this.skeletonText && this.profileButton) {
|
|
82
|
+
this.profileButton.style.display = 'none';
|
|
83
|
+
this.skeletonText.style.display = 'block';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
hideSkeletonText() {
|
|
87
|
+
if (this.skeletonText && this.profileButton) {
|
|
88
|
+
this.profileButton.style.display = 'flex';
|
|
89
|
+
this.skeletonText.style.display = 'none';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async performConnectionRefresh() {
|
|
93
|
+
// Show skeleton text and hide button during loading
|
|
94
|
+
this.showSkeletonText();
|
|
95
|
+
// Connection successful
|
|
96
|
+
this.isConnected = await this.profileService.isConnected();
|
|
97
|
+
if (this.isConnected) {
|
|
98
|
+
// Call the refresh function
|
|
99
|
+
if (this.profileService.needsConnectionRefresh()) {
|
|
100
|
+
await this.profileService.connectionRefresh();
|
|
101
|
+
}
|
|
102
|
+
await sleep(1000);
|
|
103
|
+
}
|
|
104
|
+
this.updateButtonState();
|
|
105
|
+
// Hide skeleton text and show button when loading is complete
|
|
106
|
+
this.hideSkeletonText();
|
|
107
|
+
}
|
|
108
|
+
updateButtonState() {
|
|
109
|
+
if (this.profileButton) {
|
|
110
|
+
if (this.isConnected) {
|
|
111
|
+
// Enable button
|
|
112
|
+
this.profileButton.removeAttribute('disabled');
|
|
113
|
+
this.profileButton.removeAttribute('title');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Disable button and add tooltip
|
|
117
|
+
this.profileButton.setAttribute('disabled', 'true');
|
|
118
|
+
this.profileButton.setAttribute('title', 'Profile unavailable - No connection');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Helper method to check if the toolbar is inside a modal
|
|
123
|
+
isInsideModal() {
|
|
124
|
+
let parent = this.el.nativeElement.parentElement;
|
|
125
|
+
// Traverse up the DOM tree to find if any parent is an ion-modal
|
|
126
|
+
while (parent) {
|
|
127
|
+
if (parent.tagName && parent.tagName.toLowerCase() === 'ion-modal') {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
parent = parent.parentElement;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
ProfileIconDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProfileIconDirective, deps: [{ token: i0.ElementRef }, { token: i1.ProfileService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Directive });
|
|
136
|
+
ProfileIconDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ProfileIconDirective, selector: "ion-toolbar", ngImport: i0 });
|
|
137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProfileIconDirective, decorators: [{
|
|
138
|
+
type: Directive,
|
|
139
|
+
args: [{
|
|
140
|
+
selector: 'ion-toolbar',
|
|
141
|
+
}]
|
|
142
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ProfileService }, { type: i2.Router }]; } });
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS1pY29uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3NoYXJlZC9wcm9maWxlLWljb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQWdDLE1BQU0sZUFBZSxDQUFDOzs7O0FBSXZFLDBFQUEwRTtBQUMxRSxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3JCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBS0QsTUFBTSxPQUFPLG9CQUFvQjtJQU03QixZQUNZLEVBQWMsRUFDZCxjQUE4QixFQUM5QixNQUFjO1FBRmQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBTGxCLGdCQUFXLEdBQVksSUFBSSxDQUFDO0lBTWpDLENBQUM7SUFFSixRQUFRO1FBQ0osMEVBQTBFO1FBQzFFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUMzRCx5Q0FBeUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUU3QyxvQ0FBb0M7WUFDcEMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3RCxjQUFjLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUUvQyxvQkFBb0I7WUFDcEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVwRCxpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFFNUIsc0RBQXNEO1lBQ3RELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUM3RCxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7WUFDL0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUNwQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7WUFDbkMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBRWhDLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztZQUU3QixpREFBaUQ7WUFDakQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVyQyxrQkFBa0I7WUFDbEIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLG1CQUFtQjtZQUNuQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBRTFCLHNCQUFzQjtZQUN0QixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFMUIseUNBQXlDO1lBQ3pDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO2dCQUNsQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztZQUVILGlDQUFpQztZQUNqQyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRW5DLG9DQUFvQztZQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFbEQsMERBQTBEO1lBQzFELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDckMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVPLHlCQUF5QjtRQUM3QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUM3QztJQUNMLENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQzVDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyx3QkFBd0I7UUFDbEMsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsNEJBQTRCO1lBQzVCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO2dCQUM5QyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUNqRDtZQUNELE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsOERBQThEO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxpQkFBaUI7UUFDckIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbEIsZ0JBQWdCO2dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDL0M7aUJBQU07Z0JBQ0gsaUNBQWlDO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO2FBQ25GO1NBQ0o7SUFDTCxDQUFDO0lBRUQsMERBQTBEO0lBQ2xELGFBQWE7UUFDakIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1FBRWpELGlFQUFpRTtRQUNqRSxPQUFPLE1BQU0sRUFBRTtZQUNYLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLFdBQVcsRUFBRTtnQkFDaEUsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7a0hBM0pRLG9CQUFvQjtzR0FBcEIsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBSGhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGFBQWE7aUJBQzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UHJvZmlsZVNlcnZpY2V9IGZyb20gJy4vcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gcGF1c2UgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCB0aW1lIGluIG1pbGxpc2Vjb25kc1xuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lvbi10b29sYmFyJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZmlsZUljb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IGFueTtcbiAgICBwcml2YXRlIHByb2ZpbGVCdXR0b246IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgc2tlbGV0b25UZXh0OiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBsb2dnZWQgaW4gYW5kIGlmIHRoZSB0b29sYmFyIGlzIG5vdCBpbnNpZGUgYSBtb2RhbFxuICAgICAgICBpZiAodGhpcy5wcm9maWxlU2VydmljZS5pc0xvZ2dlZEluKCkgJiYgIXRoaXMuaXNJbnNpZGVNb2RhbCgpKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGVtYWlsIGZyb20gdGhlIHByb2ZpbGUgc2VydmljZVxuICAgICAgICAgICAgY29uc3QgZW1haWwgPSB0aGlzLnByb2ZpbGVTZXJ2aWNlLmdldEVtYWlsKCk7XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcHJvZmlsZSBidXR0b24gZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcHJvZmlsZUJ1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpb24tYnV0dG9ucycpO1xuICAgICAgICAgICAgcHJvZmlsZUJ1dHRvbnMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3ByaW1hcnknKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lvbi1idXR0b24nKTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlcyBmb3IgbGF0ZXIgdXNlXG4gICAgICAgICAgICB0aGlzLnByb2ZpbGVCdXR0b24gPSBidXR0b247XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2tlbGV0b24gdGV4dCBlbGVtZW50IChoaWRkZW4gaW5pdGlhbGx5KVxuICAgICAgICAgICAgY29uc3Qgc2tlbGV0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpb24tc2tlbGV0b24tdGV4dCcpO1xuICAgICAgICAgICAgc2tlbGV0b24uc2V0QXR0cmlidXRlKCdhbmltYXRlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICBza2VsZXRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG4gICAgICAgICAgICBza2VsZXRvbi5zdHlsZS5oZWlnaHQgPSAnMjBweCc7XG4gICAgICAgICAgICBza2VsZXRvbi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICAgICAgICAgIHNrZWxldG9uLnN0eWxlLm1hcmdpbiA9ICc4cHggMTZweCc7XG4gICAgICAgICAgICBza2VsZXRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gdGhlIHNrZWxldG9uIHRleHRcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25UZXh0ID0gc2tlbGV0b247XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgc2tlbGV0b24gdGV4dCB0byB0aGUgYnV0dG9ucyBjb250YWluZXJcbiAgICAgICAgICAgIHByb2ZpbGVCdXR0b25zLmFwcGVuZENoaWxkKHNrZWxldG9uKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBpY29uXG4gICAgICAgICAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW9uLWljb24nKTtcbiAgICAgICAgICAgIGljb24uc2V0QXR0cmlidXRlKCduYW1lJywgJ3BlcnNvbi1jaXJjbGUtb3V0bGluZScpO1xuICAgICAgICAgICAgaWNvbi5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnc3RhcnQnKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBsYWJlbFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpb24tbGFiZWwnKTtcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gZW1haWw7XG5cbiAgICAgICAgICAgIC8vIEFzc2VtYmxlIHRoZSBidXR0b25cbiAgICAgICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChpY29uKTtcbiAgICAgICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChsYWJlbCk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgYnV0dG9uXG4gICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUHJvZmlsZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEFzc2VtYmxlIHRoZSBidXR0b25zIGNvbnRhaW5lclxuICAgICAgICAgICAgcHJvZmlsZUJ1dHRvbnMuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBidXR0b25zIHRvIHRoZSB0b29sYmFyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvZmlsZUJ1dHRvbnMpO1xuXG4gICAgICAgICAgICAvLyBTdGFydCB0aGUgYmFja2dyb3VuZCByZWZyZXNoIHRpbWVyIChjaGVjayBldmVyeSBtaW51dGUpXG4gICAgICAgICAgICB0aGlzLnN0YXJ0QmFja2dyb3VuZFJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICAvLyBDbGVhciB0aGUgdGltZXIgd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGRlc3Ryb3llZFxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWZyZXNoVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmF2aWdhdGVUb1Byb2ZpbGUoKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoJy9wcm9maWxlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydEJhY2tncm91bmRSZWZyZXNoKCkge1xuICAgICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRSZWZyZXNoQ29ubmVjdGlvbigpO1xuICAgICAgICB9LCAyMDAwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0FuZFJlZnJlc2hDb25uZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnBlcmZvcm1Db25uZWN0aW9uUmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd1NrZWxldG9uVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2tlbGV0b25UZXh0ICYmIHRoaXMucHJvZmlsZUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5wcm9maWxlQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZVNrZWxldG9uVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2tlbGV0b25UZXh0ICYmIHRoaXMucHJvZmlsZUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5wcm9maWxlQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQ29ubmVjdGlvblJlZnJlc2goKSB7XG4gICAgICAgIC8vIFNob3cgc2tlbGV0b24gdGV4dCBhbmQgaGlkZSBidXR0b24gZHVyaW5nIGxvYWRpbmdcbiAgICAgICAgdGhpcy5zaG93U2tlbGV0b25UZXh0KCk7XG5cbiAgICAgICAgLy8gQ29ubmVjdGlvbiBzdWNjZXNzZnVsXG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBhd2FpdCB0aGlzLnByb2ZpbGVTZXJ2aWNlLmlzQ29ubmVjdGVkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlZnJlc2ggZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICh0aGlzLnByb2ZpbGVTZXJ2aWNlLm5lZWRzQ29ubmVjdGlvblJlZnJlc2goKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuY29ubmVjdGlvblJlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQnV0dG9uU3RhdGUoKTtcblxuICAgICAgICAvLyBIaWRlIHNrZWxldG9uIHRleHQgYW5kIHNob3cgYnV0dG9uIHdoZW4gbG9hZGluZyBpcyBjb21wbGV0ZVxuICAgICAgICB0aGlzLmhpZGVTa2VsZXRvblRleHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUJ1dHRvblN0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9maWxlQnV0dG9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBidXR0b25cbiAgICAgICAgICAgICAgICB0aGlzLnByb2ZpbGVCdXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZUJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERpc2FibGUgYnV0dG9uIGFuZCBhZGQgdG9vbHRpcFxuICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2ZpbGVCdXR0b24uc2V0QXR0cmlidXRlKCd0aXRsZScsICdQcm9maWxlIHVuYXZhaWxhYmxlIC0gTm8gY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdG9vbGJhciBpcyBpbnNpZGUgYSBtb2RhbFxuICAgIHByaXZhdGUgaXNJbnNpZGVNb2RhbCgpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIGlmIGFueSBwYXJlbnQgaXMgYW4gaW9uLW1vZGFsXG4gICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnQudGFnTmFtZSAmJiBwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW9uLW1vZGFsJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19
|