@testgorilla/tgo-immersive-test 2.0.0 → 3.0.0
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 +0 -1
- package/fesm2022/testgorilla-tgo-immersive-test.mjs +462 -0
- package/fesm2022/testgorilla-tgo-immersive-test.mjs.map +1 -0
- package/lib/components/immersive-test/immersive-test.component.d.ts +53 -0
- package/{src/lib/components/index.ts → lib/components/index.d.ts} +0 -2
- package/lib/components/review-instructions-dialog/review-instructions-dialog.component.d.ts +24 -0
- package/lib/components/ringing-phone-animation/ringing-phone-animation.component.d.ts +13 -0
- package/lib/components/ringing-phone-animation/ringing-phone-animation.sound.d.ts +1 -0
- package/lib/components/video-countdown/video-countdown.component.d.ts +24 -0
- package/lib/models/index.d.ts +2 -0
- package/lib/models/translations.d.ts +1 -0
- package/lib/services/index.d.ts +1 -0
- package/package.json +30 -13
- package/.eslintrc.json +0 -47
- package/jest.config.ts +0 -34
- package/ng-package.json +0 -16
- package/project.json +0 -48
- package/src/lib/components/immersive-test/immersive-test.component.html +0 -100
- package/src/lib/components/immersive-test/immersive-test.component.scss +0 -247
- package/src/lib/components/immersive-test/immersive-test.component.spec.ts +0 -583
- package/src/lib/components/immersive-test/immersive-test.component.ts +0 -278
- package/src/lib/components/review-instructions-dialog/review-instructions-dialog.component.html +0 -39
- package/src/lib/components/review-instructions-dialog/review-instructions-dialog.component.scss +0 -160
- package/src/lib/components/review-instructions-dialog/review-instructions-dialog.component.spec.ts +0 -81
- package/src/lib/components/review-instructions-dialog/review-instructions-dialog.component.ts +0 -79
- package/src/lib/components/ringing-phone-animation/ringing-phone-animation.component.html +0 -16
- package/src/lib/components/ringing-phone-animation/ringing-phone-animation.component.scss +0 -79
- package/src/lib/components/ringing-phone-animation/ringing-phone-animation.component.spec.ts +0 -104
- package/src/lib/components/ringing-phone-animation/ringing-phone-animation.component.ts +0 -53
- package/src/lib/components/ringing-phone-animation/ringing-phone-animation.sound.ts +0 -2
- package/src/lib/components/video-countdown/video-countdown.component.html +0 -10
- package/src/lib/components/video-countdown/video-countdown.component.scss +0 -16
- package/src/lib/components/video-countdown/video-countdown.component.spec.ts +0 -58
- package/src/lib/components/video-countdown/video-countdown.component.ts +0 -100
- package/src/lib/models/index.ts +0 -9
- package/src/lib/models/translations.ts +0 -3
- package/src/lib/services/index.ts +0 -7
- package/src/test-setup.ts +0 -62
- package/tsconfig.json +0 -20
- package/tsconfig.lib.json +0 -20
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -17
- /package/{src/assets → assets}/i18n/en.json +0 -0
- /package/{src/index.ts → index.d.ts} +0 -0
- /package/{src/lib/components/review-instructions-dialog/index.ts → lib/components/review-instructions-dialog/index.d.ts} +0 -0
- /package/{src/lib/components/ringing-phone-animation/index.ts → lib/components/ringing-phone-animation/index.d.ts} +0 -0
- /package/{src/lib/components/video-countdown/index.ts → lib/components/video-countdown/index.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -95,7 +95,6 @@ This library requires the following peer dependencies:
|
|
|
95
95
|
- `@angular/material` ~18.2.14 (for dialog support)
|
|
96
96
|
- `@ngneat/transloco` ~4.3.0
|
|
97
97
|
- `@testgorilla/tgo-ui` ~3.14.10
|
|
98
|
-
- `@vimeo/player` ^2.25.1
|
|
99
98
|
- `ngx-quill` ^26.0.10 (for rich text display in review instructions)
|
|
100
99
|
- `rxjs` ~7.8.1
|
|
101
100
|
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { TranslocoLazyModuleUtils, getAvailableLangs, MediaService, ThemeService, VimeoVideoComponent, AudioAnimationComponent, ROOT_TRANSLATIONS_SCOPE } from '@testgorilla/tgo-shared-lib';
|
|
2
|
+
export { MediaService, ROOT_TRANSLATIONS_SCOPE, ThemeService, TranslocoLazyModuleUtils, getAvailableLangs } from '@testgorilla/tgo-shared-lib';
|
|
3
|
+
import { trigger, transition, style, animate } from '@angular/animations';
|
|
4
|
+
import * as i1 from '@angular/common';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
import * as i0 from '@angular/core';
|
|
7
|
+
import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component, signal, inject, ChangeDetectorRef, Inject, ViewChild } from '@angular/core';
|
|
8
|
+
import * as i1$1 from '@angular/material/dialog';
|
|
9
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
10
|
+
import * as i3 from '@ngneat/transloco';
|
|
11
|
+
import { TranslocoService, TRANSLOCO_SCOPE, TranslocoModule } from '@ngneat/transloco';
|
|
12
|
+
import * as i5 from '@testgorilla/tgo-ui/components/card';
|
|
13
|
+
import { CardComponentModule } from '@testgorilla/tgo-ui/components/card';
|
|
14
|
+
import * as i4 from '@testgorilla/tgo-ui/components/dialog';
|
|
15
|
+
import { DialogComponentModule, DialogService } from '@testgorilla/tgo-ui/components/dialog';
|
|
16
|
+
import { QuillViewComponent } from 'ngx-quill';
|
|
17
|
+
import { firstValueFrom, Subject, takeUntil, catchError } from 'rxjs';
|
|
18
|
+
import * as i1$2 from '@testgorilla/tgo-ui/components/button';
|
|
19
|
+
import { ButtonComponentModule } from '@testgorilla/tgo-ui/components/button';
|
|
20
|
+
import * as i2 from '@testgorilla/tgo-ui/components/icon';
|
|
21
|
+
import { IconComponentModule } from '@testgorilla/tgo-ui/components/icon';
|
|
22
|
+
|
|
23
|
+
class VideoCountdownComponent {
|
|
24
|
+
cdr;
|
|
25
|
+
startFrom = 5;
|
|
26
|
+
endAt = 0;
|
|
27
|
+
interval = 1325;
|
|
28
|
+
finished = new EventEmitter();
|
|
29
|
+
isActive = false;
|
|
30
|
+
displayNum = {
|
|
31
|
+
key: this.startFrom,
|
|
32
|
+
value: this.startFrom,
|
|
33
|
+
};
|
|
34
|
+
timeoutId = null;
|
|
35
|
+
constructor(cdr) {
|
|
36
|
+
this.cdr = cdr;
|
|
37
|
+
}
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
this.start();
|
|
40
|
+
}
|
|
41
|
+
start() {
|
|
42
|
+
this.isActive = true;
|
|
43
|
+
this.displayNum = { key: this.startFrom, value: this.startFrom };
|
|
44
|
+
this.scheduleAnimation();
|
|
45
|
+
}
|
|
46
|
+
ngOnDestroy() {
|
|
47
|
+
this.isActive = false;
|
|
48
|
+
if (this.timeoutId) {
|
|
49
|
+
clearTimeout(this.timeoutId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
scheduleAnimation() {
|
|
53
|
+
this.timeoutId = setTimeout(() => {
|
|
54
|
+
this.anim();
|
|
55
|
+
}, this.interval);
|
|
56
|
+
}
|
|
57
|
+
anim() {
|
|
58
|
+
if (!this.isActive) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.updateNumber();
|
|
62
|
+
this.cdr.markForCheck();
|
|
63
|
+
if (this.displayNum && this.displayNum.value === this.endAt) {
|
|
64
|
+
this.finished.emit();
|
|
65
|
+
this.isActive = false;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.scheduleAnimation();
|
|
69
|
+
}
|
|
70
|
+
updateNumber() {
|
|
71
|
+
if (this.displayNum && this.displayNum.value === this.endAt) {
|
|
72
|
+
this.displayNum = { key: this.startFrom, value: this.startFrom - 1 };
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.displayNum = {
|
|
76
|
+
key: this.displayNum.value - 1,
|
|
77
|
+
value: this.displayNum.value - 1,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: VideoCountdownComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
82
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: VideoCountdownComponent, isStandalone: true, selector: "tgo-video-countdown", inputs: { startFrom: "startFrom", endAt: "endAt", interval: "interval" }, outputs: { finished: "finished" }, ngImport: i0, template: "<div class=\"video-countdown\">\n <div\n class=\"video-countdown-element\"\n *ngFor=\"let num of [displayNum]\"\n @zoomInOut\n >\n {{ num.value }}\n </div>\n</div>\n\n", styles: [".video-countdown{display:flex;justify-content:center}.video-countdown-element{position:absolute;font-size:80px;font-weight:700;line-height:1;-webkit-user-select:none;user-select:none;opacity:1;backface-visibility:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [
|
|
83
|
+
trigger('zoomInOut', [
|
|
84
|
+
transition(':enter', [
|
|
85
|
+
style({ transform: 'scale(0)', opacity: 0 }),
|
|
86
|
+
animate('300ms ease-out', style({ transform: 'scale(1.2)', opacity: 1 })),
|
|
87
|
+
animate('100ms ease-in', style({ transform: 'scale(1)' })),
|
|
88
|
+
]),
|
|
89
|
+
transition(':leave', [
|
|
90
|
+
style({ opacity: 1 }),
|
|
91
|
+
animate('100ms ease-out', style({ transform: 'scale(1.2)', opacity: 0.5 })),
|
|
92
|
+
animate('200ms ease-in', style({ transform: 'scale(0)', opacity: 0 })),
|
|
93
|
+
]),
|
|
94
|
+
]),
|
|
95
|
+
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: VideoCountdownComponent, decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{ selector: 'tgo-video-countdown', animations: [
|
|
100
|
+
trigger('zoomInOut', [
|
|
101
|
+
transition(':enter', [
|
|
102
|
+
style({ transform: 'scale(0)', opacity: 0 }),
|
|
103
|
+
animate('300ms ease-out', style({ transform: 'scale(1.2)', opacity: 1 })),
|
|
104
|
+
animate('100ms ease-in', style({ transform: 'scale(1)' })),
|
|
105
|
+
]),
|
|
106
|
+
transition(':leave', [
|
|
107
|
+
style({ opacity: 1 }),
|
|
108
|
+
animate('100ms ease-out', style({ transform: 'scale(1.2)', opacity: 0.5 })),
|
|
109
|
+
animate('200ms ease-in', style({ transform: 'scale(0)', opacity: 0 })),
|
|
110
|
+
]),
|
|
111
|
+
]),
|
|
112
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule], template: "<div class=\"video-countdown\">\n <div\n class=\"video-countdown-element\"\n *ngFor=\"let num of [displayNum]\"\n @zoomInOut\n >\n {{ num.value }}\n </div>\n</div>\n\n", styles: [".video-countdown{display:flex;justify-content:center}.video-countdown-element{position:absolute;font-size:80px;font-weight:700;line-height:1;-webkit-user-select:none;user-select:none;opacity:1;backface-visibility:hidden}\n"] }]
|
|
113
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { startFrom: [{
|
|
114
|
+
type: Input
|
|
115
|
+
}], endAt: [{
|
|
116
|
+
type: Input
|
|
117
|
+
}], interval: [{
|
|
118
|
+
type: Input
|
|
119
|
+
}], finished: [{
|
|
120
|
+
type: Output
|
|
121
|
+
}] } });
|
|
122
|
+
|
|
123
|
+
const ringingPhoneSound = `data:audio/mp3;base64,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`;
|
|
124
|
+
|
|
125
|
+
class RingingPhoneAnimationComponent {
|
|
126
|
+
isRinging = true;
|
|
127
|
+
ringingSignal = signal(this.isRinging);
|
|
128
|
+
audio = new Audio(ringingPhoneSound);
|
|
129
|
+
ngOnChanges(changes) {
|
|
130
|
+
if (changes['isRinging']) {
|
|
131
|
+
this.ringingSignal.set(this.isRinging);
|
|
132
|
+
if (this.isRinging) {
|
|
133
|
+
this.startRinging();
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.stopRinging();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
ngOnDestroy() {
|
|
141
|
+
this.stopRinging();
|
|
142
|
+
}
|
|
143
|
+
stopRinging() {
|
|
144
|
+
this.ringingSignal.set(false);
|
|
145
|
+
this.audio.pause();
|
|
146
|
+
this.audio.currentTime = 0;
|
|
147
|
+
}
|
|
148
|
+
startRinging() {
|
|
149
|
+
this.audio.loop = true;
|
|
150
|
+
this.audio.volume = 0.15;
|
|
151
|
+
void this.audio.play();
|
|
152
|
+
}
|
|
153
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: RingingPhoneAnimationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
154
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: RingingPhoneAnimationComponent, isStandalone: true, selector: "tgo-ringing-phone-animation", inputs: { isRinging: "isRinging" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"ringing-phone-animation-wrapper\">\n <section class=\"ringing-phone-animation-container\">\n <div class=\"ringing-effect\" *ngIf=\"ringingSignal()\">\n <div class=\"ringing-line first-line\"></div>\n <div class=\"ringing-line second-line\"></div>\n <div class=\"ringing-line third-line\"></div>\n </div>\n <svg width=\"76\" height=\"30\" viewBox=\"0 0 76 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9.33348 28.5122L1.66681 21.0122C1.00014 20.3455 0.666809 19.5678 0.666809 18.6789C0.666809 17.79 1.00014 17.0122 1.66681 16.3455C6.5557 11.0678 12.1946 7.10943 18.5835 4.47054C24.9724 1.83165 31.4446 0.512207 38.0001 0.512207C44.5557 0.512207 51.014 1.83165 57.3751 4.47054C63.7363 7.10943 69.389 11.0678 74.3335 16.3455C75.0001 17.0122 75.3335 17.79 75.3335 18.6789C75.3335 19.5678 75.0001 20.3455 74.3335 21.0122L66.6668 28.5122C66.0557 29.1233 65.3474 29.4567 64.5418 29.5122C63.7363 29.5678 63.0001 29.3455 62.3335 28.8455L52.6668 21.5122C52.2224 21.1789 51.889 20.79 51.6668 20.3455C51.4446 19.9011 51.3335 19.4011 51.3335 18.8455V9.34554C49.2224 8.67888 47.0557 8.1511 44.8335 7.76221C42.6113 7.37332 40.3335 7.17887 38.0001 7.17887C35.6668 7.17887 33.389 7.37332 31.1668 7.76221C28.9446 8.1511 26.7779 8.67888 24.6668 9.34554V18.8455C24.6668 19.4011 24.5557 19.9011 24.3335 20.3455C24.1113 20.79 23.7779 21.1789 23.3335 21.5122L13.6668 28.8455C13.0001 29.3455 12.264 29.5678 11.4585 29.5122C10.6529 29.4567 9.94459 29.1233 9.33348 28.5122ZM18.0001 11.6789C16.389 12.5122 14.8335 13.4705 13.3335 14.5539C11.8335 15.6372 10.2779 16.8455 8.66681 18.1789L12.0001 21.5122L18.0001 16.8455V11.6789ZM58.0001 11.8455V16.8455L64.0001 21.5122L67.3335 18.3455C65.7224 16.9011 64.1668 15.6511 62.6668 14.5955C61.1668 13.54 59.6113 12.6233 58.0001 11.8455Z\"\n fill=\"white\"\n />\n </svg>\n </section>\n</div>\n\n", styles: [".ringing-phone-animation-wrapper{display:flex;justify-content:center;align-items:center}.ringing-phone-animation-wrapper .ringing-phone-animation-container{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect{display:flex;gap:15px;opacity:1;animation:blink-wrapper 1.4s infinite;animation-delay:.8s}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .ringing-line{width:6px;height:16px;background-color:#fff;opacity:0}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .first-line{animation:blink-line 1.4s infinite;animation-delay:.1s;transform:rotate(-45deg)}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .second-line{animation:blink-line 1.4s infinite;animation-delay:.3s;transform:translateY(-50%)}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .third-line{animation:blink-line 1.4s infinite;animation-delay:.6s;transform:rotate(45deg)}.ringing-phone-animation-wrapper .ringing-phone-animation-container .answer-btn{margin-top:20px;padding:10px 20px;background-color:#fff;border:none;border-radius:20px;cursor:pointer;font-size:16px}@keyframes blink-line{0%,49%{opacity:0}50%,to{opacity:1}}@keyframes blink-wrapper{0%,49%{opacity:1}50%,to{opacity:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
155
|
+
}
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: RingingPhoneAnimationComponent, decorators: [{
|
|
157
|
+
type: Component,
|
|
158
|
+
args: [{ selector: 'tgo-ringing-phone-animation', imports: [CommonModule], template: "<div class=\"ringing-phone-animation-wrapper\">\n <section class=\"ringing-phone-animation-container\">\n <div class=\"ringing-effect\" *ngIf=\"ringingSignal()\">\n <div class=\"ringing-line first-line\"></div>\n <div class=\"ringing-line second-line\"></div>\n <div class=\"ringing-line third-line\"></div>\n </div>\n <svg width=\"76\" height=\"30\" viewBox=\"0 0 76 30\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9.33348 28.5122L1.66681 21.0122C1.00014 20.3455 0.666809 19.5678 0.666809 18.6789C0.666809 17.79 1.00014 17.0122 1.66681 16.3455C6.5557 11.0678 12.1946 7.10943 18.5835 4.47054C24.9724 1.83165 31.4446 0.512207 38.0001 0.512207C44.5557 0.512207 51.014 1.83165 57.3751 4.47054C63.7363 7.10943 69.389 11.0678 74.3335 16.3455C75.0001 17.0122 75.3335 17.79 75.3335 18.6789C75.3335 19.5678 75.0001 20.3455 74.3335 21.0122L66.6668 28.5122C66.0557 29.1233 65.3474 29.4567 64.5418 29.5122C63.7363 29.5678 63.0001 29.3455 62.3335 28.8455L52.6668 21.5122C52.2224 21.1789 51.889 20.79 51.6668 20.3455C51.4446 19.9011 51.3335 19.4011 51.3335 18.8455V9.34554C49.2224 8.67888 47.0557 8.1511 44.8335 7.76221C42.6113 7.37332 40.3335 7.17887 38.0001 7.17887C35.6668 7.17887 33.389 7.37332 31.1668 7.76221C28.9446 8.1511 26.7779 8.67888 24.6668 9.34554V18.8455C24.6668 19.4011 24.5557 19.9011 24.3335 20.3455C24.1113 20.79 23.7779 21.1789 23.3335 21.5122L13.6668 28.8455C13.0001 29.3455 12.264 29.5678 11.4585 29.5122C10.6529 29.4567 9.94459 29.1233 9.33348 28.5122ZM18.0001 11.6789C16.389 12.5122 14.8335 13.4705 13.3335 14.5539C11.8335 15.6372 10.2779 16.8455 8.66681 18.1789L12.0001 21.5122L18.0001 16.8455V11.6789ZM58.0001 11.8455V16.8455L64.0001 21.5122L67.3335 18.3455C65.7224 16.9011 64.1668 15.6511 62.6668 14.5955C61.1668 13.54 59.6113 12.6233 58.0001 11.8455Z\"\n fill=\"white\"\n />\n </svg>\n </section>\n</div>\n\n", styles: [".ringing-phone-animation-wrapper{display:flex;justify-content:center;align-items:center}.ringing-phone-animation-wrapper .ringing-phone-animation-container{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect{display:flex;gap:15px;opacity:1;animation:blink-wrapper 1.4s infinite;animation-delay:.8s}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .ringing-line{width:6px;height:16px;background-color:#fff;opacity:0}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .first-line{animation:blink-line 1.4s infinite;animation-delay:.1s;transform:rotate(-45deg)}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .second-line{animation:blink-line 1.4s infinite;animation-delay:.3s;transform:translateY(-50%)}.ringing-phone-animation-wrapper .ringing-phone-animation-container .ringing-effect .third-line{animation:blink-line 1.4s infinite;animation-delay:.6s;transform:rotate(45deg)}.ringing-phone-animation-wrapper .ringing-phone-animation-container .answer-btn{margin-top:20px;padding:10px 20px;background-color:#fff;border:none;border-radius:20px;cursor:pointer;font-size:16px}@keyframes blink-line{0%,49%{opacity:0}50%,to{opacity:1}}@keyframes blink-wrapper{0%,49%{opacity:1}50%,to{opacity:0}}\n"] }]
|
|
159
|
+
}], propDecorators: { isRinging: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}] } });
|
|
162
|
+
|
|
163
|
+
// Re-export shared services
|
|
164
|
+
|
|
165
|
+
class ReviewInstructionsDialogComponent {
|
|
166
|
+
dialogData;
|
|
167
|
+
translationScope;
|
|
168
|
+
dialogRef;
|
|
169
|
+
translations = {};
|
|
170
|
+
translocoService = inject(TranslocoService);
|
|
171
|
+
cdr = inject(ChangeDetectorRef);
|
|
172
|
+
constructor(dialogData, translationScope, dialogRef) {
|
|
173
|
+
this.dialogData = dialogData;
|
|
174
|
+
this.translationScope = translationScope;
|
|
175
|
+
this.dialogRef = dialogRef;
|
|
176
|
+
}
|
|
177
|
+
ngOnInit() {
|
|
178
|
+
void this.setTranslations();
|
|
179
|
+
}
|
|
180
|
+
closeDialog() {
|
|
181
|
+
this.dialogRef.close(false);
|
|
182
|
+
}
|
|
183
|
+
async setTranslations() {
|
|
184
|
+
this.translations = await firstValueFrom(this.translocoService.selectTranslateObject(`INSTRUCTIONS_MODAL`, {}, this.translationScope));
|
|
185
|
+
this.cdr.markForCheck();
|
|
186
|
+
}
|
|
187
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ReviewInstructionsDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: TRANSLOCO_SCOPE }, { token: i1$1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
188
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: ReviewInstructionsDialogComponent, isStandalone: true, selector: "tgo-review-instructions-dialog", providers: [
|
|
189
|
+
TranslocoLazyModuleUtils.getScopeProvider('tgo-immersive-test-review-instructions', getAvailableLangs(), 'INSTRUCTIONS_MODAL', (lang) => {
|
|
190
|
+
// Fetch from app assets; demo app copies the library assets to
|
|
191
|
+
// /assets/tgo-immersive-test via project.json.
|
|
192
|
+
const url = new URL(`assets/tgo-immersive-test/i18n/${lang}.json`, document.baseURI).href;
|
|
193
|
+
return fetch(url).then((res) => res.json());
|
|
194
|
+
}),
|
|
195
|
+
], ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <ui-dialog\n class=\"dialog-wrapper\"\n [title]=\"translations['TITLE']\"\n [secondaryButtonLabel]=\"translations['CLOSE']\"\n (secondaryButtonClickEvent)=\"closeDialog()\"\n >\n <section class=\"containers-section\">\n <div class=\"immersive-test-instructions-container\">\n <div\n class=\"background-information-container\"\n *ngIf=\"dialogData?.backgroundInfoData\"\n >\n <ui-card class=\"background-information-card\" variant=\"neutral\">\n <quill-view\n theme=\"snow\"\n [content]=\"dialogData?.backgroundInfoData\"\n class=\"content-container notranslate\"\n ></quill-view>\n </ui-card>\n </div>\n\n <div\n class=\"inner-instructions-container\"\n *ngIf=\"dialogData?.instructionsInfoData\"\n >\n <ui-card class=\"instructions-card\" variant=\"educative\">\n <quill-view\n theme=\"snow\"\n [content]=\"dialogData?.instructionsInfoData\"\n class=\"content-container notranslate\"\n ></quill-view>\n </ui-card>\n </div>\n </div>\n </section>\n </ui-dialog>\n</ng-container>\n\n", styles: ["@charset \"UTF-8\";:host .dialog-wrapper{width:100%}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section{width:100%;display:flex;flex-direction:column;justify-content:center;padding:.3rem .8rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container{display:flex;justify-content:space-between;width:100%;gap:2.5rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container{display:flex;flex-direction:column;width:100%;max-width:450px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor{padding:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h1,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h2,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h3,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h4,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h5,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h6{font-size:16px;font-weight:700;line-height:20px;margin-bottom:.6rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor p,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor span{font-size:14px;margin-bottom:1.5rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor p:last-child,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor span:last-child{margin-bottom:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor br{display:none}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container{display:flex;flex-direction:column;gap:2.5rem;width:100%;max-width:450px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container{border-width:1px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor{padding:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h1,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h2,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h3,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h4,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h5,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h6{font-size:16px;font-weight:700;line-height:20px;margin-bottom:.6rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor p:before,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor span:before{content:\"\\2022 \";color:#000;font-size:1em;position:absolute;left:8px;top:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor p,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor span{position:relative;font-size:14px;padding-left:22px;margin:3px 0 0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol{padding-left:10px;margin:5px 0 0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul li,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol li{font-size:14px;padding-left:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul li span:before,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol li span:before{top:-3px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul li span,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol li span{padding-left:12px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor br{display:none}@media (max-width: 799px){:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section{padding-top:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container{flex-wrap:wrap}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container{max-width:none}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container{max-width:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i3.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: DialogComponentModule }, { kind: "component", type: i4.DialogComponent, selector: "ui-dialog", inputs: ["title", "showCloseButton", "canCloseFn", "secondaryButtonLabel", "footerMessage", "primaryButtonLabel", "primaryButtonIconName", "secondaryButtonType", "primaryButtonType", "primaryButtonDataTestId", "secondaryButtonDataTestId", "companyColor", "applicationTheme", "disablePrimaryButton", "disableClose", "shouldDisableButtons", "ariaLabelledby", "ariaDescribedby", "keyboardOpen", "primaryButtonIconPosition"], outputs: ["closeEvent", "secondaryButtonClickEvent", "primaryButtonClickEvent"] }, { kind: "ngmodule", type: CardComponentModule }, { kind: "component", type: i5.CardComponent, selector: "ui-card", inputs: ["size", "variant", "applicationTheme", "errors", "errorsSize", "selected", "allowSelect", "allowFocus"], outputs: ["cardSelected"] }, { kind: "component", type: QuillViewComponent, selector: "quill-view", inputs: ["format", "theme", "modules", "debug", "formats", "sanitize", "beforeRender", "strict", "content", "customModules", "customOptions"], outputs: ["onEditorCreated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
196
|
+
}
|
|
197
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ReviewInstructionsDialogComponent, decorators: [{
|
|
198
|
+
type: Component,
|
|
199
|
+
args: [{ selector: 'tgo-review-instructions-dialog', providers: [
|
|
200
|
+
TranslocoLazyModuleUtils.getScopeProvider('tgo-immersive-test-review-instructions', getAvailableLangs(), 'INSTRUCTIONS_MODAL', (lang) => {
|
|
201
|
+
// Fetch from app assets; demo app copies the library assets to
|
|
202
|
+
// /assets/tgo-immersive-test via project.json.
|
|
203
|
+
const url = new URL(`assets/tgo-immersive-test/i18n/${lang}.json`, document.baseURI).href;
|
|
204
|
+
return fetch(url).then((res) => res.json());
|
|
205
|
+
}),
|
|
206
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
207
|
+
CommonModule,
|
|
208
|
+
TranslocoModule,
|
|
209
|
+
DialogComponentModule,
|
|
210
|
+
CardComponentModule,
|
|
211
|
+
QuillViewComponent,
|
|
212
|
+
], template: "<ng-container *transloco=\"let t\">\n <ui-dialog\n class=\"dialog-wrapper\"\n [title]=\"translations['TITLE']\"\n [secondaryButtonLabel]=\"translations['CLOSE']\"\n (secondaryButtonClickEvent)=\"closeDialog()\"\n >\n <section class=\"containers-section\">\n <div class=\"immersive-test-instructions-container\">\n <div\n class=\"background-information-container\"\n *ngIf=\"dialogData?.backgroundInfoData\"\n >\n <ui-card class=\"background-information-card\" variant=\"neutral\">\n <quill-view\n theme=\"snow\"\n [content]=\"dialogData?.backgroundInfoData\"\n class=\"content-container notranslate\"\n ></quill-view>\n </ui-card>\n </div>\n\n <div\n class=\"inner-instructions-container\"\n *ngIf=\"dialogData?.instructionsInfoData\"\n >\n <ui-card class=\"instructions-card\" variant=\"educative\">\n <quill-view\n theme=\"snow\"\n [content]=\"dialogData?.instructionsInfoData\"\n class=\"content-container notranslate\"\n ></quill-view>\n </ui-card>\n </div>\n </div>\n </section>\n </ui-dialog>\n</ng-container>\n\n", styles: ["@charset \"UTF-8\";:host .dialog-wrapper{width:100%}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section{width:100%;display:flex;flex-direction:column;justify-content:center;padding:.3rem .8rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container{display:flex;justify-content:space-between;width:100%;gap:2.5rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container{display:flex;flex-direction:column;width:100%;max-width:450px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor{padding:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h1,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h2,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h3,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h4,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h5,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor h6{font-size:16px;font-weight:700;line-height:20px;margin-bottom:.6rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor p,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor span{font-size:14px;margin-bottom:1.5rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor p:last-child,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor span:last-child{margin-bottom:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container .background-information-card .content-container .ql-container .ql-editor br{display:none}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container{display:flex;flex-direction:column;gap:2.5rem;width:100%;max-width:450px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container{border-width:1px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor{padding:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h1,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h2,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h3,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h4,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h5,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor h6{font-size:16px;font-weight:700;line-height:20px;margin-bottom:.6rem}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor p:before,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor span:before{content:\"\\2022 \";color:#000;font-size:1em;position:absolute;left:8px;top:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor p,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor span{position:relative;font-size:14px;padding-left:22px;margin:3px 0 0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol{padding-left:10px;margin:5px 0 0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul li,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol li{font-size:14px;padding-left:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul li span:before,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol li span:before{top:-3px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ul li span,:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor ol li span{padding-left:12px}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container .instructions-card .card-container .ql-container .ql-editor br{display:none}@media (max-width: 799px){:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section{padding-top:0}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container{flex-wrap:wrap}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .background-information-container{max-width:none}:host .dialog-wrapper ::ng-deep .mat-mdc-dialog-content .containers-section .immersive-test-instructions-container .inner-instructions-container{max-width:none}}\n"] }]
|
|
213
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
214
|
+
type: Inject,
|
|
215
|
+
args: [MAT_DIALOG_DATA]
|
|
216
|
+
}] }, { type: undefined, decorators: [{
|
|
217
|
+
type: Inject,
|
|
218
|
+
args: [TRANSLOCO_SCOPE]
|
|
219
|
+
}] }, { type: i1$1.MatDialogRef }] });
|
|
220
|
+
|
|
221
|
+
// Re-export from shared
|
|
222
|
+
|
|
223
|
+
class ImmersiveTestComponent {
|
|
224
|
+
translationScope;
|
|
225
|
+
videoElement;
|
|
226
|
+
audioElement;
|
|
227
|
+
question;
|
|
228
|
+
test;
|
|
229
|
+
isFirstQuestion;
|
|
230
|
+
expirationObservable;
|
|
231
|
+
selectedMediaDevices;
|
|
232
|
+
mediaAccessChanged;
|
|
233
|
+
submissionStateChanged = new EventEmitter();
|
|
234
|
+
loadingStateChanged = new EventEmitter();
|
|
235
|
+
requestMediaAccess = new EventEmitter();
|
|
236
|
+
isAnswering = signal(false);
|
|
237
|
+
isCountingDown = signal(false);
|
|
238
|
+
isVideoPlaying = signal(false);
|
|
239
|
+
isQuestionPlaying = signal(false);
|
|
240
|
+
candidateVideoStreamReady = signal(false);
|
|
241
|
+
translations = {};
|
|
242
|
+
volume = signal(0);
|
|
243
|
+
audioUrl = signal('');
|
|
244
|
+
unsubscribe$ = new Subject();
|
|
245
|
+
mediaService = inject(MediaService);
|
|
246
|
+
translocoService = inject(TranslocoService);
|
|
247
|
+
dialog = inject(DialogService);
|
|
248
|
+
cdr = inject(ChangeDetectorRef);
|
|
249
|
+
themeService = inject(ThemeService);
|
|
250
|
+
companyColor = this.themeService.getCompanyColor();
|
|
251
|
+
get fileUrl() {
|
|
252
|
+
const match = this.question?.text.match(/(src|href)="([^"]*)"/);
|
|
253
|
+
return (match && match.pop()) || '';
|
|
254
|
+
}
|
|
255
|
+
get isVideo() {
|
|
256
|
+
return this.fileUrl.includes('player.vimeo.com');
|
|
257
|
+
}
|
|
258
|
+
constructor(translationScope) {
|
|
259
|
+
this.translationScope = translationScope;
|
|
260
|
+
}
|
|
261
|
+
ngOnInit() {
|
|
262
|
+
this.initExpirationSubscription();
|
|
263
|
+
this.initMediaAccessSubscription();
|
|
264
|
+
this.loadingStateChanged.emit(false);
|
|
265
|
+
this.mediaService.setSelectedMediaDevices(this.selectedMediaDevices);
|
|
266
|
+
void this.setTranslations();
|
|
267
|
+
void this.initVideoStream();
|
|
268
|
+
if (!this.isFirstQuestion) {
|
|
269
|
+
void this.startQuestion();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
ngOnDestroy() {
|
|
273
|
+
this.unsubscribe$.next();
|
|
274
|
+
this.unsubscribe$.complete();
|
|
275
|
+
}
|
|
276
|
+
stopRecording() {
|
|
277
|
+
this.mediaService.stopRecording();
|
|
278
|
+
}
|
|
279
|
+
onVideoLoad() {
|
|
280
|
+
this.candidateVideoStreamReady.set(true);
|
|
281
|
+
}
|
|
282
|
+
async startQuestion() {
|
|
283
|
+
this.isQuestionPlaying.set(true);
|
|
284
|
+
if (!this.isVideo) {
|
|
285
|
+
await this.mediaService.playAudio(this.fileUrl);
|
|
286
|
+
this.startCountdown();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async startCountdown() {
|
|
290
|
+
if (!(await this.mediaService.checkPermission({ audio: true, video: false }))) {
|
|
291
|
+
this.requestMediaAccess.emit();
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
this.isCountingDown.set(true);
|
|
295
|
+
this.isVideoPlaying.set(false);
|
|
296
|
+
}
|
|
297
|
+
startRecordAnswer() {
|
|
298
|
+
this.isCountingDown.set(false);
|
|
299
|
+
this.isAnswering.set(true);
|
|
300
|
+
this.mediaService
|
|
301
|
+
.recordAudio()
|
|
302
|
+
.pipe(takeUntil(this.unsubscribe$), catchError(error => {
|
|
303
|
+
console.error('Error recording answer', error);
|
|
304
|
+
this.isAnswering.set(false);
|
|
305
|
+
this.startCountdown();
|
|
306
|
+
throw error;
|
|
307
|
+
}))
|
|
308
|
+
.subscribe(event => {
|
|
309
|
+
if (event.type === 'complete') {
|
|
310
|
+
if (!this.test.is_preview_mode) {
|
|
311
|
+
this.submissionStateChanged.emit({ file: event.file, text: '' });
|
|
312
|
+
this.isAnswering.set(false);
|
|
313
|
+
this.loadingStateChanged.emit(true);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
const url = window.URL.createObjectURL(event.file);
|
|
317
|
+
this.audioUrl.set(url);
|
|
318
|
+
if (this.audioElement) {
|
|
319
|
+
this.audioElement.nativeElement.src = url;
|
|
320
|
+
this.audioElement.nativeElement.play();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
this.volume.set(event.value);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
openReviewInstructionsDialog() {
|
|
330
|
+
const dialogData = {
|
|
331
|
+
backgroundInfoData: this.test.intro_text,
|
|
332
|
+
instructionsInfoData: this.test.test_instruction,
|
|
333
|
+
};
|
|
334
|
+
this.dialog.open(ReviewInstructionsDialogComponent, {
|
|
335
|
+
size: 'large',
|
|
336
|
+
extraData: dialogData,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
async initVideoStream() {
|
|
340
|
+
try {
|
|
341
|
+
const stream = await this.mediaService.getMediaStream({
|
|
342
|
+
video: true,
|
|
343
|
+
audio: false,
|
|
344
|
+
});
|
|
345
|
+
if (this.videoElement) {
|
|
346
|
+
this.videoElement.nativeElement.srcObject = stream;
|
|
347
|
+
await this.videoElement?.nativeElement.play();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
console.error('Error initializing video stream:', error);
|
|
352
|
+
this.candidateVideoStreamReady.set(false);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async setTranslations() {
|
|
356
|
+
this.translations = await firstValueFrom(this.translocoService.selectTranslateObject(`TEST`, {}, this.translationScope));
|
|
357
|
+
this.cdr.markForCheck();
|
|
358
|
+
}
|
|
359
|
+
initExpirationSubscription() {
|
|
360
|
+
this.expirationObservable?.pipe(takeUntil(this.unsubscribe$)).subscribe(() => {
|
|
361
|
+
if (!this.test?.is_preview_mode) {
|
|
362
|
+
if (this.mediaService.isRecording()) {
|
|
363
|
+
this.stopRecording();
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
this.submissionStateChanged.emit({ file: undefined, text: '' });
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
initMediaAccessSubscription() {
|
|
372
|
+
this.mediaAccessChanged?.pipe(takeUntil(this.unsubscribe$)).subscribe(selectedMediaDevices => {
|
|
373
|
+
this.mediaService.setSelectedMediaDevices(selectedMediaDevices);
|
|
374
|
+
if (!this.isCountingDown()) {
|
|
375
|
+
void this.startCountdown();
|
|
376
|
+
}
|
|
377
|
+
void this.initVideoStream();
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ImmersiveTestComponent, deps: [{ token: TRANSLOCO_SCOPE }], target: i0.ɵɵFactoryTarget.Component });
|
|
381
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: ImmersiveTestComponent, isStandalone: true, selector: "tgo-immersive-test", inputs: { question: "question", test: "test", isFirstQuestion: "isFirstQuestion", expirationObservable: "expirationObservable", selectedMediaDevices: "selectedMediaDevices", mediaAccessChanged: "mediaAccessChanged" }, outputs: { submissionStateChanged: "submissionStateChanged", loadingStateChanged: "loadingStateChanged", requestMediaAccess: "requestMediaAccess" }, providers: [
|
|
382
|
+
TranslocoLazyModuleUtils.getScopeProvider('tgo-immersive-test', getAvailableLangs(), ROOT_TRANSLATIONS_SCOPE, (lang) => {
|
|
383
|
+
// Fetch from app assets; demo app copies the library assets to
|
|
384
|
+
// /assets/tgo-immersive-test via project.json.
|
|
385
|
+
const url = new URL(`assets/tgo-immersive-test/i18n/${lang}.json`, document.baseURI).href;
|
|
386
|
+
return fetch(url).then(res => res.json());
|
|
387
|
+
}),
|
|
388
|
+
DialogService,
|
|
389
|
+
ThemeService,
|
|
390
|
+
], viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["video"], descendants: true }, { propertyName: "audioElement", first: true, predicate: ["audio"], descendants: true }], ngImport: i0, template: "<div class=\"immersive-test\">\n <div class=\"test-container\">\n <div\n class=\"media-container\"\n [class.is-video-visible]=\"isQuestionPlaying() && !isAnswering()\"\n [class.is-playing]=\"isVideoPlaying()\"\n [class.is-answering]=\"isAnswering()\"\n >\n <div class=\"candidate-no-camera\" *ngIf=\"!candidateVideoStreamReady()\">\n <h3> </h3>\n <tgo-audio-animation\n *ngIf=\"isAnswering()\"\n [volume]=\"volume()\"\n [fakeData]=\"false\"\n ></tgo-audio-animation>\n <ui-icon name=\"User-profile-in-line\" color=\"white\" size=\"24\"></ui-icon>\n <h3 class=\"bold\">{{ translations['YOU'] }}</h3>\n </div>\n <div class=\"candidate-camera\" [hidden]=\"!candidateVideoStreamReady()\">\n <tgo-audio-animation\n *ngIf=\"isAnswering() && candidateVideoStreamReady()\"\n [volume]=\"volume()\"\n [fakeData]=\"false\"\n ></tgo-audio-animation>\n <video height #video id=\"video\" playsinline (loadedmetadata)=\"onVideoLoad()\"></video>\n <h3 class=\"bold\" *ngIf=\"candidateVideoStreamReady()\">\n {{ translations['YOU'] }}\n </h3>\n </div>\n <tgo-audio-animation *ngIf=\"isVideoPlaying()\" [fakeData]=\"true\"></tgo-audio-animation>\n <tgo-vimeo-video\n *ngIf=\"isVideo\"\n [isPlaying]=\"isQuestionPlaying()\"\n [videoUrl]=\"fileUrl\"\n (videoEnded)=\"startCountdown()\"\n (videoStarted)=\"isVideoPlaying.set(true)\"\n ></tgo-vimeo-video>\n <div class=\"audio-info\" *ngIf=\"isQuestionPlaying() && !isVideo\">\n <ui-icon name=\"User-profile-filled\" color=\"white\" size=\"80\"></ui-icon>\n </div>\n <div class=\"start\" *ngIf=\"isFirstQuestion && !isQuestionPlaying()\">\n <tgo-ringing-phone-animation [isRinging]=\"true\"></tgo-ringing-phone-animation>\n <ui-button\n [label]=\"translations['ANSWER']\"\n [class.white-btn]=\"test.is_preview_mode\"\n variant=\"primary\"\n [companyColor]=\"companyColor\"\n (click)=\"startQuestion()\"\n data-testid=\"immersive-test.start-question-btn\"\n ></ui-button>\n </div>\n <div class=\"overlay\" *ngIf=\"isAnswering() || isCountingDown()\" [@fadeInFadeOut]>\n <div class=\"answer\" *ngIf=\"!audioUrl() && isAnswering()\">\n <div>\n <h3 class=\"uppercase recording-started\">\n <span class=\"recording-dot\"></span>{{ translations['RECORDING_STARTED'] }}\n </h3>\n <h1 class=\"bold\">\n {{ translations['ANSWER_THE_QUESTION'] }}\n </h1>\n </div>\n <ui-button\n [label]=\"translations['ANSWER_COMPLETED']\"\n [class.white-btn]=\"test.is_preview_mode\"\n variant=\"primary\"\n [companyColor]=\"companyColor\"\n (click)=\"stopRecording()\"\n data-testid=\"immersive-test.stop-recording-btn\"\n ></ui-button>\n </div>\n <div class=\"answer\" *ngIf=\"isCountingDown()\">\n <div>\n <h1 class=\"bold\">\n {{ translations['GET_READY'] }}\n </h1>\n </div>\n <tgo-video-countdown (finished)=\"startRecordAnswer()\"></tgo-video-countdown>\n <div> </div>\n </div>\n <div class=\"preview\" [class.hidden]=\"!audioUrl()\" *ngIf=\"test.is_preview_mode\">\n <h4>{{ translations['AUDIO_READY'] }}</h4>\n <p>{{ translations['AUDIO_PREVIEW'] }}</p>\n <audio #audio controls></audio>\n </div>\n </div>\n </div>\n <div class=\"media-info\">\n <h3 class=\"bold\">{{ translations['CUSTOMER'] }}</h3>\n <ui-button\n [hidden]=\"!test.test_instruction && !test.intro_text\"\n class=\"review-button\"\n [label]=\"translations['REVIEW_INSTRUCTIONS']\"\n variant=\"secondary\"\n size=\"small\"\n (click)=\"openReviewInstructionsDialog()\"\n data-testid=\"immersive-test.review-instructions-btn\"\n ></ui-button>\n </div>\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.immersive-test{padding:0 64px;margin-top:40px}.immersive-test .media-info{width:100%;display:flex;justify-content:space-between;align-items:center;background:#242424a8;background-color:#242424;border-bottom-left-radius:10px;border-bottom-right-radius:10px;padding:13px 32px;color:#fff}.immersive-test .media-info ::ng-deep ui-button button{border-color:#fff;color:#fff}.immersive-test .test-container{min-width:360px;max-width:1312px;min-height:725px;height:min(725px,100%,max(100vw - 200px,100vh - 200px,200px));border-radius:10px;display:flex;flex-direction:column;justify-content:space-between;position:relative;background-color:#242424}.immersive-test .media-container{position:relative;color:#fff;flex-grow:1;border-top-left-radius:10px;border-top-right-radius:10px;aspect-ratio:16/9}.immersive-test .media-container .candidate-no-camera{position:absolute;width:200px;aspect-ratio:16/9;z-index:3;top:32px;left:32px;border-radius:10px;background-color:#1a47aa;display:flex;justify-content:space-between;flex-direction:column;padding:16px}.immersive-test .media-container .candidate-no-camera ui-icon{margin:auto}.immersive-test .media-container .candidate-camera{position:absolute;width:200px;top:32px;left:32px;z-index:3}.immersive-test .media-container .candidate-camera video{width:200px;border-radius:10px}.immersive-test .media-container .candidate-camera h3{position:absolute;bottom:16px;left:16px}.immersive-test .media-container tgo-audio-animation{position:absolute;top:32px;right:32px;z-index:1}.immersive-test .media-container tgo-vimeo-video{display:none;position:absolute;height:100%;width:100%}.immersive-test .media-container.is-video-visible tgo-vimeo-video{display:block}.immersive-test .media-container.is-playing{border:4px solid #0165FC;border-bottom-width:3px}.immersive-test .media-container.is-answering .candidate-camera tgo-audio-animation,.immersive-test .media-container.is-answering .candidate-no-camera tgo-audio-animation{position:absolute;top:16px;right:16px}.immersive-test .media-container.is-answering .candidate-camera video,.immersive-test .media-container.is-answering .candidate-no-camera{border:3px solid #0165FC;border-radius:10px}.immersive-test .media-container.is-answering tgo-vimeo-video{display:block}.immersive-test .media-container .start,.immersive-test .media-container .audio-info,.immersive-test .media-container .overlay,.immersive-test .media-container .answer{display:flex;justify-content:center;align-items:center;flex-direction:column;gap:40px;height:100%}.immersive-test .media-container .preview{height:100%;display:flex;align-items:center;flex-direction:column;justify-content:flex-end;padding:24px}.immersive-test .media-container .preview p{color:#d3d3d3;margin:8px 0}.immersive-test .media-container .preview audio{margin:16px 0}.immersive-test .media-container .preview.hidden{display:none}.immersive-test h3,.immersive-test h4{color:#fff}.immersive-test .bold{font-weight:700}.immersive-test ui-button.review-button ::ng-deep button{border:1px solid #ffffff}.immersive-test ui-button.white-btn ::ng-deep button{background-color:#fff;border-color:#fff;color:#000}.immersive-test ui-button.white-btn ::ng-deep button:hover{background-color:#666!important}.immersive-test .overlay{top:0;position:absolute;width:100%;height:100%;background-color:#242424e0;z-index:2;border-radius:10px}.immersive-test .overlay h1,.immersive-test .overlay h3{color:#fff;text-align:center}.immersive-test .overlay h3{margin-bottom:10px}.immersive-test tgo-radial-progress{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.immersive-test .uppercase{text-transform:uppercase}.immersive-test .recording-started{display:flex;align-items:center;justify-content:center;gap:10px}.immersive-test .recording-dot{background-color:#ff3003;display:inline-block;width:20px;height:20px;border-radius:50%}@media screen and (max-width: 600px){.immersive-test{padding:0 24px;margin-top:16px}}\n"], dependencies: [{ kind: "ngmodule", type: TranslocoModule }, { kind: "ngmodule", type: ButtonComponentModule }, { kind: "component", type: i1$2.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "ngmodule", type: IconComponentModule }, { kind: "component", type: i2.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "toggleIconStyle", "applicationTheme", "useFullIconName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: VimeoVideoComponent, selector: "tgo-vimeo-video", inputs: ["videoUrl", "isPlaying", "options"], outputs: ["videoEnded", "videoStarted"] }, { kind: "component", type: VideoCountdownComponent, selector: "tgo-video-countdown", inputs: ["startFrom", "endAt", "interval"], outputs: ["finished"] }, { kind: "component", type: RingingPhoneAnimationComponent, selector: "tgo-ringing-phone-animation", inputs: ["isRinging"] }, { kind: "component", type: AudioAnimationComponent, selector: "tgo-audio-animation", inputs: ["volume", "fakeData"] }], animations: [
|
|
391
|
+
trigger('fadeInFadeOut', [
|
|
392
|
+
transition(':enter', [style({ opacity: 0 }), animate('600ms', style({ opacity: 1 }))]),
|
|
393
|
+
transition(':leave', [animate('600ms', style({ opacity: 0 }))]),
|
|
394
|
+
]),
|
|
395
|
+
] });
|
|
396
|
+
}
|
|
397
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: ImmersiveTestComponent, decorators: [{
|
|
398
|
+
type: Component,
|
|
399
|
+
args: [{ selector: 'tgo-immersive-test', animations: [
|
|
400
|
+
trigger('fadeInFadeOut', [
|
|
401
|
+
transition(':enter', [style({ opacity: 0 }), animate('600ms', style({ opacity: 1 }))]),
|
|
402
|
+
transition(':leave', [animate('600ms', style({ opacity: 0 }))]),
|
|
403
|
+
]),
|
|
404
|
+
], imports: [
|
|
405
|
+
TranslocoModule,
|
|
406
|
+
ButtonComponentModule,
|
|
407
|
+
IconComponentModule,
|
|
408
|
+
CommonModule,
|
|
409
|
+
VimeoVideoComponent,
|
|
410
|
+
VideoCountdownComponent,
|
|
411
|
+
RingingPhoneAnimationComponent,
|
|
412
|
+
AudioAnimationComponent,
|
|
413
|
+
ReviewInstructionsDialogComponent,
|
|
414
|
+
], providers: [
|
|
415
|
+
TranslocoLazyModuleUtils.getScopeProvider('tgo-immersive-test', getAvailableLangs(), ROOT_TRANSLATIONS_SCOPE, (lang) => {
|
|
416
|
+
// Fetch from app assets; demo app copies the library assets to
|
|
417
|
+
// /assets/tgo-immersive-test via project.json.
|
|
418
|
+
const url = new URL(`assets/tgo-immersive-test/i18n/${lang}.json`, document.baseURI).href;
|
|
419
|
+
return fetch(url).then(res => res.json());
|
|
420
|
+
}),
|
|
421
|
+
DialogService,
|
|
422
|
+
ThemeService,
|
|
423
|
+
], template: "<div class=\"immersive-test\">\n <div class=\"test-container\">\n <div\n class=\"media-container\"\n [class.is-video-visible]=\"isQuestionPlaying() && !isAnswering()\"\n [class.is-playing]=\"isVideoPlaying()\"\n [class.is-answering]=\"isAnswering()\"\n >\n <div class=\"candidate-no-camera\" *ngIf=\"!candidateVideoStreamReady()\">\n <h3> </h3>\n <tgo-audio-animation\n *ngIf=\"isAnswering()\"\n [volume]=\"volume()\"\n [fakeData]=\"false\"\n ></tgo-audio-animation>\n <ui-icon name=\"User-profile-in-line\" color=\"white\" size=\"24\"></ui-icon>\n <h3 class=\"bold\">{{ translations['YOU'] }}</h3>\n </div>\n <div class=\"candidate-camera\" [hidden]=\"!candidateVideoStreamReady()\">\n <tgo-audio-animation\n *ngIf=\"isAnswering() && candidateVideoStreamReady()\"\n [volume]=\"volume()\"\n [fakeData]=\"false\"\n ></tgo-audio-animation>\n <video height #video id=\"video\" playsinline (loadedmetadata)=\"onVideoLoad()\"></video>\n <h3 class=\"bold\" *ngIf=\"candidateVideoStreamReady()\">\n {{ translations['YOU'] }}\n </h3>\n </div>\n <tgo-audio-animation *ngIf=\"isVideoPlaying()\" [fakeData]=\"true\"></tgo-audio-animation>\n <tgo-vimeo-video\n *ngIf=\"isVideo\"\n [isPlaying]=\"isQuestionPlaying()\"\n [videoUrl]=\"fileUrl\"\n (videoEnded)=\"startCountdown()\"\n (videoStarted)=\"isVideoPlaying.set(true)\"\n ></tgo-vimeo-video>\n <div class=\"audio-info\" *ngIf=\"isQuestionPlaying() && !isVideo\">\n <ui-icon name=\"User-profile-filled\" color=\"white\" size=\"80\"></ui-icon>\n </div>\n <div class=\"start\" *ngIf=\"isFirstQuestion && !isQuestionPlaying()\">\n <tgo-ringing-phone-animation [isRinging]=\"true\"></tgo-ringing-phone-animation>\n <ui-button\n [label]=\"translations['ANSWER']\"\n [class.white-btn]=\"test.is_preview_mode\"\n variant=\"primary\"\n [companyColor]=\"companyColor\"\n (click)=\"startQuestion()\"\n data-testid=\"immersive-test.start-question-btn\"\n ></ui-button>\n </div>\n <div class=\"overlay\" *ngIf=\"isAnswering() || isCountingDown()\" [@fadeInFadeOut]>\n <div class=\"answer\" *ngIf=\"!audioUrl() && isAnswering()\">\n <div>\n <h3 class=\"uppercase recording-started\">\n <span class=\"recording-dot\"></span>{{ translations['RECORDING_STARTED'] }}\n </h3>\n <h1 class=\"bold\">\n {{ translations['ANSWER_THE_QUESTION'] }}\n </h1>\n </div>\n <ui-button\n [label]=\"translations['ANSWER_COMPLETED']\"\n [class.white-btn]=\"test.is_preview_mode\"\n variant=\"primary\"\n [companyColor]=\"companyColor\"\n (click)=\"stopRecording()\"\n data-testid=\"immersive-test.stop-recording-btn\"\n ></ui-button>\n </div>\n <div class=\"answer\" *ngIf=\"isCountingDown()\">\n <div>\n <h1 class=\"bold\">\n {{ translations['GET_READY'] }}\n </h1>\n </div>\n <tgo-video-countdown (finished)=\"startRecordAnswer()\"></tgo-video-countdown>\n <div> </div>\n </div>\n <div class=\"preview\" [class.hidden]=\"!audioUrl()\" *ngIf=\"test.is_preview_mode\">\n <h4>{{ translations['AUDIO_READY'] }}</h4>\n <p>{{ translations['AUDIO_PREVIEW'] }}</p>\n <audio #audio controls></audio>\n </div>\n </div>\n </div>\n <div class=\"media-info\">\n <h3 class=\"bold\">{{ translations['CUSTOMER'] }}</h3>\n <ui-button\n [hidden]=\"!test.test_instruction && !test.intro_text\"\n class=\"review-button\"\n [label]=\"translations['REVIEW_INSTRUCTIONS']\"\n variant=\"secondary\"\n size=\"small\"\n (click)=\"openReviewInstructionsDialog()\"\n data-testid=\"immersive-test.review-instructions-btn\"\n ></ui-button>\n </div>\n </div>\n</div>\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.immersive-test{padding:0 64px;margin-top:40px}.immersive-test .media-info{width:100%;display:flex;justify-content:space-between;align-items:center;background:#242424a8;background-color:#242424;border-bottom-left-radius:10px;border-bottom-right-radius:10px;padding:13px 32px;color:#fff}.immersive-test .media-info ::ng-deep ui-button button{border-color:#fff;color:#fff}.immersive-test .test-container{min-width:360px;max-width:1312px;min-height:725px;height:min(725px,100%,max(100vw - 200px,100vh - 200px,200px));border-radius:10px;display:flex;flex-direction:column;justify-content:space-between;position:relative;background-color:#242424}.immersive-test .media-container{position:relative;color:#fff;flex-grow:1;border-top-left-radius:10px;border-top-right-radius:10px;aspect-ratio:16/9}.immersive-test .media-container .candidate-no-camera{position:absolute;width:200px;aspect-ratio:16/9;z-index:3;top:32px;left:32px;border-radius:10px;background-color:#1a47aa;display:flex;justify-content:space-between;flex-direction:column;padding:16px}.immersive-test .media-container .candidate-no-camera ui-icon{margin:auto}.immersive-test .media-container .candidate-camera{position:absolute;width:200px;top:32px;left:32px;z-index:3}.immersive-test .media-container .candidate-camera video{width:200px;border-radius:10px}.immersive-test .media-container .candidate-camera h3{position:absolute;bottom:16px;left:16px}.immersive-test .media-container tgo-audio-animation{position:absolute;top:32px;right:32px;z-index:1}.immersive-test .media-container tgo-vimeo-video{display:none;position:absolute;height:100%;width:100%}.immersive-test .media-container.is-video-visible tgo-vimeo-video{display:block}.immersive-test .media-container.is-playing{border:4px solid #0165FC;border-bottom-width:3px}.immersive-test .media-container.is-answering .candidate-camera tgo-audio-animation,.immersive-test .media-container.is-answering .candidate-no-camera tgo-audio-animation{position:absolute;top:16px;right:16px}.immersive-test .media-container.is-answering .candidate-camera video,.immersive-test .media-container.is-answering .candidate-no-camera{border:3px solid #0165FC;border-radius:10px}.immersive-test .media-container.is-answering tgo-vimeo-video{display:block}.immersive-test .media-container .start,.immersive-test .media-container .audio-info,.immersive-test .media-container .overlay,.immersive-test .media-container .answer{display:flex;justify-content:center;align-items:center;flex-direction:column;gap:40px;height:100%}.immersive-test .media-container .preview{height:100%;display:flex;align-items:center;flex-direction:column;justify-content:flex-end;padding:24px}.immersive-test .media-container .preview p{color:#d3d3d3;margin:8px 0}.immersive-test .media-container .preview audio{margin:16px 0}.immersive-test .media-container .preview.hidden{display:none}.immersive-test h3,.immersive-test h4{color:#fff}.immersive-test .bold{font-weight:700}.immersive-test ui-button.review-button ::ng-deep button{border:1px solid #ffffff}.immersive-test ui-button.white-btn ::ng-deep button{background-color:#fff;border-color:#fff;color:#000}.immersive-test ui-button.white-btn ::ng-deep button:hover{background-color:#666!important}.immersive-test .overlay{top:0;position:absolute;width:100%;height:100%;background-color:#242424e0;z-index:2;border-radius:10px}.immersive-test .overlay h1,.immersive-test .overlay h3{color:#fff;text-align:center}.immersive-test .overlay h3{margin-bottom:10px}.immersive-test tgo-radial-progress{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.immersive-test .uppercase{text-transform:uppercase}.immersive-test .recording-started{display:flex;align-items:center;justify-content:center;gap:10px}.immersive-test .recording-dot{background-color:#ff3003;display:inline-block;width:20px;height:20px;border-radius:50%}@media screen and (max-width: 600px){.immersive-test{padding:0 24px;margin-top:16px}}\n"] }]
|
|
424
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
425
|
+
type: Inject,
|
|
426
|
+
args: [TRANSLOCO_SCOPE]
|
|
427
|
+
}] }], propDecorators: { videoElement: [{
|
|
428
|
+
type: ViewChild,
|
|
429
|
+
args: ['video']
|
|
430
|
+
}], audioElement: [{
|
|
431
|
+
type: ViewChild,
|
|
432
|
+
args: ['audio']
|
|
433
|
+
}], question: [{
|
|
434
|
+
type: Input,
|
|
435
|
+
args: [{ required: true }]
|
|
436
|
+
}], test: [{
|
|
437
|
+
type: Input,
|
|
438
|
+
args: [{ required: true }]
|
|
439
|
+
}], isFirstQuestion: [{
|
|
440
|
+
type: Input
|
|
441
|
+
}], expirationObservable: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], selectedMediaDevices: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], mediaAccessChanged: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], submissionStateChanged: [{
|
|
448
|
+
type: Output
|
|
449
|
+
}], loadingStateChanged: [{
|
|
450
|
+
type: Output
|
|
451
|
+
}], requestMediaAccess: [{
|
|
452
|
+
type: Output
|
|
453
|
+
}] } });
|
|
454
|
+
|
|
455
|
+
// Library-specific components only (shared components are bundled from packages/shared)
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Generated bundle index. Do not edit.
|
|
459
|
+
*/
|
|
460
|
+
|
|
461
|
+
export { ImmersiveTestComponent, ReviewInstructionsDialogComponent, RingingPhoneAnimationComponent, VideoCountdownComponent };
|
|
462
|
+
//# sourceMappingURL=testgorilla-tgo-immersive-test.mjs.map
|