77 lines
2.0 KiB
TypeScript
77 lines
2.0 KiB
TypeScript
|
import {Module, VuexModule, Mutation} from 'vuex-module-decorators'
|
||
|
import {Question} from "~/repositories/models/question.model";
|
||
|
import {QuizRate, Response} from "~/repositories/models/quiz.model";
|
||
|
|
||
|
@Module({
|
||
|
name: 'quiz',
|
||
|
stateFactory: true,
|
||
|
namespaced: true,
|
||
|
})
|
||
|
export default class Quiz extends VuexModule {
|
||
|
|
||
|
responses = new Map<string, QuizRate>;
|
||
|
questionsRatedPerAxe = new Map<number, { questionId: string; rated: boolean }[]>;
|
||
|
|
||
|
@Mutation
|
||
|
initialize(questions: Map<number, Question[]>) {
|
||
|
questions.forEach((questions, axeId) => this.questionsRatedPerAxe.set(axeId, questions.map(value => {
|
||
|
return {
|
||
|
questionId: value._links.self.href,
|
||
|
rated: this.responses.has(value._links.self.href)
|
||
|
}
|
||
|
})));
|
||
|
}
|
||
|
|
||
|
@Mutation
|
||
|
reset() {
|
||
|
this.responses.clear();
|
||
|
this.questionsRatedPerAxe.forEach((questions) => {
|
||
|
questions
|
||
|
.map(value => {
|
||
|
value.rated = false;
|
||
|
return value;
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
@Mutation
|
||
|
updateScoreResponse(response: Response) {
|
||
|
const previous = this.responses.get(response.questionId);
|
||
|
if (previous) {
|
||
|
this.responses.set(response.questionId, {
|
||
|
comment: previous.comment,
|
||
|
score: response.score
|
||
|
});
|
||
|
} else {
|
||
|
this.responses.set(response.questionId, {
|
||
|
score: response.score
|
||
|
});
|
||
|
}
|
||
|
const questionsRated = this.questionsRatedPerAxe.get(response.axeId);
|
||
|
if (questionsRated) {
|
||
|
questionsRated
|
||
|
.filter(value => value.questionId === response.questionId)
|
||
|
.map(value => {
|
||
|
value.rated = true;
|
||
|
return value;
|
||
|
});
|
||
|
}
|
||
|
// else should not happen
|
||
|
}
|
||
|
|
||
|
@Mutation
|
||
|
updateCommentResponse(response: Response) {
|
||
|
const previous = this.responses.get(response.questionId);
|
||
|
if (previous) {
|
||
|
this.responses.set(response.questionId, {
|
||
|
score: previous.score,
|
||
|
comment: response.comment
|
||
|
});
|
||
|
} else {
|
||
|
this.responses.set(response.questionId, {
|
||
|
comment: response.comment
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|