Add button to report bad correction

This commit is contained in:
nemunaire 2022-03-28 10:53:45 +02:00
parent 2e3760c23d
commit 1a5eea3bb2
7 changed files with 143 additions and 17 deletions

View file

@ -32,7 +32,7 @@
let filteredResponses = [];
$:{
filteredResponses = responses.filter((r) => (notCorrected || !r.time_scored) && (!filter || ((filter[0] == '!' && !r.value.match(filter.substring(1))) || r.value.match(filter))));
filteredResponses = responses.filter((r) => (notCorrected || r.time_scored <= r.time_reported || !r.time_scored) && (!filter || ((filter[0] == '!' && !r.value.match(filter.substring(1))) || r.value.match(filter))));
}
export async function applyCorrections() {

View file

@ -1,6 +1,40 @@
<script>
import { user } from '../stores/user';
import { ToastsStore } from '../stores/toasts';
export let response = null;
export let survey = null;
let reportInProgress = false;
function report() {
reportInProgress = true;
response.report(survey).then((res) => {
reportInProgress = false;
response.time_reported = res.time_reported;
if (res.time_reported >= res.time_scored) {
ToastsStore.addToast({
msg: "Ton signalement a bien été pris en compte.",
color: "success",
title: "Signaler une erreur de correction",
});
} else if (!res.time_reported) {
ToastsStore.addToast({
msg: "La correction de ta réponse n'est maintenant plus signalée, signalement annulé.",
color: "info",
title: "Signaler une erreur de correction",
});
} else {
ToastsStore.addErrorToast({
msg: "Quelque chose s'est mal passé lors du signalement du problème.\nSi le problème persiste, contacte directement ton professeur.",
});
}
}, (error) => {
reportInProgress = false;
ToastsStore.addErrorToast({
msg: "Une erreur s'est produite durant le signalement du problème : " + error + "\nSi le problème persiste, contacte directement ton professeur.",
});
})
}
</script>
{#if response.score !== undefined}
@ -19,6 +53,45 @@
</strong>
</div>
<div class="col">
{#if response.id_user == $user.id}
<button
type="button"
class="d-block btn btn-sm float-end"
class:btn-outline-success={!response.time_reported && response.score >= 95}
class:btn-outline-info={!response.time_reported && response.score < 95 && response.score >= 70}
class:btn-outline-warning={!response.time_reported && response.score < 70 && response.score >= 45}
class:btn-outline-danger={!response.time_reported && response.score < 45}
class:btn-success={response.time_reported && response.score >= 95}
class:btn-info={response.time_reported && response.score < 95 && response.score >= 70}
class:btn-warning={response.time_reported && response.score < 70 && response.score >= 45}
class:btn-danger={response.time_reported && response.score < 45}
title="Signaler un problème avec la correction"
disabled={reportInProgress}
on:click={report}
>
{#if reportInProgress}
<div class="spinner-border spinner-border-sm" role="status"></div>
{:else if response.time_reported > response.time_scored}
<i class="bi bi-exclamation-octagon-fill"></i>
{:else}
<i class="bi bi-exclamation-octagon"></i>
{/if}
</button>
{:else if $user.is_admin && response.time_reported}
{#if response.time_reported > response.time_scored}
<i
class="float-end bi bi-exclamation-octagon-fill"
class:text-warning={response.score < 45}
class:text-danger={response.score >= 45}
></i>
{:else}
<i
class="float-end bi bi-exclamation-octagon"
class:text-warning={response.score < 45}
class:text-danger={response.score >= 45}
></i>
{/if}
{/if}
{#if response.score_explaination}
{response.score_explaination}
{:else if response.score === 100}

View file

@ -5,7 +5,7 @@ export class Response {
}
}
update({ id, id_question, id_user, value, time_submit, score, score_explaination, id_corrector, time_scored }) {
update({ id, id_question, id_user, value, time_submit, score, score_explaination, id_corrector, time_scored, time_reported }) {
this.id = id;
this.id_question = id_question;
this.id_user = id_user;
@ -15,6 +15,21 @@ export class Response {
this.score_explaination = score_explaination;
this.id_corrector = id_corrector;
this.time_scored = time_scored;
this.time_reported = time_reported;
}
async report(survey) {
const res = await fetch(`api/surveys/${survey.id}/responses/${this.id}/report`, {
method: 'POST',
headers: {'Accept': 'application/json'},
});
if (res.status == 200) {
const data = await res.json();
this.update(data);
return data;
} else {
throw new Error((await res.json()).errmsg);
}
}
async save() {

View file

@ -1,4 +1,5 @@
import { getQuestions } from './questions';
import { Response } from './response';
export class Survey {
constructor(res) {
@ -49,7 +50,7 @@ export class Survey {
headers: {'Accept': 'application/json'},
});
if (res.status == 200) {
return await res.json();
return (await res.json()).map((r) => new Response(r));
} else {
throw new Error((await res.json()).errmsg);
}

View file

@ -56,7 +56,7 @@
{:then responses}
<td>
{#if responses}
{responses.filter((r) => !r.time_scored).length} /
{responses.filter((r) => !r.time_scored || (r.time_reported && r.time_reported >= r.time_scored)).length} /
{responses.length}
{:else}
0