Score
Session Extension
@@ -58,12 +60,15 @@
- Challenge Reports
{{c.tag}}
{{c.points}}
{{c.attemptCount}}
- {{c.successCount}} / {{c.successCount / c.attemptCount | percent}}
- {{c.partialCount}} / {{c.partialCount / c.attemptCount | percent}}
+ {{c.successCount}} / {{c.successCount / c.attemptCount | percent}}
+
+ {{c.partialCount}} / {{c.partialCount / c.attemptCount | percent}}
+
{{c.averageTime}}
{{c.averageScore}}
+
diff --git a/projects/gameboard-ui/src/app/admin/components/external-game-admin/external-game-admin.component.html b/projects/gameboard-ui/src/app/admin/components/external-game-admin/external-game-admin.component.html
index 295c0c49..54b3f654 100644
--- a/projects/gameboard-ui/src/app/admin/components/external-game-admin/external-game-admin.component.html
+++ b/projects/gameboard-ui/src/app/admin/components/external-game-admin/external-game-admin.component.html
@@ -75,7 +75,7 @@
-
+
Created
@@ -123,11 +123,15 @@
-
diff --git a/projects/gameboard-ui/src/app/admin/components/external-game-host-picker/external-game-host-picker.component.ts b/projects/gameboard-ui/src/app/admin/components/external-game-host-picker/external-game-host-picker.component.ts
index 320294c0..81c2bf13 100644
--- a/projects/gameboard-ui/src/app/admin/components/external-game-host-picker/external-game-host-picker.component.ts
+++ b/projects/gameboard-ui/src/app/admin/components/external-game-host-picker/external-game-host-picker.component.ts
@@ -26,6 +26,12 @@ export class ExternalGameHostPickerComponent implements OnInit {
async ngOnInit(): Promise {
await this.loadHosts(this.selectedHostId);
+
+ if (!this.selectedHostId && this.hosts.length) {
+ this.selectedHostId = this.hosts[0].id;
+ this.selectedHostIdChange.emit(this.selectedHostId);
+ this.selectedHostChange.emit(this.hosts[0]);
+ }
}
ngOnChanges(changes: SimpleChanges) {
diff --git a/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.html b/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.html
index 54374cad..3c04a3ff 100644
--- a/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.html
+++ b/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.html
@@ -21,7 +21,7 @@
-
-
-
-
- 500 ? 'long-text' : ''">
-
+
+
+
+
+
+
+ 500 ? 'long-text' : ''">
+
@@ -183,7 +197,7 @@
Question
Points / % of Total
@@ -73,7 +78,8 @@ Challenge Reports
{{i + 1}}. {{part.text}}
{{ part.weight }} / {{ part.weight / c.points | percent}}
- 0" class="col-3 p-2 border">{{part.solveCount}} / {{part.solveCount / challengeDetailReports[c.id].attemptCount | percent}}
+ 0" class="col-3 p-2 border">{{part.solveCount}} /
+ {{part.solveCount / challengeDetailReports[c.id].attemptCount | percent}}
{{0 | percent}}
Challenges
Challenges
Game Host URL
- +
+ {{team.externalGameHostUrl}}
+
+ [(ngModel)]="editHost.clientUrl" placeholder="https://my-site.com/the-client" required>
@@ -32,7 +32,7 @@
-
-
@@ -50,12 +50,29 @@
[(ngModel)]="editHost.teamExtendedEndpoint" placeholder="team/extended">
+
+
+
+ All set!
+
diff --git a/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.ts b/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.ts
index e2f5b9d3..93db6eda 100644
--- a/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.ts
+++ b/projects/gameboard-ui/src/app/admin/components/external-host-editor/external-host-editor.component.ts
@@ -19,8 +19,11 @@ export class ExternalHostEditorComponent implements OnInit {
public onSave?: (host: UpsertExternalGameHost) => void | Promise;
protected subtitle?: string;
protected title = "New External Game Host";
+ protected tryPingResult?: { success: boolean; response?: string };
- constructor(private externalGameService: ExternalGameService) { }
+ constructor(
+ private externalGameService: ExternalGameService,
+ ) { }
async ngOnInit() {
if (this.hostId) {
@@ -40,4 +43,8 @@ export class ExternalHostEditorComponent implements OnInit {
if (this.onSave)
await this.onSave(host);
}
+
+ protected async handleTryPing(host: UpsertExternalGameHost) {
+ this.tryPingResult = await this.externalGameService.tryPingHost(host);
+ }
}
diff --git a/projects/gameboard-ui/src/app/admin/feedback-report/feedback-report.component.html b/projects/gameboard-ui/src/app/admin/feedback-report/feedback-report.component.html
index 13ff5e69..40407060 100644
--- a/projects/gameboard-ui/src/app/admin/feedback-report/feedback-report.component.html
+++ b/projects/gameboard-ui/src/app/admin/feedback-report/feedback-report.component.html
@@ -1,4 +1,4 @@
-
+
Back
@@ -40,7 +40,7 @@
{{currentGame?.name}}
@@ -124,9 +125,12 @@
@@ -162,19 +166,29 @@ Time
Challenge
Name
-
+
{{q.id}})
-
+
+
+
+
+
+
+
+
+
+ {{ tryPingResult.response }}
+
+
+
Feedback
{{currentGame?.name}} - {{currentChallengeSpec?.name ?? 'All ' +
- challengeSpecs?.length + ' Challenges'}}
+ challengeSpecs?.length + ' Challenges'}}
Question Summary
{{q.id}}) {{q.prompt}}*
- {{!!q.count ? (q.average | number:'1.2-2'): ''}}/{{q.scaleMax}}
- {{!!q.count ? q.lowest : ''}}/{{q.scaleMax}}
- {{!!q.count ? q.highest : ''}}/{{q.scaleMax}}
+ {{!!q.count ? (q.average | number:'1.2-2'): ''}}/{{q.scaleMax}}
+ {{!!q.count ? q.lowest : ''}}/{{q.scaleMax}}
+
+ {{!!q.count ? q.highest : ''}}/{{q.scaleMax}}
+
{{q.count}}
Individual Submissions
{{q.shortName ?? q.prompt}}
{{ r.timestamp | shorttime:true }}
{{r.challengeId | slice:0:8}} {{r.challengeTag}}
{{ r.approvedName }}
{{(q.answer && q.answer.length) ? q.answer : "--"}}
+ {{ r.timestamp | shorttime:true }}
+ {{r.challengeId | slice:0:8}} {{r.challengeTag}}
+ {{ r.approvedName }}
+ {{(q.answer &&
+ q.answer.length) ? q.answer : "--"}}
Individual Submissions
No feedback yet.
-
+
diff --git a/projects/gameboard-ui/src/app/admin/game-editor/game-editor.component.ts b/projects/gameboard-ui/src/app/admin/game-editor/game-editor.component.ts
index 0d0db91e..3d0140ec 100644
--- a/projects/gameboard-ui/src/app/admin/game-editor/game-editor.component.ts
+++ b/projects/gameboard-ui/src/app/admin/game-editor/game-editor.component.ts
@@ -103,9 +103,11 @@ export class GameEditorComponent implements AfterViewInit {
}
async handleExternalGameHostChanged(host: ExternalGameHost) {
- this.game.externalHostId = host.id;
- await firstValueFrom(this.api.update(this.game));
- this.toast.showMessage(`Changed to host **${host.name}**`);
+ if (this.game.mode == "external" && this.game.externalHostId != host.id) {
+ this.game.externalHostId = host.id;
+ await firstValueFrom(this.api.update(this.game));
+ this.toast.showMessage(`Changed to host **${host.name}**`);
+ }
}
async handleFeedbackTemplateChange(template?: FeedbackTemplate) {
@@ -121,9 +123,14 @@ export class GameEditorComponent implements AfterViewInit {
await firstValueFrom(this.api.update(this.game));
}
- handleModeChange(event: Event) {
+ async handleModeChange(event: Event) {
const gameMode = ((event?.target as any).value as GameEngineMode);
this.game.mode = gameMode;
+
+ if (this.game.mode != "external")
+ this.game.externalHostId = undefined;
+
+ await firstValueFrom(this.api.update(this.game));
}
protected handleSpecsUpdated(specs: Spec[]) {
diff --git a/projects/gameboard-ui/src/app/admin/participation-report/participation-report.component.html b/projects/gameboard-ui/src/app/admin/participation-report/participation-report.component.html
index 7717727a..93b8c793 100644
--- a/projects/gameboard-ui/src/app/admin/participation-report/participation-report.component.html
+++ b/projects/gameboard-ui/src/app/admin/participation-report/participation-report.component.html
@@ -1,43 +1,49 @@
-
-
- Back
-
-
-
+ Back
+
-
Participation Reports
+ +
+
diff --git a/projects/gameboard-ui/src/app/admin/player-sponsor-report/player-sponsor-report.component.html b/projects/gameboard-ui/src/app/admin/player-sponsor-report/player-sponsor-report.component.html
index 1ddfe76e..4430f006 100644
--- a/projects/gameboard-ui/src/app/admin/player-sponsor-report/player-sponsor-report.component.html
+++ b/projects/gameboard-ui/src/app/admin/player-sponsor-report/player-sponsor-report.component.html
@@ -1,7 +1,7 @@
-
+
Back
diff --git a/projects/gameboard-ui/src/app/admin/support-report-legacy/support-report-legacy.component.html b/projects/gameboard-ui/src/app/admin/support-report-legacy/support-report-legacy.component.html
index 60764c2b..d6451d3a 100644
--- a/projects/gameboard-ui/src/app/admin/support-report-legacy/support-report-legacy.component.html
+++ b/projects/gameboard-ui/src/app/admin/support-report-legacy/support-report-legacy.component.html
@@ -1,4 +1,4 @@
-
+
Back
diff --git a/projects/gameboard-ui/src/app/admin/user-registrar/user-registrar.component.ts b/projects/gameboard-ui/src/app/admin/user-registrar/user-registrar.component.ts
index 9ed40c2a..419fea73 100644
--- a/projects/gameboard-ui/src/app/admin/user-registrar/user-registrar.component.ts
+++ b/projects/gameboard-ui/src/app/admin/user-registrar/user-registrar.component.ts
@@ -4,11 +4,12 @@
import { Component } from '@angular/core';
import { BehaviorSubject, interval, merge, Observable } from 'rxjs';
import { debounceTime, map, switchMap, tap } from 'rxjs/operators';
-import { Search, SortDirection } from '../../api/models';
+import { Search } from '../../api/models';
import { ApiUser, UserRole } from '../../api/user-models';
import { UserService } from '../../api/user.service';
import { fa } from '@/services/font-awesome.service';
import { SortService } from '@/services/sort.service';
+import { SortDirection } from '@/core/models/sort-direction';
type UserRegistrarSort = "name" | "lastLogin" | "createdOn";
diff --git a/projects/gameboard-ui/src/app/admin/user-report/user-report.component.html b/projects/gameboard-ui/src/app/admin/user-report/user-report.component.html
index 18ac2a71..34228c15 100644
--- a/projects/gameboard-ui/src/app/admin/user-report/user-report.component.html
+++ b/projects/gameboard-ui/src/app/admin/user-report/user-report.component.html
@@ -1,7 +1,7 @@
-
+
Back
@@ -14,12 +14,14 @@
@@ -54,7 +56,7 @@ Participation Reports
+ +
-
+
-
+
-
+
-
+
-
+
-
+
User Reports
-
+
-
+
Players
{{p.gameName}}
- {{p.playerCount}}
+ {{p.playerCount}}
{{p.sessionPlayerCount}}
-
+
-
+
diff --git a/projects/gameboard-ui/src/app/core/directives/query-param-model.directive.ts b/projects/gameboard-ui/src/app/core/directives/query-param-model.directive.ts
index 3d7b9683..e17685bf 100644
--- a/projects/gameboard-ui/src/app/core/directives/query-param-model.directive.ts
+++ b/projects/gameboard-ui/src/app/core/directives/query-param-model.directive.ts
@@ -139,30 +139,6 @@ export class QueryParamModelDirective implements OnChanges {
resetParams: this.config?.resetQueryParams
});
}
-
- private deserializeModel(params: Params, config: QueryParamModelConfig): T | null {
- if (!config) {
- return null;
- }
-
- if (!this._isMultiConfig) {
- // we're deserializing a simple type using a provided serializer
- // and mapping it to config.name
-
- if (!config.name) {
- throw new Error("Can't deserialize a query param model with no name.");
- }
-
- return (config.deserialize || defaultDeserializer)(params[config.name]);
- }
-
- // otherwise, we're deserializing an object with multiple properties
- if (!config.deserializeMulti || !config.propertyNameToQueryParamNameMap) {
- throw new Error("Can't deserialize a multiproperty query param model without a deserializer and a param names map.");
- }
-
- return config.deserializeMulti!(params, this._toQueryStringParamNames) as T;
- }
}
export const defaultSerializer = (value: T | null): string | null => value?.toString() || null;
diff --git a/projects/gameboard-ui/src/app/core/models/sort-direction.ts b/projects/gameboard-ui/src/app/core/models/sort-direction.ts
new file mode 100644
index 00000000..57369084
--- /dev/null
+++ b/projects/gameboard-ui/src/app/core/models/sort-direction.ts
@@ -0,0 +1 @@
+export type SortDirection = "asc" | "desc";
diff --git a/projects/gameboard-ui/src/app/game/components/scoreboard-team-detail-modal/scoreboard-team-detail-modal.component.html b/projects/gameboard-ui/src/app/game/components/scoreboard-team-detail-modal/scoreboard-team-detail-modal.component.html
index 8b0c4278..0eecadb0 100644
--- a/projects/gameboard-ui/src/app/game/components/scoreboard-team-detail-modal/scoreboard-team-detail-modal.component.html
+++ b/projects/gameboard-ui/src/app/game/components/scoreboard-team-detail-modal/scoreboard-team-detail-modal.component.html
@@ -62,7 +62,7 @@
-
+
Challenge
diff --git a/projects/gameboard-ui/src/app/game/components/scoreboard/scoreboard.component.html b/projects/gameboard-ui/src/app/game/components/scoreboard/scoreboard.component.html
index 0030fd17..29e29243 100644
--- a/projects/gameboard-ui/src/app/game/components/scoreboard/scoreboard.component.html
+++ b/projects/gameboard-ui/src/app/game/components/scoreboard/scoreboard.component.html
@@ -13,8 +13,8 @@
-
-
+
+
{{ scoreboardData.game.isTeamGame ? "Team" : "Player" }}
Challenges
diff --git a/projects/gameboard-ui/src/app/game/pages/gameboard-page/gameboard-page.component.ts b/projects/gameboard-ui/src/app/game/pages/gameboard-page/gameboard-page.component.ts
index 8344d246..349c1619 100644
--- a/projects/gameboard-ui/src/app/game/pages/gameboard-page/gameboard-page.component.ts
+++ b/projects/gameboard-ui/src/app/game/pages/gameboard-page/gameboard-page.component.ts
@@ -1,10 +1,10 @@
// Copyright 2021 Carnegie Mellon University. All Rights Reserved.
// Released under a MIT (SEI)-style license. See LICENSE.md in the project root for license information.
-import { Component, OnDestroy, ViewChild } from '@angular/core';
+import { Component, ViewChild } from '@angular/core';
import { Title } from '@angular/platform-browser';
import { ActivatedRoute } from '@angular/router';
-import { firstValueFrom, merge, Observable, of, Subject, Subscription, timer } from 'rxjs';
+import { firstValueFrom, merge, Observable, of, Subject, timer } from 'rxjs';
import { catchError, debounceTime, filter, map, switchMap, tap } from 'rxjs/operators';
import { faArrowLeft, faBolt, faExclamationTriangle, faTrash, faTv } from '@fortawesome/free-solid-svg-icons';
@@ -27,14 +27,13 @@ import { UnsubscriberService } from '@/services/unsubscriber.service';
styleUrls: ['./gameboard-page.component.scss'],
providers: [UnsubscriberService]
})
-export class GameboardPageComponent implements OnDestroy {
+export class GameboardPageComponent {
refresh$ = new Subject();
ctx!: BoardPlayer;
hoveredItem: BoardSpec | null = null;
selected!: BoardSpec;
selecting$ = new Subject();
launching$ = new Subject();
- fetch$: Subscription;
etd$!: Observable;
errors: any[] = [];
@@ -63,68 +62,68 @@ export class GameboardPageComponent implements OnDestroy {
) {
this.user$ = usersvc.user$;
-
+ this.unsub.add(hub.challengeEvents.subscribe(ev => this.syncOne(ev.model as Challenge)));
this.unsub.add(
- hub.challengeEvents.subscribe(ev => this.syncOne(ev.model as Challenge))
+ merge(
+ route.params.pipe(
+ tap(p => this.cid = p.cid),
+ map(p => p.playerId)
+ ),
+ this.refresh$
+ ).pipe(
+ filter(id => !!id),
+ debounceTime(300),
+ switchMap(id => api.load(id).pipe(
+ catchError(err => of({} as BoardPlayer))
+ )),
+ tap(b => {
+ this.ctx = b;
+ title.setTitle(`${b.game.name} | ${this.config.appName}`);
+
+ this.performanceSummaryViewModel = {
+ player: {
+ id: b.id,
+ teamId: b.teamId,
+ session: b.session,
+ scoring: {
+ rank: b.rank,
+ score: b.score,
+ partialCount: b.partialCount,
+ correctCount: b.correctCount
+ }
+ }
+ };
+ }),
+ tap(b => this.startHub(b)),
+ tap(() => this.reselect())
+ ).subscribe()
);
- this.fetch$ = merge(
- route.params.pipe(
- tap(p => this.cid = p.cid),
- map(p => p.playerId)
- ),
- this.refresh$
- ).pipe(
- filter(id => !!id),
- debounceTime(300),
- switchMap(id => api.load(id).pipe(
- catchError(err => of({} as BoardPlayer))
- )),
- tap(b => {
- this.ctx = b;
- title.setTitle(`${b.game.name} | ${this.config.appName}`);
-
- this.performanceSummaryViewModel = {
- player: {
- id: b.id,
- teamId: b.teamId,
- session: b.session,
- scoring: {
- rank: b.rank,
- score: b.score,
- partialCount: b.partialCount,
- correctCount: b.correctCount
- }
+ this.unsub.add(
+ this.launching$.pipe(
+ switchMap(async s => {
+ try {
+ const launchedSpec = await firstValueFrom(
+ api.launch({
+ playerId: this.ctx.id,
+ specId: s.id,
+ variant: this.variant,
+ userId: usersvc.user$.value!.id
+ })
+ );
+
+ return launchedSpec;
}
- };
- }),
- tap(b => this.startHub(b)),
- tap(() => this.reselect())
- ).subscribe();
-
- this.unsub.add(this.launching$.pipe(
- switchMap(async s => {
- try {
- const launchedSpec = await firstValueFrom(
- api.launch({
- playerId: this.ctx.id,
- specId: s.id,
- variant: this.variant,
- userId: usersvc.user$.value!.id
- })
- );
-
- return launchedSpec;
- }
- catch (err: any) {
- this.renderLaunchError(err);
- return s.instance || null as unknown as Challenge;
- }
- }),
- tap(c => this.deploying = false),
- filter(c => !!c),
- map(c => this.syncOne(c))
- ).subscribe());
+ catch (err: any) {
+ this.renderLaunchError(err);
+ return s.instance || null as unknown as Challenge;
+ }
+ }),
+ tap(c => this.deploying = false),
+ filter(c => !!c),
+ map(c => this.syncOne(c))
+ ).subscribe()
+ );
this.unsub.add(
this.selecting$.pipe(
@@ -146,11 +145,8 @@ export class GameboardPageComponent implements OnDestroy {
// don't persist the "confirming" state if they switch challenges (#178)
tap(c => this.startChallengeConfirmButton?.stopConfirming()),
tap(s => this.selected = s)
- ).subscribe());
- }
-
- ngOnDestroy(): void {
- if (this.fetch$) { this.fetch$.unsubscribe(); }
+ ).subscribe()
+ );
}
private startHub(b: BoardPlayer): void {
diff --git a/projects/gameboard-ui/src/app/reports/components/parameter-change-link/parameter-change-link.component.ts b/projects/gameboard-ui/src/app/reports/components/parameter-change-link/parameter-change-link.component.ts
index d4dc77ea..8320ad8b 100644
--- a/projects/gameboard-ui/src/app/reports/components/parameter-change-link/parameter-change-link.component.ts
+++ b/projects/gameboard-ui/src/app/reports/components/parameter-change-link/parameter-change-link.component.ts
@@ -9,7 +9,7 @@ export interface ParameterChangeRouterLinkConfig {
@Component({
selector: 'app-parameter-change-link',
template: `
-
+
diff --git a/projects/gameboard-ui/src/app/reports/components/reports-home/reports-home.component.html b/projects/gameboard-ui/src/app/reports/components/reports-home/reports-home.component.html
index 58f0229d..5ce438ea 100644
--- a/projects/gameboard-ui/src/app/reports/components/reports-home/reports-home.component.html
+++ b/projects/gameboard-ui/src/app/reports/components/reports-home/reports-home.component.html
@@ -8,7 +8,12 @@
Challenges
Reports
-Legacy Reports
++ Legacy Reports + + [Deprecating] +
User Reports
Board Reports
diff --git a/projects/gameboard-ui/src/app/reports/components/reports/challenges-report/challenges-report.component.html b/projects/gameboard-ui/src/app/reports/components/reports/challenges-report/challenges-report.component.html
index 95fa3902..b059acc3 100644
--- a/projects/gameboard-ui/src/app/reports/components/reports/challenges-report/challenges-report.component.html
+++ b/projects/gameboard-ui/src/app/reports/components/reports/challenges-report/challenges-report.component.html
@@ -10,7 +10,7 @@
[itemTemplate]="multiSelectGame" [getSearchText]="displayGameName"
[value]="getGameValue">
+ label="Include Challenge Stats from">
+ class="table table-hover gameboard-table gameboard-report">
Summary | Players | @@ -41,22 +41,41 @@ Competitive Solves | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Challenge | -Game | -Players | -Avg. Score | -Avg. Solve Time | -Competitive | -Practice | -None | -Partial | -Complete | +||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Challenge | +Game | +
+ |
+
+ |
+
+ |
+
+ |
+
+ |
+
+ |
+
+ |
+
+ |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{{ record.challengeSpec.name }}
diff --git a/projects/gameboard-ui/src/app/reports/components/reports/enrollment-report/enrollment-report-by-game/enrollment-report-by-game.component.html b/projects/gameboard-ui/src/app/reports/components/reports/enrollment-report/enrollment-report-by-game/enrollment-report-by-game.component.html
index 18de6d57..794f5b0d 100644
--- a/projects/gameboard-ui/src/app/reports/components/reports/enrollment-report/enrollment-report-by-game/enrollment-report-by-game.component.html
+++ b/projects/gameboard-ui/src/app/reports/components/reports/enrollment-report/enrollment-report-by-game/enrollment-report-by-game.component.html
@@ -1,28 +1,44 @@
-
|