diff --git a/front/src/questionnaire.js b/front/src/questionnaire.js index 845ff10..09f1c6e 100644 --- a/front/src/questionnaire.js +++ b/front/src/questionnaire.js @@ -8,7 +8,7 @@ // Fichier de configuration tirés du backend : import { apiUrl, availableLangs, theme } from "../../config/instance.js"; const lang=availableLangs[0]; -import { getPreviousAnswers, getQuestionnaireRoutes, questionnaireRoutes, saveAnswersRoute } from "../../config/questionnaires.js"; +import { getPreviousAnswers, questionnaireRoutes, saveAnswersRoute } from "../../config/questionnaires.js"; const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); import { checkAnswerOuput, saveAnswer } from "./tools/answers.js"; @@ -20,7 +20,7 @@ import { dateFormat, replaceAll } from "../../tools/main"; import { checkSession, getTimeDifference } from "./tools/users.js"; // Dictionnaires : -const txt = require("../../lang/"+lang+"/general"); +const txtServerError = require("../../lang/"+lang+"/general").serverError; const txtAnswers = require("../../lang/"+lang+"/answer"); // Principaux éléments du DOM manipulés : @@ -37,34 +37,38 @@ const initialise = async () => try { btnShow.style.display="inline";// bouton caché si JS inactif, car JS nécessaire pour vérifier les réponses - isConnected=await checkSession(["user"]);// seuls les utilisateurs de base peuvent répondre aux quizs + isConnected=await checkSession(["user"]);// "user" car seuls les utilisateurs de base peuvent enregistrer leurs réponses aux quizs // Si l'utilisateur est connecté et a déjà répondu à ce quiz, on affiche ses précédentes réponses à la place du texte servant à expliquer le topo aux nouveaux if(isConnected) { user=getLocaly("user", true); - updateAccountLink(user.status, configTemplate); + updateAccountLink(user.status, configTemplate);// lien vers le compte adapté pour les utilisateurs connectés checkPreviousResponses(user); } } catch(e) { - addElement(divResponse, "p", txt.serverError, "", ["error"]); console.error(e); } } initialise(); helloDev(); -// Affichage du questionnaire quand l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url +// Affichage du questionnaire quand l'utilisateur clique sur le bouton ou si l'id du formulaire est passée par l'url. // Déclenche en même temps le chronomètre mesurant la durée de la réponse aux questions. const showQuestionnaire = () => { chronoBegin=Date.now(); myForm.style.display="block"; btnShow.style.display="none"; - window.location.hash="";// risque d'enchaîner les ancres si on recharge la page - const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview"... - window.location.assign(here+"questionnaire"); + const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview". + if(window.location.hash!=="") + { + window.location.hash="";// ! le "#" reste + window.location.assign(here+"questionnaire"); + } + else + window.location.assign(here+"#questionnaire"); } let chronoBegin=0; btnShow.addEventListener("click", function(e) @@ -76,12 +80,12 @@ btnShow.addEventListener("click", function(e) } catch(e) { - addElement(divResponse, "p", txt.serverError, "", ["error"]); + addElement(divResponse, "p", txtServerError, "", ["error"]); console.error(e); } }); // Lien passé par mail pour voir directement le quiz -if(location.hash!=undefined && location.hash==="#questionnaire") +if(location.hash!="" && location.hash==="#questionnaire") showQuestionnaire(); // Traitement de l'envoi de la réponse de l'utilisateur : @@ -91,19 +95,19 @@ myForm.addEventListener("submit", function(e) try { e.preventDefault(); - btnSubmit.style.display="none";// seulement un envoi à la fois :) + btnSubmit.style.display="none";// seulement un envoi à la fois, SVP :) divResponse.innerHTML="";// supprime les éventuels messages déjà affichés const userResponses=getDatasFromInputs(myForm); answer.duration=Math.round((Date.now()-chronoBegin)/1000); answer.nbQuestions=0; answer.nbCorrectAnswers=0; answer.QuestionnaireId=document.getElementById("questionnaireId").value; - // Les réponses sont regroupées par question, donc quand l'idQuestion change, on connaît le résultat pour la question précédente - // Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à une question et cocher aucune des mauvaises + // Les réponses sont regroupées par question, donc quand idQuestion change, on connaît le résultat pour la question précédente. + // Pour qu'une réponse soit bonne, il faut cocher toutes les bonnes réponses (si QCM) à la question ET cocher aucune des mauvaises. let idChoice, idQuestion="", goodResponse=false; for(let item in userResponses) { - if(item.startsWith("isCorrect_response_"))// = nouvelle réponse possible + if(item.startsWith("isCorrect_response_"))// = Nouvelle réponse possible. { idChoice = item.substring(item.lastIndexOf("_") + 1); // si on change de queston @@ -111,19 +115,19 @@ myForm.addEventListener("submit", function(e) { idQuestion=userResponses["question_id_response_"+idChoice]; answer.nbQuestions++; - if(goodResponse) // résultat pour la question précédente + if(goodResponse) // résultat de la question précédente answer.nbCorrectAnswers++; goodResponse=true;// réponse bonne jusqu'à la première erreur... } if(userResponses[item]=="true") { document.getElementById("response_"+idChoice).parentNode.classList.add("isCorrect"); - if(userResponses["response_"+idChoice]===undefined)// bonne réponse non sélectionnée + if(userResponses["response_"+idChoice]===undefined)// une bonne réponse n'a pas été sélectionnée goodResponse=false; } else { - if(userResponses["response_"+idChoice]==="on")// réponse cochée n'étant pas une des bonnes + if(userResponses["response_"+idChoice]==="on")// réponse cochée ne faisant pas partie des bonnes { goodResponse=false; document.getElementById("response_"+idChoice).parentNode.classList.add("isNotCorrect"); @@ -131,7 +135,7 @@ myForm.addEventListener("submit", function(e) } } } - // si j'ai bien répondu à la dernière question, il faut le traiter ici, car je suis sorti de la boucle : + // si j'ai bien répondu à la dernière question, il faut le compter ici, car je suis sorti de la boucle : if(goodResponse) answer.nbCorrectAnswers++; @@ -139,7 +143,7 @@ myForm.addEventListener("submit", function(e) let getOuput=checkAnswerOuput(answer); if(isConnected) { - // Si l'utilisateur est connecté on enregistre son résultat sur le serveur. + // Si l'utilisateur est connecté, on enregistre son résultat sur le serveur. const xhrSaveAnswer = new XMLHttpRequest(); xhrSaveAnswer.open("POST", apiUrl+questionnaireRoutes+saveAnswersRoute); xhrSaveAnswer.onreadystatechange = function() @@ -159,25 +163,25 @@ myForm.addEventListener("submit", function(e) } xhrSaveAnswer.setRequestHeader("Authorization", "Bearer "+user.token); xhrSaveAnswer.setRequestHeader("Content-Type", "application/json"); - answer.timeDifference=getTimeDifference();// on en profite pour mettre les pendules à l'heure + answer.timeDifference=getTimeDifference();// on en profite pour mettre les pendules à l'heure. xhrSaveAnswer.send(JSON.stringify(answer)); } else - { // si pas connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion + { // si pas connecté, on enregistre le résultat côté client pour permettre de le retrouver au moment de la création du compte ou de la connexion. if(saveAnswer(answer)) { getOuput+="

"+txtAnswers.wantToSaveResponses; addElement(divResponse, "p", getOuput, "", ["info"]); - document.querySelector(".subcribeBtns").style.display="block"; + document.querySelector(".subscribeBtns").style.display="block"; } - else // pas la peine de proposer de créer un compte si le stockage local ne fonctionne pas + else // inutile de proposer de créer un compte si le stockage local ne fonctionne pas addElement(divResponse, "p", getOuput, "", ["info"]); // on redirige vers le résultat window.location.hash=""; const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview"... window.location.assign(here+"response"); } - // affichage des textes d'explications pour chaque question + // + affichage des textes d'explications pour chaque question const explanations=document.querySelectorAll(".help"); for(let i in explanations) { @@ -187,7 +191,7 @@ myForm.addEventListener("submit", function(e) } catch(e) { - addElement(divResponse, "p", txt.serverError, "", ["error"]); + addElement(divResponse, "p", txtServerError, "", ["error"]); console.error(e); } }) @@ -213,12 +217,12 @@ const checkPreviousResponses = (user) => let totNbQuestions=0, totNbCorrectAnswers=0, totDuration=0, mapLineContent; for(let i in response) { - totNbQuestions+=response[i].nbQuestions; + totNbQuestions+=response[i].nbQuestions;// ! on ne peut se baser sur la version actuelle du quiz, car le nombre de questions a pu évoluer. totNbCorrectAnswers+=response[i].nbCorrectAnswers; totDuration+=response[i].duration; mapLineContent = { - DATEANSWER : dateFormat(response[i].createdAt),// revoir problème de la langue + DATEANSWER : dateFormat(response[i].createdAt, lang), NBCORRECTANSWERS : response[i].nbCorrectAnswers, AVGDURATION : response[i].duration }; @@ -233,10 +237,8 @@ const checkPreviousResponses = (user) => addElement(explanationsContent, "ul", previousAnswersContent); } else - addElement(explanationsContent, "ul", txtAnswers.noPreviousAnswer.replace("#NOM", user.name)); + addElement(explanationsContent, "ul", txtAnswers.noPreviousAnswer); } - //else - // addElement(divResponse, "p", txt.serverError, "", ["error"]); // pas forcément utile de prévenir du bug ici ? } } xhrPreviousRes.setRequestHeader("Authorization", "Bearer "+user.token); diff --git a/front/src/tools/everywhere.js b/front/src/tools/everywhere.js index 2808a74..4f9cd29 100644 --- a/front/src/tools/everywhere.js +++ b/front/src/tools/everywhere.js @@ -2,7 +2,7 @@ export const helloDev = () => { - console.log("**** Hello ami développeur :-)\n Le code de WikiLerni est libre et vous pouvez le trouver si Gitlab :\n\nhttps://gitlab.com/lefablab/wikilerni\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); + console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver si Gitlab :\nhttps://gitlab.com/lefablab/wikilerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****"); return true; } diff --git a/lang/fr/answer.js b/lang/fr/answer.js index fd33c2d..d7bfc05 100644 --- a/lang/fr/answer.js +++ b/lang/fr/answer.js @@ -10,9 +10,9 @@ module.exports = needMaxNumberCorrectResponses : "Le nombre de réponses correctes ne peut être supérieur au nombre de questions.", needIntegerNumberSecondesResponse : "La durée de la réponse doit être un nombre entier de secondes.", needMinNumberSecondesResponse : "La durée de la réponse ne peut être négative.", - checkResponsesOuputFail : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est certain, vous ferez mieux la prochaine fois !", - checkResponsesOuputMedium : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. C'est pas mal du tout !", - checkResponsesOuputSuccess : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS. Bravo ! Rien ne vous échappe !", + checkResponsesOuputFail : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est certain, vous ferez mieux la prochaine fois !", + checkResponsesOuputMedium : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. C'est pas mal du tout !", + checkResponsesOuputSuccess : "Vous avez répondu en DURATION secondes et avez NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions. Bravo ! Rien ne vous échappe !", wantToSaveResponses: "Si vous le souhaitez, vous pouvez sauvegarder votre résultat en vous connectant à votre compte.", responseSavedMessage : "Votre résultat a été enregistré. Accèder à tous vos quizs.", responseSavedError : "Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.", @@ -22,5 +22,5 @@ module.exports = previousAnswersTitle: "Bonjour #NOM, voici vos précédents résultats à ce quiz", previousAnswersStats: "En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.", previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions en AVGDURATION secondes.", - noPreviousAnswer: "Bonjour #NOM, c'est la première fois que vous répondez à ce quiz. Bonne lecture !" + noPreviousAnswer: "On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !" };