@testgorilla/tgo-coding-test 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/.eslintrc.json +45 -0
  2. package/README.md +257 -0
  3. package/jest.config.ts +21 -0
  4. package/ng-package.json +14 -0
  5. package/package.json +33 -0
  6. package/project.json +36 -0
  7. package/src/assets/i18n/en.json +124 -0
  8. package/src/index.ts +30 -0
  9. package/src/lib/components/.gitkeep +0 -0
  10. package/src/lib/components/code-editor/code-editor.component.html +10 -0
  11. package/src/lib/components/code-editor/code-editor.component.scss +21 -0
  12. package/src/lib/components/code-editor/code-editor.component.spec.ts +136 -0
  13. package/src/lib/components/code-editor/code-editor.component.ts +369 -0
  14. package/src/lib/components/code-editor/code-editor.mocks.ts +28 -0
  15. package/src/lib/components/code-editor/code-editor.service.spec.ts +160 -0
  16. package/src/lib/components/code-editor/code-editor.service.ts +94 -0
  17. package/src/lib/components/code-editor/helpers/c-helper.spec.ts +39 -0
  18. package/src/lib/components/code-editor/helpers/c-helper.ts +51 -0
  19. package/src/lib/components/code-editor/helpers/code-editor-helper.base.spec.ts +30 -0
  20. package/src/lib/components/code-editor/helpers/code-editor-helper.base.ts +16 -0
  21. package/src/lib/components/code-editor/helpers/code-editor-helper.mocks.ts +24 -0
  22. package/src/lib/components/code-editor/helpers/code-editor-helper.model.ts +67 -0
  23. package/src/lib/components/code-editor/helpers/cpp-helper.spec.ts +40 -0
  24. package/src/lib/components/code-editor/helpers/cpp-helper.ts +52 -0
  25. package/src/lib/components/code-editor/helpers/csharp-helper.spec.ts +42 -0
  26. package/src/lib/components/code-editor/helpers/csharp-helper.ts +55 -0
  27. package/src/lib/components/code-editor/helpers/go-helper.spec.ts +41 -0
  28. package/src/lib/components/code-editor/helpers/go-helper.ts +54 -0
  29. package/src/lib/components/code-editor/helpers/index.ts +15 -0
  30. package/src/lib/components/code-editor/helpers/java-helper.spec.ts +41 -0
  31. package/src/lib/components/code-editor/helpers/java-helper.ts +54 -0
  32. package/src/lib/components/code-editor/helpers/javascript-helper.spec.ts +39 -0
  33. package/src/lib/components/code-editor/helpers/javascript-helper.ts +32 -0
  34. package/src/lib/components/code-editor/helpers/kotlin-helper.spec.ts +41 -0
  35. package/src/lib/components/code-editor/helpers/kotlin-helper.ts +54 -0
  36. package/src/lib/components/code-editor/helpers/php-helper.spec.ts +39 -0
  37. package/src/lib/components/code-editor/helpers/php-helper.ts +32 -0
  38. package/src/lib/components/code-editor/helpers/python-helper.spec.ts +39 -0
  39. package/src/lib/components/code-editor/helpers/python-helper.ts +32 -0
  40. package/src/lib/components/code-editor/helpers/r-helper.spec.ts +39 -0
  41. package/src/lib/components/code-editor/helpers/r-helper.ts +32 -0
  42. package/src/lib/components/code-editor/helpers/ruby-helper.spec.ts +39 -0
  43. package/src/lib/components/code-editor/helpers/ruby-helper.ts +32 -0
  44. package/src/lib/components/code-editor/helpers/scala-helper.spec.ts +41 -0
  45. package/src/lib/components/code-editor/helpers/scala-helper.ts +53 -0
  46. package/src/lib/components/code-editor/helpers/sql-helper.spec.ts +87 -0
  47. package/src/lib/components/code-editor/helpers/sql-helper.ts +44 -0
  48. package/src/lib/components/code-editor/helpers/swift-helper.spec.ts +40 -0
  49. package/src/lib/components/code-editor/helpers/swift-helper.ts +51 -0
  50. package/src/lib/components/code-editor/helpers/typescript-helper.spec.ts +40 -0
  51. package/src/lib/components/code-editor/helpers/typescript-helper.ts +52 -0
  52. package/src/lib/components/code-editor/models/code-editor.model.ts +9 -0
  53. package/src/lib/components/code-editor/models/coding-snapshot.model.ts +4 -0
  54. package/src/lib/components/coding-question/coding-question.component.html +78 -0
  55. package/src/lib/components/coding-question/coding-question.component.scss +76 -0
  56. package/src/lib/components/coding-question/coding-question.component.spec.ts +85 -0
  57. package/src/lib/components/coding-question/coding-question.component.ts +102 -0
  58. package/src/lib/components/coding-section/coding-section.component.html +82 -0
  59. package/src/lib/components/coding-section/coding-section.component.scss +64 -0
  60. package/src/lib/components/coding-section/coding-section.component.spec.ts +257 -0
  61. package/src/lib/components/coding-section/coding-section.component.ts +187 -0
  62. package/src/lib/components/coding-test.module.ts +124 -0
  63. package/src/lib/components/common/truncated-text/truncated-text.component.html +6 -0
  64. package/src/lib/components/common/truncated-text/truncated-text.component.scss +18 -0
  65. package/src/lib/components/common/truncated-text/truncated-text.component.spec.ts +84 -0
  66. package/src/lib/components/common/truncated-text/truncated-text.component.ts +37 -0
  67. package/src/lib/components/configurations/configurations.component.html +57 -0
  68. package/src/lib/components/configurations/configurations.component.scss +42 -0
  69. package/src/lib/components/configurations/configurations.component.spec.ts +186 -0
  70. package/src/lib/components/configurations/configurations.component.ts +98 -0
  71. package/src/lib/components/instructions/instructions.component.html +41 -0
  72. package/src/lib/components/instructions/instructions.component.scss +167 -0
  73. package/src/lib/components/instructions/instructions.component.spec.ts +106 -0
  74. package/src/lib/components/instructions/instructions.component.ts +138 -0
  75. package/src/lib/components/panel/panel.component.html +19 -0
  76. package/src/lib/components/panel/panel.component.scss +41 -0
  77. package/src/lib/components/panel/panel.component.spec.ts +40 -0
  78. package/src/lib/components/panel/panel.component.ts +34 -0
  79. package/src/lib/components/runnable-editor/runnable-editor.component.html +75 -0
  80. package/src/lib/components/runnable-editor/runnable-editor.component.scss +55 -0
  81. package/src/lib/components/runnable-editor/runnable-editor.component.spec.ts +124 -0
  82. package/src/lib/components/runnable-editor/runnable-editor.component.ts +155 -0
  83. package/src/lib/components/tests/test-cases/test-cases.component.html +135 -0
  84. package/src/lib/components/tests/test-cases/test-cases.component.scss +220 -0
  85. package/src/lib/components/tests/test-cases/test-cases.component.spec.ts +401 -0
  86. package/src/lib/components/tests/test-cases/test-cases.component.ts +205 -0
  87. package/src/lib/components/tests/test-cases-content/test-cases-content.component.html +94 -0
  88. package/src/lib/components/tests/test-cases-content/test-cases-content.component.scss +103 -0
  89. package/src/lib/components/tests/test-cases-content/test-cases-content.component.spec.ts +122 -0
  90. package/src/lib/components/tests/test-cases-content/test-cases-content.component.ts +102 -0
  91. package/src/lib/components/tests/test-cases-status/test-cases-status.component.html +16 -0
  92. package/src/lib/components/tests/test-cases-status/test-cases-status.component.scss +49 -0
  93. package/src/lib/components/tests/test-cases-status/test-cases-status.component.spec.ts +22 -0
  94. package/src/lib/components/tests/test-cases-status/test-cases-status.component.ts +18 -0
  95. package/src/lib/components/tests/test-results.component.html +119 -0
  96. package/src/lib/components/tests/test-results.component.scss +189 -0
  97. package/src/lib/components/tests/test-results.component.spec.ts +140 -0
  98. package/src/lib/components/tests/test-results.component.ts +98 -0
  99. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.html +96 -0
  100. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.scss +6 -0
  101. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.spec.ts +599 -0
  102. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.ts +279 -0
  103. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.html +36 -0
  104. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.scss +183 -0
  105. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.spec.ts +883 -0
  106. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.ts +575 -0
  107. package/src/lib/config/index.ts +3 -0
  108. package/src/lib/config/tgo-coding-test.config.ts +26 -0
  109. package/src/lib/config/tgo-coding-test.provider.ts +38 -0
  110. package/src/lib/config/tgo-coding-test.token.ts +21 -0
  111. package/src/lib/models/.gitkeep +0 -0
  112. package/src/lib/models/auto-saved-data.ts +51 -0
  113. package/src/lib/models/code-event.ts +17 -0
  114. package/src/lib/models/coderunner-execution-results.ts +58 -0
  115. package/src/lib/models/coding-lib.mocks.ts +246 -0
  116. package/src/lib/models/configs.ts +18 -0
  117. package/src/lib/models/language-change-action.ts +4 -0
  118. package/src/lib/models/lat-languages.ts +12 -0
  119. package/src/lib/models/mixpanel-events.ts +3 -0
  120. package/src/lib/models/mode.ts +5 -0
  121. package/src/lib/models/paste-data.ts +4 -0
  122. package/src/lib/models/programming-language.ts +9 -0
  123. package/src/lib/models/test-cases.ts +74 -0
  124. package/src/lib/models/theme.ts +5 -0
  125. package/src/lib/models/translations.ts +1 -0
  126. package/src/lib/models/view-mode.ts +6 -0
  127. package/src/lib/pipes/memoize-func.pipe.ts +34 -0
  128. package/src/lib/services/.gitkeep +0 -0
  129. package/src/lib/services/candidate-coding-test-services/candidature-api.service.spec.ts +40 -0
  130. package/src/lib/services/candidate-coding-test-services/candidature-api.service.ts +15 -0
  131. package/src/lib/services/candidate-coding-test-services/coderunner-api.service.spec.ts +134 -0
  132. package/src/lib/services/candidate-coding-test-services/coderunner-api.service.ts +105 -0
  133. package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.spec.ts +161 -0
  134. package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.ts +100 -0
  135. package/src/lib/services/candidate-coding-test-services/coding-test.service.spec.ts +1524 -0
  136. package/src/lib/services/candidate-coding-test-services/coding-test.service.ts +843 -0
  137. package/src/lib/services/candidate-coding-test-services/index.ts +4 -0
  138. package/src/lib/services/coding-test-config.service.ts +48 -0
  139. package/src/lib/services/configurations.service.mocks.ts +77 -0
  140. package/src/lib/services/configurations.service.spec.ts +79 -0
  141. package/src/lib/services/configurations.service.ts +111 -0
  142. package/src/lib/services/index.ts +0 -0
  143. package/src/lib/services/lib-coding-test.service.spec.ts +265 -0
  144. package/src/lib/services/lib-coding-test.service.ts +157 -0
  145. package/src/lib/services/local-storage.service.mocks.ts +22 -0
  146. package/src/lib/services/storage.service.spec.ts +1120 -0
  147. package/src/lib/services/storage.service.ts +729 -0
  148. package/src/lib/services/test-cases.service.spec.ts +53 -0
  149. package/src/lib/services/test-cases.service.ts +29 -0
  150. package/src/lib/services/theme.service.spec.ts +76 -0
  151. package/src/lib/services/theme.service.ts +34 -0
  152. package/src/lib/styles/mixins.scss +86 -0
  153. package/src/lib/styles/styles.scss +112 -0
  154. package/src/lib/styles/variables.scss +105 -0
  155. package/src/lib/utils/.gitkeep +0 -0
  156. package/src/lib/utils/additional-languages/erlang.ts +115 -0
  157. package/src/lib/utils/resize-element.ts +15 -0
  158. package/src/lib/utils/time-to-ms.util.ts +10 -0
  159. package/src/test-setup.ts +1 -0
  160. package/tsconfig.json +16 -0
  161. package/tsconfig.lib.json +12 -0
  162. package/tsconfig.lib.prod.json +9 -0
  163. package/tsconfig.spec.json +13 -0
@@ -0,0 +1,279 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ EventEmitter,
5
+ inject,
6
+ Input,
7
+ OnChanges,
8
+ OnInit,
9
+ Output,
10
+ SimpleChanges,
11
+ ViewEncapsulation,
12
+ } from '@angular/core';
13
+ import { CommonModule } from '@angular/common';
14
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
15
+ import { take } from 'rxjs';
16
+ import { ApplicationTheme } from '@testgorilla/tgo-ui';
17
+
18
+ import {
19
+ CodeEditorFuncParam,
20
+ CodeEditorLanguages,
21
+ CodeEditorTypesMap,
22
+ } from '../code-editor/helpers/code-editor-helper.model';
23
+ import { PasteData } from '../code-editor/models/code-editor.model';
24
+ import { CodingSnapshot } from '../code-editor/models/coding-snapshot.model';
25
+ import { AssessmentIdPreview, LATLanguage, LATLanguages } from '../../models/lat-languages';
26
+ import { Modes } from '../../models/mode';
27
+ import { ExampleTestCase } from '../../models/test-cases';
28
+ import { ViewMode } from '../../models/view-mode';
29
+ import { ConfigurationsService } from '../../services/configurations.service';
30
+ import { LibCodingTestService } from '../../services/lib-coding-test.service';
31
+ import { StorageCodingService } from '../../services/storage.service';
32
+ import { TestCasesService } from '../../services/test-cases.service';
33
+ import { ThemeService } from '../../services/theme.service';
34
+ import { timeToMs } from '../../utils/time-to-ms.util';
35
+ import { CodeEditorComponent } from '../code-editor/code-editor.component';
36
+ import { CodingQuestionComponent } from '../coding-question/coding-question.component';
37
+ import { RunnableEditorComponent } from '../runnable-editor/runnable-editor.component';
38
+
39
+ @UntilDestroy()
40
+ @Component({
41
+ standalone: true,
42
+ selector: 'tgo-coding-test[languages]',
43
+ templateUrl: './tgo-coding-test.component.html',
44
+ styleUrl: './tgo-coding-test.component.scss',
45
+ changeDetection: ChangeDetectionStrategy.OnPush,
46
+ encapsulation: ViewEncapsulation.None,
47
+ imports: [
48
+ CommonModule,
49
+ CodeEditorComponent,
50
+ CodingQuestionComponent,
51
+ RunnableEditorComponent,
52
+ ],
53
+ })
54
+ export class TgoCodingTestComponent implements OnInit, OnChanges {
55
+
56
+ private readonly configurationsService = inject(ConfigurationsService);
57
+ private readonly libCodingTestService = inject(LibCodingTestService);
58
+ private readonly testCasesService = inject(TestCasesService);
59
+ private readonly StorageCodingService = inject(StorageCodingService);
60
+ private readonly themeService = inject(ThemeService);
61
+
62
+ @Input() initCode: string;
63
+ @Input() snapshot: CodingSnapshot;
64
+ @Input() functionParams: CodeEditorFuncParam[];
65
+ @Input() functionName: string;
66
+ @Input() returnType: keyof CodeEditorTypesMap;
67
+ @Input() isLAT: boolean;
68
+ @Input() isSQL: boolean;
69
+ @Input() shouldGenerateInitCode = true;
70
+ @Input() canAddCustomTestCases = true;
71
+
72
+ @Input() selectedProgrammingLanguage: LATLanguage;
73
+
74
+ @Input()
75
+ set languages(value: LATLanguages) {
76
+ if (!value.length) {
77
+ throw new Error('At least one language is required');
78
+ } else {
79
+ Object.defineProperty(this, 'languages', {
80
+ value,
81
+ writable: true,
82
+ });
83
+ this.updateLanguage();
84
+ }
85
+ }
86
+
87
+ @Input() isReadonly: boolean;
88
+ @Input() autoHeight: boolean;
89
+ @Input() translations: Record<string, unknown>;
90
+ @Input() questionText: string;
91
+ @Input() mode: Modes;
92
+ @Input() assessmentId: string;
93
+ @Input() companyColor: string;
94
+ @Input() testCasesStatus: any;
95
+ @Input() loading: boolean;
96
+ @Input() runTestResponse = [];
97
+ @Input() viewMode: ViewMode;
98
+ @Input() exampleTestCases: ExampleTestCase[];
99
+ // todo: remove this property from everywhere after sunsetting of the old flow
100
+ @Input() hideTestCases: boolean;
101
+ @Input() applicationTheme: ApplicationTheme = 'light';
102
+ @Input() questionId: number;
103
+
104
+ @Output() pasteEvent = new EventEmitter<PasteData>();
105
+ @Output() codeChange = new EventEmitter<string>();
106
+ @Output() runTestClick = new EventEmitter<boolean>();
107
+ @Output() languageChange = new EventEmitter<CodeEditorLanguages>();
108
+
109
+ colorTheme$ = this.configurationsService.colorTheme$;
110
+ isFullscreenMode$ = this.libCodingTestService.isFullscreen$;
111
+
112
+ isFullViewMode: boolean;
113
+ ViewModes = ViewMode;
114
+ themeSpecificColor: string;
115
+
116
+ ngOnInit() {
117
+ this.setIsFullViewMode();
118
+ this.setCompanyColor();
119
+ this.libCodingTestService.setInitCode(this.initCode);
120
+
121
+ // Local Data should be maintained only for candidate environment
122
+ if (this.isFullViewMode) {
123
+ // Perform periodic storage maintenance
124
+ this.performPeriodicMaintenance();
125
+
126
+ const storageAssessmentId =
127
+ this.isLAT && this.mode === Modes.NonAssessmentPreview
128
+ ? AssessmentIdPreview
129
+ : this.assessmentId;
130
+ const storageCodeEnable =
131
+ this.isLAT && (this.mode === Modes.Preview || this.mode === Modes.NonAssessmentPreview)
132
+ ? true
133
+ : this.mode === Modes.Running;
134
+ const storageTestCasesEnable = this.mode === Modes.Running && this.isLAT;
135
+ const storageQuestionId = Number.isInteger(this.questionId)
136
+ ? String(this.questionId)
137
+ : 'default-question-id';
138
+
139
+ this.libCodingTestService.currentLanguage$.pipe(take(1)).subscribe(language => {
140
+ this.StorageCodingService.setupAutoSavedData(
141
+ language,
142
+ storageAssessmentId,
143
+ storageQuestionId,
144
+ storageCodeEnable,
145
+ storageTestCasesEnable,
146
+ this.isLAT,
147
+ this.mode
148
+ );
149
+ if (storageTestCasesEnable) {
150
+ this.updateTestCases();
151
+ }
152
+ this.configurationsService.setCodeComponentDestroyed(false);
153
+ this.updateInitCode(this.initCode);
154
+ this.StorageCodingService.initializeSaving();
155
+ });
156
+
157
+ if (this.mode !== Modes.NonAssessmentPreview || this.isLAT) {
158
+ this.libCodingTestService.clearSavedCode$.pipe(untilDestroyed(this)).subscribe(() => {
159
+ this.StorageCodingService.clearSavedCode();
160
+ if (this.isLAT) {
161
+ this.StorageCodingService.clearSavedTestCases();
162
+ }
163
+ });
164
+
165
+ if (this.isLAT) {
166
+ this.libCodingTestService.clearLastLang$.pipe(untilDestroyed(this)).subscribe(() => {
167
+ this.StorageCodingService.clearLastLang();
168
+ });
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+ ngOnChanges(changes: SimpleChanges): void {
175
+ if (!changes.initCode?.firstChange && typeof changes.initCode?.currentValue === 'string') {
176
+ this.libCodingTestService.currentLanguage$.pipe(take(1)).subscribe(language => {
177
+ this.StorageCodingService.changeLanguage(language);
178
+ this.libCodingTestService.setInitCode(this.initCode);
179
+ this.updateInitCode(changes.initCode.currentValue);
180
+ });
181
+ }
182
+ if (changes.companyColor && changes.companyColor?.currentValue) {
183
+ this.themeService.companyColor = changes.companyColor.currentValue;
184
+ }
185
+ }
186
+
187
+ updateInitCode(code: string) {
188
+ const savedCode = this.StorageCodingService.getSavedCode();
189
+ this.initCode = savedCode ? savedCode : code;
190
+ }
191
+
192
+ private updateLanguage() {
193
+ const lastLanguageLAT = this.StorageCodingService.getLastLanguageLAT();
194
+ if (this.isLAT && this.isSavedLangRelevant(lastLanguageLAT)) {
195
+ this.libCodingTestService.changeCurrentLanguage(lastLanguageLAT.value);
196
+ const langVersion = this.getRelevantLangVersion(lastLanguageLAT);
197
+
198
+ if (langVersion) {
199
+ this.libCodingTestService.setVersion(langVersion);
200
+ }
201
+ } else {
202
+ const language = this.selectedProgrammingLanguage || this.languages[0];
203
+ this.libCodingTestService.changeCurrentLanguage(language.value);
204
+ if (language.version) {
205
+ this.libCodingTestService.setVersion(language.version);
206
+ }
207
+ }
208
+ }
209
+
210
+ private isSavedLangRelevant(lastLanguageLAT: {
211
+ value: CodeEditorLanguages;
212
+ version: string;
213
+ }): boolean {
214
+ return !!lastLanguageLAT && this.languages.some(({ value }) => value === lastLanguageLAT.value);
215
+ }
216
+
217
+ private getRelevantLangVersion(lastLang: {
218
+ value: CodeEditorLanguages;
219
+ version: string;
220
+ }): string {
221
+ const relevantLang = this.languages.find(({ value }) => value === lastLang?.value);
222
+
223
+ return relevantLang ? relevantLang.version : lastLang.version;
224
+ }
225
+
226
+ private updateTestCases() {
227
+ if (this.isLAT || (this.isSQL && !this.hideTestCases)) {
228
+ const testCases = this.StorageCodingService.getSavedTestCases();
229
+ if (testCases?.length) {
230
+ this.libCodingTestService.updateTestCases([...testCases]);
231
+ this.StorageCodingService.updateTestCases([...testCases]);
232
+ if (testCases[testCases.length - 1].localId) {
233
+ this.testCasesService.updateTestCaseLocalId(testCases[testCases.length - 1].localId);
234
+ }
235
+ } else {
236
+ this.libCodingTestService.updateTestCases([]);
237
+ this.StorageCodingService.updateTestCases([]);
238
+ this.testCasesService.resetLastTestCaseLocalId();
239
+ }
240
+ }
241
+ }
242
+
243
+ private setIsFullViewMode(): void {
244
+ this.isFullViewMode = this.viewMode === ViewMode.Full;
245
+ }
246
+
247
+ private setCompanyColor(): void {
248
+ this.themeService.themeColors$
249
+ .pipe(untilDestroyed(this))
250
+ .subscribe(({ companyColor, themeSpecificColor }) => {
251
+ this.companyColor = companyColor;
252
+ this.themeSpecificColor = themeSpecificColor;
253
+ });
254
+ }
255
+
256
+ /**
257
+ * Performs periodic maintenance on localStorage data
258
+ * This is done with a random chance to distribute cleanup over time
259
+ * and prevent all users from cleaning up storage at the same time.
260
+ */
261
+ private performPeriodicMaintenance(): void {
262
+ // Check the last time maintenance was done (stored in a separate key)
263
+ const maintenanceKey = 'lastCodingTestStorageMaintenance';
264
+ const lastMaintenance = localStorage.getItem(maintenanceKey);
265
+ const now = Date.now();
266
+ const isDoneLaterThanDay = now - parseInt(lastMaintenance, 10) > timeToMs(1);
267
+
268
+ // If maintenance was never done or was done more than a day ago,
269
+ // perform it with a 20% chance to distribute load
270
+ if (!lastMaintenance || isDoneLaterThanDay) {
271
+ // Perform maintenance with 20% probability to distribute load
272
+ if (Math.random() < 0.2) {
273
+ // Perform the cleanup silently
274
+ this.StorageCodingService.performMaintenanceAndCleanup();
275
+ localStorage.setItem(maintenanceKey, now.toString());
276
+ }
277
+ }
278
+ }
279
+ }
@@ -0,0 +1,36 @@
1
+ <ng-container *transloco="let t; read: 'CODING_QUESTION'">
2
+ @if (languages()?.length && codingLibTranslations()) {
3
+ <tgo-coding-test
4
+ class="coding-lib"
5
+ [assessmentId]="assessment!.uuid!"
6
+ [questionId]="question!.question_id!"
7
+ [isLAT]="isLAT"
8
+ [canAddCustomTestCases]="isLAT"
9
+ [isSQL]="isSQL"
10
+ [languages]="languages()"
11
+ [initCode]="initCode"
12
+ [mode]="mode"
13
+ [viewMode]="viewModes.Full"
14
+ [loading]="testResultsLoading()"
15
+ [companyColor]="companyColor"
16
+ [questionText]="question.text"
17
+ [testCasesStatus]="codingTestResults?.resume"
18
+ [runTestResponse]="codingTestResults?.listResponse!"
19
+ [exampleTestCases]="exampleTestCases"
20
+ [applicationTheme]="canopyUiTheme"
21
+ [translations]="codingLibTranslations()"
22
+ (codeChange)="updateCode($event)"
23
+ (runTestClick)="runTest()"
24
+ (languageChange)="languageChange($event)"
25
+ (pasteEvent)="screenshotPaste($event)"
26
+ >
27
+ </tgo-coding-test>
28
+ }
29
+ </ng-container>
30
+
31
+ <ngx-guided-tour
32
+ [ngClass]="activeGuidedTourId$ | async"
33
+ [ngStyle]="{ '--company-color': companyColor }"
34
+ [class.dark]="canopyUiTheme === 'dark'"
35
+ ></ngx-guided-tour>
36
+
@@ -0,0 +1,183 @@
1
+ @import 'ngx-guided-tour/scss/guided-tour-base-theme';
2
+ @import '@testgorilla/tgo-ui/projects/tgo-canopy-ui/theme/variables';
3
+
4
+ body.tour-open {
5
+ ngx-guided-tour {
6
+ --guided-tour-background-color: #{$tgo-white};
7
+ --guided-tour-text-color: #{$tgo-black};
8
+ $legacy-secondary-black: #2d2d2d;
9
+
10
+ &.dark {
11
+ --guided-tour-background-color: #{$legacy-secondary-black};
12
+ --guided-tour-text-color: #{$tgo-white};
13
+ }
14
+
15
+ .tour-step {
16
+ &.hidden {
17
+ display: none;
18
+ }
19
+
20
+ h2.tour-title,
21
+ h3.tour-title {
22
+ font-size: 20px;
23
+ padding-bottom: 0;
24
+ margin-top: 0;
25
+ }
26
+
27
+ .tour-block {
28
+ color: var(--guided-tour-text-color);
29
+ background-color: var(--guided-tour-background-color);
30
+ border-radius: 5px;
31
+ padding: 37px;
32
+ box-shadow: 0 0 13px #bbb;
33
+ }
34
+
35
+ .tour-buttons {
36
+ button {
37
+ text-align: center;
38
+ border-radius: 5px;
39
+ width: 45%;
40
+ height: 48px;
41
+ padding: 0;
42
+ font-weight: 600;
43
+ }
44
+
45
+ button.skip-button {
46
+ background: #e2e2e2;
47
+ }
48
+
49
+ button.next-button {
50
+ color: $tgo-white;
51
+ background-color: $tgo-teal-default;
52
+ }
53
+
54
+ button.back-button {
55
+ display: none;
56
+ }
57
+ }
58
+
59
+ &.tour-bottom .tour-arrow::before {
60
+ border-bottom: 1rem solid var(--guided-tour-background-color);
61
+ }
62
+
63
+ &.tour-top .tour-arrow::before {
64
+ border-top: 1rem solid var(--guided-tour-background-color);
65
+ }
66
+
67
+ &.tour-left .tour-arrow::before {
68
+ border-left: 1rem solid var(--guided-tour-background-color);
69
+ }
70
+
71
+ &.tour-right .tour-arrow::before {
72
+ border-right: 1rem solid var(--guided-tour-background-color);
73
+ }
74
+
75
+ &.tour-bottom-right .tour-arrow::before {
76
+ border-bottom-color: var(--guided-tour-background-color);
77
+ }
78
+
79
+ .tour-content {
80
+ text-align: center;
81
+ font-size: 14px;
82
+ }
83
+
84
+ h2.tour-title {
85
+ text-align: center;
86
+ }
87
+
88
+ h3.tour-title {
89
+ text-align: center;
90
+ }
91
+ }
92
+
93
+ .guided-tour-spotlight-overlay {
94
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.3),
95
+ 0 0 1.5rem rgba(0, 0, 0, 0.15);
96
+ border-radius: 5px;
97
+ }
98
+
99
+ &.lat-coding-tour {
100
+ h3.tour-title,
101
+ h2.tour-title,
102
+ .tour-content {
103
+ text-align: left;
104
+ }
105
+
106
+ .tour-content {
107
+ padding-bottom: 24px;
108
+ }
109
+ }
110
+
111
+ &.lat-coding-tour {
112
+ .tour-buttons {
113
+ button.skip-button {
114
+ background: $tgo-white;
115
+ border: 1px solid $tgo-black;
116
+ }
117
+
118
+ button.next-button {
119
+ background-color: var(--company-color, $brand-50);
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ &[theme='dark'] {
126
+ ngx-guided-tour {
127
+ .tour-step .tour-block {
128
+ box-shadow: none;
129
+ }
130
+
131
+ .guided-tour-spotlight-overlay {
132
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.65),
133
+ 0 0 1.5rem rgba(0, 0, 0, 0.5);
134
+ border-radius: 5px;
135
+ }
136
+ }
137
+ }
138
+ }
139
+
140
+ body.theme-dark ngx-guided-tour {
141
+ .tour-step .tour-block {
142
+ box-shadow: none;
143
+ }
144
+
145
+ .guided-tour-spotlight-overlay {
146
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.65), 0 0 1.5rem rgba(0, 0, 0, 0.5);
147
+ border-radius: 5px;
148
+ }
149
+ }
150
+
151
+ body {
152
+ .tgo-test-code {
153
+ display: flex;
154
+ flex: 1;
155
+ justify-content: center;
156
+
157
+ tgo-question,
158
+ tgo-micro-test-library-shell-container {
159
+ display: flex;
160
+ }
161
+ }
162
+
163
+ &[theme='dark'] {
164
+ .micro-question-code .coding-lib {
165
+ ui-dropdown,
166
+ ui-field {
167
+ .mat-mdc-text-field-wrapper {
168
+ background-color: transparent;
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ .micro-question-code {
176
+ display: flex;
177
+
178
+ .coding-lib {
179
+ display: block;
180
+ height: 100%;
181
+ }
182
+ }
183
+