Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/app/data-structure/has-id-and-title.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export class HasIdAndTitle {
public id: string;
public title: string;
public link: string;
public id: string = "";
public title: string = "";
public link: string = "";
}
18 changes: 9 additions & 9 deletions src/app/data-structure/login-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ export class LoginInfo {
return plainToClass(LoginInfo, obj as object);
}

public loggedIn: boolean;
public nickname: string;
public loggedIn: boolean = false;
public nickname: string = "";

public googleLinked: boolean;
public googleProfileUrl: string;
public gitHubLinked: boolean;
public gitHubProfileUrl: string;
public facebookLinked: boolean;
public facebookProfileUrl: string;
public googleLinked: boolean = false;
public googleProfileUrl: string = "";
public gitHubLinked: boolean = false;
public gitHubProfileUrl: string = "";
public facebookLinked: boolean = false;
public facebookProfileUrl: string = "";

public errorMessage: string;
public errorMessage: string = "";
}
4 changes: 2 additions & 2 deletions src/app/data-structure/quiz-question-and-answer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { QuizText } from "./quiz-text";

export class QuizQuestionAndAnswer {
@Type(() => QuizQuestion)
public question: QuizQuestion;
public question?: QuizQuestion;

@Type(() => QuizText)
public answer: QuizText;
public answer?: QuizText;
}
22 changes: 11 additions & 11 deletions src/app/data-structure/quiz-question.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,25 @@ export class QuizQuestion extends HasIdAndTitle {
}

@Type(() => QuizText)
public text: QuizText;
public text?: QuizText;

public note: string;
public videoUrl: string;
public codeUrl: string;
public note: string = "";
public videoUrl: string = "";
public codeUrl: string = "";

@Type(() => QuizText)
public choices: QuizText[];
public choices?: QuizText[];

public sectionId: string;
public subSectionId: string;
public sectionId: string = "";
public subSectionId: string = "";

public quizTitle: string;
public quizTitle: string = "";

@Type(() => HasIdAndTitle)
public section: HasIdAndTitle;
public section?: HasIdAndTitle;

@Type(() => HasIdAndTitle)
public subSection: HasIdAndTitle;
public subSection?: HasIdAndTitle;

public quizUsesMathML: boolean;
public quizUsesMathML: boolean = false;
}
9 changes: 4 additions & 5 deletions src/app/data-structure/quiz-section.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
import { plainToClass, Type } from "class-transformer";
import {isUndefined} from "util";
import { HasIdAndTitle } from "./has-id-and-title";
import { QuizQuestionAndAnswer } from "./quiz-question-and-answer";
import { QuizSubSection } from "./quiz-sub-section";

export class QuizSection extends HasIdAndTitle {
public static fromJson(obj: any): QuizSection {
if (isUndefined(obj)) {
public static fromJson(obj: any): QuizSection | undefined {
if (!obj!) {
return undefined;
}

return plainToClass(QuizSection, obj as object);
}

@Type(() => QuizSubSection)
public subSections: QuizSubSection[];
public subSections: QuizSubSection[] = [];

// defaultChoices
@Type(() => QuizQuestionAndAnswer)
public questions: QuizQuestionAndAnswer[];
public questions: QuizQuestionAndAnswer[] = [];
}
2 changes: 1 addition & 1 deletion src/app/data-structure/quiz-sub-section.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { QuizQuestionAndAnswer } from "./quiz-question-and-answer";
export class QuizSubSection extends HasIdAndTitle {

@Type(() => QuizQuestionAndAnswer)
public questions: QuizQuestionAndAnswer[];
public questions: QuizQuestionAndAnswer[] = [];

public addQuestion(qa: QuizQuestionAndAnswer): void {
if (!this.questions) {
Expand Down
4 changes: 2 additions & 2 deletions src/app/data-structure/quiz-text.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export class QuizText {
public text: string;
public isHtml: boolean;
public text: string = "";
public isHtml: boolean = false;
}
6 changes: 3 additions & 3 deletions src/app/data-structure/quiz.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ export class Quiz extends HasIdAndTitle {
return plainToClass(Quiz, obj as object);
}

public isPrivate: boolean;
public usesMathML: boolean;
public isPrivate: boolean = false;
public usesMathML: boolean = false;

@Type(() => QuizSection)
public sections: QuizSection[];
public sections: QuizSection[] = [];
}
6 changes: 3 additions & 3 deletions src/app/data-structure/submission-result.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ export class SubmissionResult {
return plainToClass(SubmissionResult, obj as object);
}

public result: boolean;
public result: boolean = false;

@Type(() => QuizText)
public correctAnswer: QuizText;
public correctAnswer?: QuizText = undefined;

@Type(() => QuizQuestion)
public nextQuestion: QuizQuestion;
public nextQuestion?: QuizQuestion = undefined;
}
2 changes: 1 addition & 1 deletion src/app/data-structure/submission.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export class Submission {
public answer: string;
public answer: string = "";
}
2 changes: 1 addition & 1 deletion src/app/data-structure/user-history-quizzes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ export class UserHistoryQuizzes {
}

@Type(() => UserStats)
public stats: UserStats[];
public stats: UserStats[] = [];
}
18 changes: 7 additions & 11 deletions src/app/data-structure/user-history-sections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,27 +17,27 @@ export class UserHistorySections {
}

// After parsing, we will use only statsMap.
result.stats = undefined;
result.stats = [];
}

return result;
}

@Type(() => LoginInfo)
public loginInfo: LoginInfo;
public loginInfo?: LoginInfo = undefined;

public quizId: string;
public quizTitle: string;
public quizId: string = "";
public quizTitle: string = "";

// Only used when parsing from JSON.
@Type(() => UserStats)
public stats: UserStats[];
public stats: UserStats[] = [];

// Map of section IDs to stats.
// This is built from stats
public statsMap: Map<string, UserStats>;
public statsMap: Map<string, UserStats> = new Map<string, UserStats>();

public getUserStatsForSection(sectionId: string): UserStats {
public getUserStatsForSection(sectionId: string): UserStats | undefined {
if (!this.statsMap) {
return undefined;
}
Expand All @@ -46,10 +46,6 @@ export class UserHistorySections {
}

public setUserStatsForSection(sectionId: string, userStats: UserStats) {
if (!this.statsMap) {
this.statsMap = new Map<string, UserStats>();
}

// Update in the map.
this.statsMap.set(sectionId, userStats);
}
Expand Down
8 changes: 4 additions & 4 deletions src/app/data-structure/user-question-history.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ export class UserQuestionHistory {
return result;
}

public questionId: string;
public questionId: string = "";

@Type(() => QuizText)
public questionTitle: QuizText;
public questionTitle?: QuizText = undefined;

public sectionId: string;
public subSectionTitle: string;
public sectionId: string = "";
public subSectionTitle: string = "";

public answeredCorrectlyOnce = false;
public countAnsweredWrong = 0;
Expand Down
40 changes: 12 additions & 28 deletions src/app/data-structure/user-stats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export class UserStats {
result.questionHistoriesMap.set(questionId, questionHistory);

// After this point, we will only use questionHistoriesMap.
result.questionHistories = undefined;
result.questionHistories = [];
}
}

Expand All @@ -41,29 +41,29 @@ export class UserStats {
return Number((part / total) * 100).toFixed(2) + "%";
}

public quizId: string;
public quizTitle: string;
public sectionId: string;
public sectionTitle: string;
public quizId: string = "";
public quizTitle: string = "";
public sectionId: string = "";
public sectionTitle: string = "";

public answered = 0;
public correct = 0;
public countQuestions = 0;
public countQuestionsAnsweredOnce = 0;
public countQuestionsCorrectOnce = 0;

public problemQuestionHistoriesCount: number;
public problemQuestionHistoriesCount: number = 0;

@Type(() => UserQuestionHistory)
public topProblemQuestionHistories: UserQuestionHistory[];
public topProblemQuestionHistories: UserQuestionHistory[] = [];

// Only used for parsing from JSON.
@Type(() => UserQuestionHistory)
public questionHistories: UserQuestionHistory[];
public questionHistories: UserQuestionHistory[] = [];

// Built from questionHistories.
@Exclude()
public questionHistoriesMap: Map<string, UserQuestionHistory>;
public questionHistoriesMap: Map<string, UserQuestionHistory> = new Map<string, UserQuestionHistory>();

public percentAnsweredOnce(total: number): string {
return UserStats.percentageString(total, this.countQuestionsAnsweredOnce);
Expand All @@ -83,7 +83,7 @@ export class UserStats {
this.questionHistoriesMap = new Map<string, UserQuestionHistory>();
}

let history: UserQuestionHistory = this.questionHistoriesMap.get(questionId);
let history: UserQuestionHistory | undefined = this.questionHistoriesMap.get(questionId);

// Add a new one, if necessary:
if (!history) {
Expand Down Expand Up @@ -114,7 +114,7 @@ export class UserStats {
private updateTopProblemQuestions(): void {
this.problemQuestionHistoriesCount = 0;

this.topProblemQuestionHistories = undefined;
this.topProblemQuestionHistories = [];

if (!this.questionHistoriesMap) {
return;
Expand All @@ -123,18 +123,10 @@ export class UserStats {
// Copy the values of the array.
this.questionHistoriesMap.forEach((value: UserQuestionHistory, key: string) => {
if (value.countAnsweredWrong > 0) {
if (!this.topProblemQuestionHistories) {
this.topProblemQuestionHistories = [];
}

this.topProblemQuestionHistories.push(value);
}
});

if (!this.topProblemQuestionHistories) {
return;
}

// Sort the array.
this.topProblemQuestionHistories.sort((a, b) => {
if (!a) {
Expand Down Expand Up @@ -169,25 +161,17 @@ export class UserStats {

private clearNonProblemQuestions() {
// TODO: Use a Set when/if TypeScript has one.
let idsToRemove: Map<string, boolean>;
const idsToRemove: Map<string, boolean> = new Map<string, boolean>();
for (const history of this.topProblemQuestionHistories) {
if (!history) {
continue;
}

if (history.countAnsweredWrong <= 0) {
if (!idsToRemove) {
idsToRemove = new Map<string, boolean>();
}

idsToRemove.set(history.questionId, true);
}
}

if (!idsToRemove) {
return;
}

const list: UserQuestionHistory[] = [];
for (const history of this.topProblemQuestionHistories) {
if (!history) {
Expand Down
16 changes: 10 additions & 6 deletions src/app/history.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,24 @@ import { UserHistorySectionsComponent } from "./user-history-sections.component"
})
export class HistoryComponent extends BaseComponent {

public quizId: string;
public quizTitle: string;
public quizId: string = "";
public quizTitle: string = "";
@ViewChild(UserHistorySectionsComponent, { static: true })
private sectionsComponent: UserHistorySectionsComponent;
private sectionsComponent?: UserHistorySectionsComponent;

constructor(private userHistoryService: UserHistoryService,
titleService: Title) {
super(titleService);
}

public onViewChildJsonParsed() {
const sections: UserHistorySections = this.sectionsComponent.userHistorySections;
this.quizId = sections.quizId;
this.quizTitle = sections.quizTitle;
if (this.sectionsComponent) {
const sections: UserHistorySections | undefined = this.sectionsComponent.userHistorySections;
if (sections) {
this.quizId = sections.quizId;
this.quizTitle = sections.quizTitle;
}
}

this.setTitle("History: " + this.quizTitle);
}
Expand Down
8 changes: 4 additions & 4 deletions src/app/login.component.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Component, Input, NgZone, OnInit } from "@angular/core";
import { Title } from "@angular/platform-browser";
import { ActivatedRoute, ParamMap } from "@angular/router";
import {ActivatedRoute, ParamMap, Params} from "@angular/router";

import { BaseComponent } from "./base.component";
import { Config } from "./config";
Expand All @@ -20,10 +20,10 @@ export class LoginComponent extends BaseComponent implements OnInit {
private static redirectSuffix = `?redirect=${Config.baseUrl}/user`;
// We don't want to show the logout button in the header,
// but we do want to show it on the user/profile page.
@Input() public showLogOutWhenAppropriate: boolean;
@Input() public showLogOutWhenAppropriate: boolean = false;

public loginInfo: LoginInfo;
public loginFailed: boolean;
public loginInfo?: LoginInfo;
public loginFailed: boolean = false;
public googleLoginUrl = `${Config.googleLoginPrefix}${LoginComponent.redirectSuffix}`;
public gitHubLoginUrl = `${Config.gitHubLoginPrefix}${LoginComponent.redirectSuffix}`;
public facebookLoginUrl = `${Config.facebookLoginPrefix}${LoginComponent.redirectSuffix}`;
Expand Down
Loading