172 lines
4.8 KiB
Vue
172 lines
4.8 KiB
Vue
|
<template>
|
|||
|
<div class="content">
|
|||
|
<team-header/>
|
|||
|
<hr/>
|
|||
|
|
|||
|
<div v-if="!loading">
|
|||
|
<quiz-part
|
|||
|
:key="currentAxe.identifier" :axe-number="currentAxe.identifier" :total-axes="axes.length"
|
|||
|
:title="currentAxe.title"
|
|||
|
:color="currentAxe.color"
|
|||
|
:icon="'balise_' + currentAxe.identifier + '.svg'"
|
|||
|
:questions="questions.get(currentAxe.identifier)"
|
|||
|
@rate="onRate"
|
|||
|
/>
|
|||
|
|
|||
|
<div class="button-container">
|
|||
|
<nuxt-link
|
|||
|
v-if="currentAxeIdentifier <= 1"
|
|||
|
class="button gray"
|
|||
|
to="/dashboard" aria-label="Précédent">❮
|
|||
|
</nuxt-link>
|
|||
|
<button v-if="currentAxeIdentifier > 1" class="button gray" @click="showPrevious">❮</button>
|
|||
|
<button
|
|||
|
v-if="currentAxeIdentifier < axes.length" class="button blue" :disabled="!isFilled"
|
|||
|
@click="showNext"
|
|||
|
>Suivant ❯
|
|||
|
</button>
|
|||
|
<button
|
|||
|
v-if="currentAxeIdentifier >= axes.length" class="button orange"
|
|||
|
:disabled="!isFilled || saving" @click="saveResult()"
|
|||
|
>Valider ❯
|
|||
|
</button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div v-else class="center">
|
|||
|
<loader/>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script lang="ts">
|
|||
|
|
|||
|
import {AxiosResponse} from "axios";
|
|||
|
import {Component, Vue} from "nuxt-property-decorator";
|
|||
|
import {RepositoryFactory} from "~/repositories/RepositoryFactory";
|
|||
|
import {Axe} from "~/repositories/models/axe.model";
|
|||
|
import {RestResponse} from "~/repositories/models/rest-response.model";
|
|||
|
import {Question} from "~/repositories/models/question.model";
|
|||
|
import {Quiz} from "~/repositories/models/quiz.model";
|
|||
|
import {quizStore} from "~/utils/store-accessor";
|
|||
|
|
|||
|
@Component
|
|||
|
export default class Login extends Vue {
|
|||
|
|
|||
|
readonly axeRepository = RepositoryFactory.get("axe");
|
|||
|
readonly questionRepository = RepositoryFactory.get("question");
|
|||
|
|
|||
|
private axes: Axe[] = [];
|
|||
|
private currentAxe?: Axe;
|
|||
|
private currentAxeIdentifier = 1;
|
|||
|
private questions: Map<number, Question[]> = new Map<number, []>();
|
|||
|
private loading = true;
|
|||
|
private saving = false;
|
|||
|
private isFullRated = false;
|
|||
|
|
|||
|
mounted() {
|
|||
|
this.loading = true;
|
|||
|
this.axeRepository
|
|||
|
.findAll()
|
|||
|
.then((response: AxiosResponse<RestResponse<Axe>>) => {
|
|||
|
this.axes = response.data._embedded.axes;
|
|||
|
const promises: any[] = [];
|
|||
|
this.axes.forEach(axe => {
|
|||
|
promises.push(
|
|||
|
this.questionRepository
|
|||
|
.findAllByAxeId(axe.identifier)
|
|||
|
.then((response: AxiosResponse<RestResponse<Question>>) => {
|
|||
|
return {
|
|||
|
axeId: axe.identifier,
|
|||
|
questions: response.data._embedded.questions
|
|||
|
};
|
|||
|
}));
|
|||
|
});
|
|||
|
Promise.all(promises).then((axeQuestions) => {
|
|||
|
axeQuestions.forEach(axeQuestion => {
|
|||
|
this.questions.set(axeQuestion.axeId, axeQuestion.questions)
|
|||
|
});
|
|||
|
quizStore.initialize(this.questions);
|
|||
|
this.initializeState();
|
|||
|
this.loading = false;
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
showPrevious() {
|
|||
|
if (this.currentAxeIdentifier > 1) {
|
|||
|
this.currentAxeIdentifier--;
|
|||
|
this.initializeState();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
showNext() {
|
|||
|
if (this.currentAxeIdentifier < this.axes.length) {
|
|||
|
this.currentAxeIdentifier++;
|
|||
|
this.initializeState();
|
|||
|
|
|||
|
setTimeout(() => {
|
|||
|
this.scrollTop();
|
|||
|
}, 50)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
initializeState() {
|
|||
|
this.currentAxe = this.axes.find(value => value.identifier === this.currentAxeIdentifier);
|
|||
|
const questions = quizStore.questionsRatedPerAxe.get(this.currentAxeIdentifier);
|
|||
|
const unratedQuestions = questions ? questions.filter(value => !value.rated) : [];
|
|||
|
this.isFullRated = unratedQuestions.length === 0;
|
|||
|
}
|
|||
|
|
|||
|
scrollTop() {
|
|||
|
window.scrollTo({
|
|||
|
top: 60,
|
|||
|
behavior: "smooth",
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
saveResult() {
|
|||
|
const responsesFormatted: { score: number; comment?: string; questionId: number }[] = [];
|
|||
|
quizStore.responses.forEach((value, key) => {
|
|||
|
responsesFormatted.push({
|
|||
|
score: value.score ? value.score : 0,
|
|||
|
comment: value.comment,
|
|||
|
questionId: Number.parseInt(key.replace("http://localhost:8080/questions/", "")) // FIXME use correct url when score will be a REST ressource
|
|||
|
})
|
|||
|
});
|
|||
|
|
|||
|
this.saving = true;
|
|||
|
RepositoryFactory.get('quiz').save(responsesFormatted).then((response: AxiosResponse<Quiz>) => {
|
|||
|
this.saving = false;
|
|||
|
quizStore.reset();
|
|||
|
this.$router.push({path: "/result", query: {quiz: response.data.id + ""}});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
onRate(event: { isFullRated: boolean }) {
|
|||
|
this.isFullRated = event.isFullRated;
|
|||
|
}
|
|||
|
|
|||
|
get isFilled() {
|
|||
|
return this.isFullRated;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
</script>
|
|||
|
<style lang="scss" scoped>
|
|||
|
.button-container {
|
|||
|
display: flex;
|
|||
|
flex-direction: row;
|
|||
|
justify-content: center;
|
|||
|
|
|||
|
> a {
|
|||
|
margin-right: 5px;
|
|||
|
}
|
|||
|
|
|||
|
> button {
|
|||
|
margin-left: 5px;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
</style>
|