diff --git a/front/public/JS/group.app.js b/front/public/JS/group.app.js
deleted file mode 100644
index 6cb2414..0000000
--- a/front/public/JS/group.app.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(){var e={6028:function(e,t,s){const n=s(671),i=s(4988);e.exports={apiUrl:"http://localhost:3000/api",siteUrl:"http://localhost:8080",siteUrlProd:"https://www.wikilerni.com",adminName:"Fab",adminEmail:"dev@wikilerni.com",senderName:"WikiLerni",senderEmail:"bonjour@wikilerni.com",adminLang:"fr",theme:"wikilerni",availableLangs:["fr"],siteName:"WikiLerni",beginCodeGodfather:"WL",defaultReceiptDays:"147",cronTimingAlertInSeconde:120,responseTimingAlertInSeconde:3,tokenSignupValidationTimeInHours:"48h",tokenLoginLinkTimeInHours:"1h",tokenConnexionMinTimeInHours:"24h",tokenConnexionMaxTimeInDays:"180 days",tokenLoginChangingTimeInHours:"1h",tokenDeleteUserTimeInHours:"1h",tokenUnsubscribeLinkTimeInDays:"7 days",freeAccountTimingInDays:0,freeAccountExpirationNotificationInDays:3,accountExpirationFirstNotificationInDays:10,accountExpirationSecondNotificationInDays:3,inactiveAccountTimeToDeleteInDays:180,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbNewQuestionnaires:12,hourGiveNewQuestionnaireBegin:3,hourGiveNewQuestionnaireEnd:8,maxQuestionnaireSendedAtSameTime:50,minSearchQuestionnaires:3,fieldNewQuestionnaires:"publishingAt",nbQuestionnairesByGroupMin:1,nbQuestionnairesByGroupMax:0,nbIllustrationsMin:1,nbIllustrationsMax:1,maxIllustrationSizeinOctet:1e6,mimeTypesForIllustration:["image/jpg","image/jpeg","image/png","image/gif","image/png"],illustrationsWidthMaxInPx:500,illustrationsMiniaturesWidthMaxInPx:200,nbLinksMin:1,nbLinksMax:0,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,passwordMinLength:n.password.minlength,dirCacheUsers:n.dirCacheUsers,dirCacheUsersAnswers:n.dirCacheUsersAnswers,dirCacheQuestionnaires:i.dirCacheQuestionnaires,dirCacheQuestions:i.dirCacheQuestions,dirCacheUsersQuestionnaires:i.dirCacheUsersQuestionnaires,dirHTMLQuestionnaires:i.dirHTMLQuestionnaires,dirWebQuestionnaires:i.dirWebQuestionnaires}},45:function(e){e.exports={matomo:{url:"https://stats.le-fab-lab.com/",siteId:"5"}}},4988:function(e){e.exports={questionnaireRoutes:"/questionnaire",getListNextQuestionnaires:"/getlistnextquestionnaires/",getQuestionnaireRoutes:"/get",getRandomQuestionnairesRoute:"/getrandom",getStatsQuestionnaires:"/stats/",previewQuestionnaireRoutes:"/preview",publishedQuestionnaireRoutes:"/quiz/",regenerateHTML:"/htmlregenerated",searchAdminQuestionnairesRoute:"/searchadmin",searchQuestionnairesRoute:"/search",groupRoutes:"/group",getGroupRoute:"/get/",previewGroupRoutes:"/preview",searchGroupsRoute:"/search",questionsRoute:"/question/",tagsSearchRoute:"/tags/search/",getAdminStats:"/getadminstats/",getPreviousAnswers:"/user/answers/",getStatsAnswers:"/user/anwswers/stats/",saveAnswersRoute:"/answer/",Questionnaire:{title:{maxlength:255,required:!0},slug:{maxlength:150},introduction:{required:!0}},searchQuestionnaires:{minlength:3,required:!0},Group:{title:{maxlength:255,required:!0},slug:{maxlength:150}},Question:{text:{maxlength:255,required:!0},rank:{required:!0,min:1,defaultValue:1}},Choice:{text:{maxlength:255,required:!0}},search:{minlength:3,required:!0},searchGroups:{minlength:3,required:!0},dirCacheGroups:"datas/questionnaires/groups",dirCacheQuestionnaires:"datas/questionnaires",dirCacheQuestions:"datas/questionnaires/questions",dirCacheTags:"datas/questionnaires/tags",dirCacheUsersQuestionnaires:"datas/users/questionnaires",dirHTMLGroups:"front/public/quiz/gp",dirHTMLQuestionnaires:"front/public/quiz",dirHTMLNews:"front/public/quizs",dirHTMLTags:"front/public/quizs",dirWebGroups:"quiz/gp",dirWebQuestionnaires:"quiz",dirWebNews:"quizs/",dirWebTags:"quizs/",nbRandomResults:3,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbTagsMin:0,nbTagsMax:0}},671:function(e){e.exports={userRoutes:"/user",checkDeleteLinkRoute:"/confirmdelete/",checkIfIsEmailfreeRoute:"/isemailfree",checkLoginRoute:"/checklogin/",checkNewLoginLinkRoute:"/confirmnewlogin/",checkSubscribeTokenRoute:"/validation/",connectionRoute:"/login",connectionWithLinkRoute:"/checkloginlink",createUserRoute:"/create",getAdminStats:"/getadminstats/",getGodChilds:"/getgodchilds/",getGodfatherRoute:"/getgodfatherid",getLoginLinkRoute:"/getloginlink",getPayments:"/payment/getforoneuser/",getUserInfos:"/get/",getUsersQuestionnairesRoute:"/getusersquestionnaires/",searchUserRoute:"/search/",signupCompletionRoute:"/signupcompletion/",subscribeRoute:"/signup",unsubscribeRoute:"/subscription/stop/",updateUserInfos:"/modify/",validateUserRoute:"/validate/",name:{maxlength:70,required:!0},email:{maxlength:255,required:!0},password:{minlength:8,maxlength:72,required:!0},newPassword:{minlength:8,maxlength:72},codeGodfather:{maxlength:255},cguOk:{value:"true",required:!0},search:{minlength:1,required:!0},timeDifferenceMin:-720,timeDifferenceMax:840,dirCacheUsers:"datas/users",dirCacheUsersAnswers:"datas/users/questionnaires/answers",dirCacheUsersWithoutAnswers:"datas/users/questionnaires/without"}},6369:function(e){e.exports={apiUrl:"http://localhost:3000/api",usersGetConfigUrl:"/user/getconfig",lang:"fr",userHomePage:"accueil.html",adminHomePage:"admin.html",managerHomePage:"gestion.html",subscribePage:"inscription.html",connectionPage:"connexion.html",accountPage:"compte.html",questionnairesManagementPage:"gestion-quizs.html",usersManagementPage:"gestion-utilisateurs.html",nbQuestionnairesUserHomePage:10,illustrationDir:"/img/quizs/"}},7194:function(e){e.exports={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 !",needIntegerNumberCorrectResponses:"Le nombre de réponses correctes doit être un nombre entier.",needIntegerNumberSecondesResponse:"La durée de la réponse doit être un nombre entier de secondes.",needIntegerNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.",needMaxNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.",needMinNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.",needNumberCorrectResponses:"Le nombre de réponses correctes doit être fourni.",needNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.",needMaxNumberCorrectResponses:"Le nombre de réponses correctes ne peut être supérieur au nombre de questions.",needMinNumberCorrectResponses:"Le nombre de réponses correctes ne peut être négatif.",needMinNumberSecondesResponse:"La durée de la réponse ne peut être négative.",noPreviousAnswer:"On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !",previousAnswersLine:"Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions sur NBQUESTIONS en AVGDURATION secondes.",previousAnswersStats:"En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.",previousAnswersTitle:"Bonjour #NOM, voici vos précédents résultats à ce quiz",responseSavedError:"Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.",responseSavedMessage:"Votre résultat a été enregistré. Accèder à tous vos quizs.",statsUser:"Vous avez enregistré NBANSWERS réponseS1 à NBQUESTIONNAIRES quizS2 différentS3 sur les NBTOTQUESTIONNAIRES proposéS4 par le site. Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement. Avec WikiLerni, vous pouvez toujours apprendre quelque chose de nouveau Le principe est simple : vous commencez par lire l’article Wikipédia dont le lien vous est proposé. Puis vous afficher le quiz pour vérifier ce que vous avez retenu de votre lecture. Suivant les questions, une ou plusieurs réponses peuvent être correctes et doivent donc être cochées. C’est toujours le contenu de l’article Wikipédia qui fait foi concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas à me signaler une erreur. WikiLerni vous propose d’autres solutions pour améliorer votre culture générale. Pour en savoir plus, cliquez sur le bouton ci-dessous. WikiLerni vous propose de découvrir de courts articles lisibles en quelques minutes et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.). Ces articles sont basés sur une ou plusieurs pages de Wikipédia (fournies en lien), dont ils extraient certaines informations. Chaque série d’articles est suivie d’un quiz permettant de tester ce que vous en avez retenu. Vous apprenez ainsi régulièrement de nouvelles choses très simplement.
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.",wantToSaveResponses:'Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte ci-dessous. Cela vous permettra aussi de recevoir régulièrement de nouvelles "graines de culture" directement sur votre e-mail.'}},223:function(e){e.exports={addBtnTxt:"Ajouter",addOkMessage:"Les données ont bien été enregistrées.",alertNewWindow:"nouvelle fenêtre",badUrl:"Tentative d'accès à une page n'existant pas :",btnLinkToQuestionnaire:"Afficher !",btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnShowOnWebSite:"Lire la suite sur #SITE_NAME",deleteBtnTxt:"Supprimer",deleteFailMessage:"La suppression de l'enregistrement #ID a échoué.",deleteOkMessage:"La suppression a bien été enregistrée.",failAuth:"Erreur d'authentification.",failAuthCron:"Tentative de lancement d'un cron sans le bon token.",failAuthHeader:"Absence de header Authorization.",failAuthId:"Identifiant non valide : ",failAuthToken:"Token invalide ou utilisateur non trouvé.",neededParams:"Des paramètres nécessaires manquants sont manquants.",nextPage:"Page suivante",notAllowed:"Vous n'avez pas les droits nécessaires pour cette action.",notRequired:"Facultatif.",notValidFormat:"Format non valide.",previousPage:"Page précédente",serverError:"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",serverErrorAdmin:"Bug de l'application :",siteHTMLTitle:"WikiLerni : la culture générale en liberté",siteMetaDescription:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",scriptTimingAlert:"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",scriptTimingInfo:"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",statsAdmin:"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},9864:function(e){class t{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return t.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,t){return(e+="").length>t&&(e=e.substring(0,t-3)+"…"),e}static replaceAll(e,t){const s=new RegExp(Object.keys(t).join("|"),"gi");return e.replace(s,(e=>t[e]))}static getRandomInt(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e))+e}static dateFormat(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(t.isEmpty(e))return"";let n=new Date(e),i=n.getDate()+"";1===i.length&&(i="0"+i);let r=n.getMonth()+1+"";1===r.length&&(r="0"+r);let o=n.getFullYear();return"fr"===s?i+"/"+r+"/"+o:"form"===s?o+"-"+r+"-"+i:r+"/"+i+"/"+o}static getPassword(e,t){const s=e+Math.floor(Math.random()*(t-e)),n="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",i="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=n[Math.floor(Math.random()*n.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};var o=s(45);const a=()=>{var e=window._paq=window._paq||[];e.push([function(){var e,t,s;this.setVisitorCookieTimeout((e=new Date,t=Math.round(e.getTime()/1e3),s=this.getVisitorInfo(),parseInt(s[2])+33696e3-t))}]),e.push(["trackPageView"]),e.push(["enableLinkTracking"]),function(){var t=o.matomo.url;e.push(["setTrackerUrl",t+"matomo.php"]),e.push(["setSiteId",o.matomo.siteId]);var s=document,n=s.createElement("script"),i=s.getElementsByTagName("script")[0];n.type="text/javascript",n.async=!0,n.src=t+"matomo.js",i.parentNode.insertBefore(n,i)}()};s(671);const u=e.availableLangs[0],l=(s(9729)("./"+e.theme+"/config/"+u+".js"),e.availableLangs[0]),{noPreviousAnswer:c,previousAnswersLine:d,previousAnswersStats:p,previousAnswersTitle:m,responseSavedError:h,wantToSaveResponses:g}=(s(9729)("./"+e.theme+"/config/"+l+".js"),s(9274)("./"+l+"/answer")),{serverError:b}=s(2111)("./"+l+"/general"),v=document.getElementById("checkResponses"),f=document.getElementById("response"),L=(document.getElementById("explanationsTitle"),document.getElementById("explanationsContent"),document.getElementById("group"));let T=0;(async()=>{try{T=Date.now(),v.style.display="block",a()}catch(e){console.error(e)}})(),console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");let k={};L.addEventListener("submit",(function(e){try{e.preventDefault(),v.style.display="none",f.innerHTML="";const s=(e=>{const t={},s=new FormData(e);for(let e of s.entries())t[e[0]]=e[1];return t})(L);k.duration=Math.round((Date.now()-T)/1e3),k.nbQuestions=0,k.nbCorrectAnswers=0,k.GroupId=document.getElementById("groupId").value;let n,o="",a=!1;for(let e in s)e.startsWith("isCorrect_response_")&&(n=e.substring(e.lastIndexOf("_")+1),s["question_id_response_"+n]!=o&&(o=s["question_id_response_"+n],k.nbQuestions++,a&&k.nbCorrectAnswers++,a=!0),"true"==s[e]?(document.getElementById("response_"+n).parentNode.classList.add("isCorrect"),void 0===s["response_"+n]&&(a=!1)):"on"===s["response_"+n]&&(a=!1,document.getElementById("response_"+n).parentNode.classList.add("isNotCorrect")));a&&k.nbCorrectAnswers++;let u=(e=>{if((0,t.isEmpty)(e.duration)||(0,t.isEmpty)(e.nbCorrectAnswers)||(0,t.isEmpty)(e.nbQuestions))return"";{const s=e.nbCorrectAnswers/e.nbQuestions,n={DURATION:e.duration,NBCORRECTANSWERS:e.nbCorrectAnswers,NBQUESTIONS:e.nbQuestions};let r="";return r=s<.4?(0,t.replaceAll)(i.checkResponsesOuputFail,n):s<.8?(0,t.replaceAll)(i.checkResponsesOuputMedium,n):(0,t.replaceAll)(i.checkResponsesOuputSuccess,n),r||""}})(k);r(f,"p",u,"",["success"]),window.location.hash="",window.location,window.location.hash="response";const l=document.querySelectorAll(".help");for(let e in l)void 0!==l[e].style&&(l[e].style.display="block")}catch(e){r(f,"p",b,"",["error"]),console.error(e)}}))}()}();
\ No newline at end of file
diff --git a/front/public/JS/questionnaire.app.js b/front/public/JS/questionnaire.app.js
deleted file mode 100644
index 2b601cb..0000000
--- a/front/public/JS/questionnaire.app.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(){var e={6028:function(e,t,n){const s=n(671),i=n(4988);e.exports={apiUrl:"http://localhost:3000/api",siteUrl:"http://localhost:8080",siteUrlProd:"https://www.wikilerni.com",adminName:"Fab",adminEmail:"dev@wikilerni.com",senderName:"WikiLerni",senderEmail:"bonjour@wikilerni.com",adminLang:"fr",theme:"wikilerni",availableLangs:["fr"],siteName:"WikiLerni",beginCodeGodfather:"WL",defaultReceiptDays:"147",cronTimingAlertInSeconde:120,responseTimingAlertInSeconde:3,tokenSignupValidationTimeInHours:"48h",tokenLoginLinkTimeInHours:"1h",tokenConnexionMinTimeInHours:"24h",tokenConnexionMaxTimeInDays:"180 days",tokenLoginChangingTimeInHours:"1h",tokenDeleteUserTimeInHours:"1h",tokenUnsubscribeLinkTimeInDays:"7 days",freeAccountTimingInDays:0,freeAccountExpirationNotificationInDays:3,accountExpirationFirstNotificationInDays:10,accountExpirationSecondNotificationInDays:3,inactiveAccountTimeToDeleteInDays:180,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbNewQuestionnaires:12,hourGiveNewQuestionnaireBegin:3,hourGiveNewQuestionnaireEnd:8,maxQuestionnaireSendedAtSameTime:50,minSearchQuestionnaires:3,fieldNewQuestionnaires:"publishingAt",nbQuestionnairesByGroupMin:1,nbQuestionnairesByGroupMax:0,nbIllustrationsMin:1,nbIllustrationsMax:1,maxIllustrationSizeinOctet:1e6,mimeTypesForIllustration:["image/jpg","image/jpeg","image/png","image/gif","image/png"],illustrationsWidthMaxInPx:500,illustrationsMiniaturesWidthMaxInPx:200,nbLinksMin:1,nbLinksMax:0,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,passwordMinLength:s.password.minlength,dirCacheUsers:s.dirCacheUsers,dirCacheUsersAnswers:s.dirCacheUsersAnswers,dirCacheQuestionnaires:i.dirCacheQuestionnaires,dirCacheQuestions:i.dirCacheQuestions,dirCacheUsersQuestionnaires:i.dirCacheUsersQuestionnaires,dirHTMLQuestionnaires:i.dirHTMLQuestionnaires,dirWebQuestionnaires:i.dirWebQuestionnaires}},45:function(e){e.exports={matomo:{url:"https://stats.le-fab-lab.com/",siteId:"5"}}},4988:function(e){e.exports={questionnaireRoutes:"/questionnaire",getListNextQuestionnaires:"/getlistnextquestionnaires/",getQuestionnaireRoutes:"/get",getRandomQuestionnairesRoute:"/getrandom",getStatsQuestionnaires:"/stats/",previewQuestionnaireRoutes:"/preview",publishedQuestionnaireRoutes:"/quiz/",regenerateHTML:"/htmlregenerated",searchAdminQuestionnairesRoute:"/searchadmin",searchQuestionnairesRoute:"/search",groupRoutes:"/group",getGroupRoute:"/get/",previewGroupRoutes:"/preview",searchGroupsRoute:"/search",questionsRoute:"/question/",tagsSearchRoute:"/tags/search/",getAdminStats:"/getadminstats/",getPreviousAnswers:"/user/answers/",getStatsAnswers:"/user/anwswers/stats/",saveAnswersRoute:"/answer/",Questionnaire:{title:{maxlength:255,required:!0},slug:{maxlength:150},introduction:{required:!0}},searchQuestionnaires:{minlength:3,required:!0},Group:{title:{maxlength:255,required:!0},slug:{maxlength:150}},Question:{text:{maxlength:255,required:!0},rank:{required:!0,min:1,defaultValue:1}},Choice:{text:{maxlength:255,required:!0}},search:{minlength:3,required:!0},searchGroups:{minlength:3,required:!0},dirCacheGroups:"datas/questionnaires/groups",dirCacheQuestionnaires:"datas/questionnaires",dirCacheQuestions:"datas/questionnaires/questions",dirCacheTags:"datas/questionnaires/tags",dirCacheUsersQuestionnaires:"datas/users/questionnaires",dirHTMLGroups:"front/public/quiz/gp",dirHTMLQuestionnaires:"front/public/quiz",dirHTMLNews:"front/public/quizs",dirHTMLTags:"front/public/quizs",dirWebGroups:"quiz/gp",dirWebQuestionnaires:"quiz",dirWebNews:"quizs/",dirWebTags:"quizs/",nbRandomResults:3,nbQuestionsMin:1,nbQuestionsMax:0,nbChoicesMax:10,nbTagsMin:0,nbTagsMax:0}},671:function(e){e.exports={userRoutes:"/user",checkDeleteLinkRoute:"/confirmdelete/",checkIfIsEmailfreeRoute:"/isemailfree",checkLoginRoute:"/checklogin/",checkNewLoginLinkRoute:"/confirmnewlogin/",checkSubscribeTokenRoute:"/validation/",connectionRoute:"/login",connectionWithLinkRoute:"/checkloginlink",createUserRoute:"/create",getAdminStats:"/getadminstats/",getGodChilds:"/getgodchilds/",getGodfatherRoute:"/getgodfatherid",getLoginLinkRoute:"/getloginlink",getPayments:"/payment/getforoneuser/",getUserInfos:"/get/",getUsersQuestionnairesRoute:"/getusersquestionnaires/",searchUserRoute:"/search/",signupCompletionRoute:"/signupcompletion/",subscribeRoute:"/signup",unsubscribeRoute:"/subscription/stop/",updateUserInfos:"/modify/",validateUserRoute:"/validate/",name:{maxlength:70,required:!0},email:{maxlength:255,required:!0},password:{minlength:8,maxlength:72,required:!0},newPassword:{minlength:8,maxlength:72},codeGodfather:{maxlength:255},cguOk:{value:"true",required:!0},search:{minlength:1,required:!0},timeDifferenceMin:-720,timeDifferenceMax:840,dirCacheUsers:"datas/users",dirCacheUsersAnswers:"datas/users/questionnaires/answers",dirCacheUsersWithoutAnswers:"datas/users/questionnaires/without"}},6369:function(e){e.exports={apiUrl:"http://localhost:3000/api",usersGetConfigUrl:"/user/getconfig",lang:"fr",userHomePage:"accueil.html",adminHomePage:"admin.html",managerHomePage:"gestion.html",subscribePage:"inscription.html",connectionPage:"connexion.html",accountPage:"compte.html",questionnairesManagementPage:"gestion-quizs.html",usersManagementPage:"gestion-utilisateurs.html",nbQuestionnairesUserHomePage:10,illustrationDir:"/img/quizs/"}},7194:function(e){e.exports={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 !",needIntegerNumberCorrectResponses:"Le nombre de réponses correctes doit être un nombre entier.",needIntegerNumberSecondesResponse:"La durée de la réponse doit être un nombre entier de secondes.",needIntegerNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.",needMaxNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être aussi élevé.",needMinNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu ne peut être inférieur à 1.",needNumberCorrectResponses:"Le nombre de réponses correctes doit être fourni.",needNumberUserResponses:"Le nombre de questions auxquelles l'utilisateur a répondu doit être fourni.",needMaxNumberCorrectResponses:"Le nombre de réponses correctes ne peut être supérieur au nombre de questions.",needMinNumberCorrectResponses:"Le nombre de réponses correctes ne peut être négatif.",needMinNumberSecondesResponse:"La durée de la réponse ne peut être négative.",noPreviousAnswer:"On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !",previousAnswersLine:"Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions sur NBQUESTIONS en AVGDURATION secondes.",previousAnswersStats:"En moyenne, vous avez répondu à ce quiz en AVGDURATION secondes, en ayant AVGCORRECTANSWERS % de bonnes réponses.",previousAnswersTitle:"Bonjour #NOM, voici vos précédents résultats à ce quiz",responseSavedError:"Cependant une erreur a été rencontrée durant l'enregistrement de votre résultat. Accèder à tous vos quizs.",responseSavedMessage:"Votre résultat a été enregistré. Accèder à tous vos quizs.",statsUser:"Vous avez enregistré NBANSWERS réponseS1 à NBQUESTIONNAIRES quizS2 différentS3 sur les NBTOTQUESTIONNAIRES proposéS4 par le site.
En moyenne, vous avez mis AVGDURATION secondes à répondre et avez correctement répondu à AVGCORRECTANSWERS % des questions.",wantToSaveResponses:'Si vous le souhaitez, vous pouvez sauvegarder votre résultat en créant votre compte ci-dessous. Cela vous permettra aussi de recevoir régulièrement de nouvelles "graines de culture" directement sur votre e-mail.'}},223:function(e){e.exports={addBtnTxt:"Ajouter",addOkMessage:"Les données ont bien été enregistrées.",alertNewWindow:"nouvelle fenêtre",badUrl:"Tentative d'accès à une page n'existant pas :",btnLinkToQuestionnaire:"Afficher !",btnProposeConnection:"Je me connecte.",btnProposeSubscribe:"Je crée mon compte.",btnShowOnWebSite:"Lire la suite sur #SITE_NAME",deleteBtnTxt:"Supprimer",deleteFailMessage:"La suppression de l'enregistrement #ID a échoué.",deleteOkMessage:"La suppression a bien été enregistrée.",failAuth:"Erreur d'authentification.",failAuthCron:"Tentative de lancement d'un cron sans le bon token.",failAuthHeader:"Absence de header Authorization.",failAuthId:"Identifiant non valide : ",failAuthToken:"Token invalide ou utilisateur non trouvé.",neededParams:"Des paramètres nécessaires manquants sont manquants.",nextPage:"Page suivante",notAllowed:"Vous n'avez pas les droits nécessaires pour cette action.",notRequired:"Facultatif.",notValidFormat:"Format non valide.",previousPage:"Page précédente",serverError:"Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",serverErrorAdmin:"Bug de l'application :",siteHTMLTitle:"WikiLerni : la culture générale en liberté",siteMetaDescription:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",scriptTimingAlert:"*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",scriptTimingInfo:"Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",statsAdmin:"Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.
En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.
Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",subscriptionCall:"Inscrivez-vous !",updateBtnTxt:"Modifier",updateOkMessage:"La mise à jour à jour a bien été enregistrée."}},9864:function(e){class t{static isEmpty(e){return null==e||""===(e+="").trim()}static trimIfNotNull(e){return t.isEmpty(e)?null:(e+="").trim()}static shortenIfLongerThan(e,t){return(e+="").length>t&&(e=e.substring(0,t-3)+"…"),e}static replaceAll(e,t){const n=new RegExp(Object.keys(t).join("|"),"gi");return e.replace(n,(e=>t[e]))}static getRandomInt(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e))+e}static dateFormat(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fr";if(t.isEmpty(e))return"";let s=new Date(e),i=s.getDate()+"";1===i.length&&(i="0"+i);let r=s.getMonth()+1+"";1===r.length&&(r="0"+r);let o=s.getFullYear();return"fr"===n?i+"/"+r+"/"+o:"form"===n?o+"-"+r+"-"+i:r+"/"+i+"/"+o}static getPassword(e,t){const n=e+Math.floor(Math.random()*(t-e)),s="ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz",i="123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";let r=s[Math.floor(Math.random()*s.length)];for(let e=1;e
De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre "jardin".',homeTitle2:"La culture en liberté",homeP2:'Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.
Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.
Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.
Vous pouvez venir y "cultiver votre jardin" en toute tranquillité.
(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.',newQuestionnairesTitle:"Les derniers quizs publiés sur WikiLerni",newQuestionnairesIntro:"Liste des derniers quizs publiés sur WikiLerni.",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.
Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.
Toutes les réponses se trouvent dans l'article proposé à la lecture. Vous êtes ici pour apprendre de nouvelles choses, mais libre à vous d'essayer d'y répondre immédiatement.
Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)
Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.
Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.
Mais la création de ce compte est facultative et vous pouvez parcourir WikiLerni librement.",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",tagsListTxt:"Parcourir les rubriques :"}},4326:function(e){e.exports={headLinks:[{anchor:"Contact",attributes:{href:"/contact.html",rel:"nofollow"}},{anchor:"Parcourir",attributes:{href:"/quizs/",id:"indexHeadLink",title:"Les dernières publications"}},{anchor:"À propos",attributes:{href:"/a-propos.html",title:"En savoir + sur WikiLerni"}},{anchor:"Accueil",attributes:{href:"/",title:"Page d'accueil"}}],footLinks:[{anchor:"Blog",attributes:{href:"https://diaspora-fr.org/people/815767c0c09e0139ec6f32a01d0dfba2",title:"Le blog WikiLerni sur diaspora*"}},{anchor:"Crédits",attributes:{href:"/credits.html",title:"Qui a créé WikiLerni ? Quels sont vos droits ?"}},{anchor:"Mentions légales",attributes:{href:"/mentions-legales.html",rel:"nofollow"}},{anchor:"Données personnelles",attributes:{href:"/donnees.html",title:"Vos données personnelles sur WikiLerni"}},{anchor:"CGV & CGU",attributes:{href:"/CGV-CGU.html",rel:"nofollow"}}],accountPage:"compte.html",aboutPage:"a-propos.html",adminHomePage:"admin.html",cguPage:"CGV-CGU.html",connectionPage:"connexion.html",deleteLinkPage:"aurevoir.html?t=",loginLinkPage:"login.html?t=",managerHomePage:"gestion.html",newLoginLinkPage:"newlogin.html?t=",questionnairesManagementPage:"gestion-quizs.html",stopMailPage:"stop-mail.html?t=",subscribePage:"inscription.html",updateAccountPage:"compte.html",userHomePage:"accueil.html",userHomePageTxt:"Ma page d'accueil.",usersManagementPage:"gestion-utilisateurs.html",validationLinkPage:"validation.html?t=",siteSlogan:"Cultivons notre jardin !",noJSNotification:"Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",mailRecipientTxt:"Message envoyé à :",licenceTxt:'@copyleft Le contenu de WikiLerni est libre et vous est offert sans publicité. Vous pouvez participer à son financement en cliquant ici.',homePageTxt:"Page d'accueil",homeTitle1:"De nature curieuse ?",homeP1:"Avec WikiLerni, vous apprenez régulièrement de nouvelles choses.
Vous découvrez de courts articles, lisibles en quelques minutes.
Des quizs vous permettent ensuite de tester ce que vous avez retenu.
De jour en jour de nouvelles graines de culture sont ainsi semées dans votre jardin.",homeTitle2:"La culture générale en liberté",homeP2:'Pas de faits alternatifs, tous les contenus sont sourcés par des articles Wikipédia.
Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni sont partagés sous licences libres.
Le tout sans publicité, ni commercialisation de vos données.
Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.',homeBtnAboutTxt:"En savoir plus sur WikiLerni ?",homeBtnSubscribeTxt:"Testez WikiLerni",homeSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",newQuestionnairesTitle:"Culture générale - apprenez de nouvelles choses avec WikiLerni",newQuestionnairesIntro:"WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",newsListTitle:"
Si dessous les dernières publications. Vous pouvez aussi parcourir le site par thèmes ou mots-clés.Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)
Aristote : « L’homme a naturellement la passion de connaître… »
",answersExplanationsLinkText:"Relire",quizElementLinksIntro:"En savoir plus",quizElementSubcriptionFormTitle:"Recevez les prochains articles WikiLerni",explanationTitle:"Vous découvrez WikiLerni ?",explanationTxt:"
")),a&&(e.innerHTML=""),e.appendChild(u)}};var o=n(45);const a=()=>{var e=window._paq=window._paq||[];e.push([function(){var e,t,n;this.setVisitorCookieTimeout((e=new Date,t=Math.round(e.getTime()/1e3),n=this.getVisitorInfo(),parseInt(n[2])+33696e3-t))}]),e.push(["trackPageView"]),e.push(["enableLinkTracking"]),function(){var t=o.matomo.url;e.push(["setTrackerUrl",t+"matomo.php"]),e.push(["setSiteId",o.matomo.siteId]);var n=document,s=n.createElement("script"),i=n.getElementsByTagName("script")[0];s.type="text/javascript",s.async=!0,s.src=t+"matomo.js",i.parentNode.insertBefore(s,i)}()};n(671);const u=e.availableLangs[0],l=(n(9729)("./"+e.theme+"/config/"+u+".js"),e.availableLangs[0]),{noPreviousAnswer:c,previousAnswersLine:d,previousAnswersStats:p,previousAnswersTitle:m,responseSavedError:h,wantToSaveResponses:g}=(n(9729)("./"+e.theme+"/config/"+l+".js"),n(9274)("./"+l+"/answer")),{serverError:b}=n(2111)("./"+l+"/general"),v=document.getElementById("questionnaire"),f=document.getElementById("response"),L=document.getElementById("showQuestionnaire"),q=document.getElementById("checkResponses");document.getElementById("explanationsTitle"),document.getElementById("explanationsContent"),(async()=>{try{L.style.display="inline",a()}catch(e){console.error(e)}})(),console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver à cette adresse :\nhttps://forge.chapril.org/Fab_Blab/WikiLerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");const T=()=>{k=Date.now(),v.style.display="block",L.style.display="none";const e=window.location;""!==window.location.hash?(window.location.hash="",window.location.assign(e+"questionnaire")):window.location.assign(e+"#questionnaire")};let k=0;L.addEventListener("click",(function(e){try{e.preventDefault(),T()}catch(e){r(f,"p",b,"",["error"]),console.error(e)}})),""!=location.hash&&"#questionnaire"===location.hash&&T();let R={};v.addEventListener("submit",(function(e){try{e.preventDefault(),q.style.display="none",f.innerHTML="";const n=(e=>{const t={},n=new FormData(e);for(let e of n.entries())t[e[0]]=e[1];return t})(v);R.duration=Math.round((Date.now()-k)/1e3),R.nbQuestions=0,R.nbCorrectAnswers=0,R.QuestionnaireId=document.getElementById("questionnaireId").value;let s,o="",a=!1;for(let e in n)e.startsWith("isCorrect_response_")&&(s=e.substring(e.lastIndexOf("_")+1),n["question_id_response_"+s]!=o&&(o=n["question_id_response_"+s],R.nbQuestions++,a&&R.nbCorrectAnswers++,a=!0),"true"==n[e]?(document.getElementById("response_"+s).parentNode.classList.add("isCorrect"),void 0===n["response_"+s]&&(a=!1)):"on"===n["response_"+s]&&(a=!1,document.getElementById("response_"+s).parentNode.classList.add("isNotCorrect")));a&&R.nbCorrectAnswers++;let u=(e=>{if((0,t.isEmpty)(e.duration)||(0,t.isEmpty)(e.nbCorrectAnswers)||(0,t.isEmpty)(e.nbQuestions))return"";{const n=e.nbCorrectAnswers/e.nbQuestions,s={DURATION:e.duration,NBCORRECTANSWERS:e.nbCorrectAnswers,NBQUESTIONS:e.nbQuestions};let r="";return r=n<.4?(0,t.replaceAll)(i.checkResponsesOuputFail,s):n<.8?(0,t.replaceAll)(i.checkResponsesOuputMedium,s):(0,t.replaceAll)(i.checkResponsesOuputSuccess,s),r||""}})(R);r(f,"p",u,"",["info"]),window.location.hash="";const l=window.location;window.location.assign(l+"response");const c=document.querySelectorAll(".help");for(let e in c)null!=c[e].style&&(c[e].style.display="block")}catch(e){r(f,"p",b,"",["error"]),console.error(e)}}))}()}();
\ No newline at end of file
diff --git a/front/src/group.js b/front/src/group.js
deleted file mode 100644
index 0ef1805..0000000
--- a/front/src/group.js
+++ /dev/null
@@ -1,228 +0,0 @@
-// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN GROUPE DE QUIZS
-
-/// Il n'est pas nécessaire d'être connecté pour répondre au quiz et voir son résultat.
-/// Mais si pas connecté, on propose à l'internaute de se connecter ou de créer un compte pour sauvegarder son résultat.
-/// Dans ce but son résultat est stocké dans son navigateur.
-/// Si il est connecté, l'enregistrement de son résultat se fait automatiquement côté serveur et ses éventuels précédents résultats sont affichés.
-
-// Fichier de configuration tirés du backend :
-import { apiUrl, availableLangs, theme } from "../../config/instance.js";
-const lang=availableLangs[0];
-import { getPreviousAnswers, groupRoutes, saveAnswersRoute } from "../../config/questionnaires.js";
-const configTemplate = require("../../views/"+theme+"/config/"+lang+".js");
-
-import { checkAnswerOuput, saveAnswer } from "./tools/answers.js";
-import { addElement } from "./tools/dom.js";
-import { helloDev, updateAccountLink } from "./tools/everywhere.js";
-import { getLocaly } from "./tools/clientstorage.js";
-import { getDatasFromInputs } from "./tools/forms.js";
-import { dateFormat, replaceAll } from "../../tools/main";
-import { loadMatomo } from "./tools/matomo.js";
-import { checkSession, getTimeDifference } from "./tools/users.js";
-
-// Dictionnaires :
-const { noPreviousAnswer, previousAnswersLine, previousAnswersStats, previousAnswersTitle, responseSavedError, wantToSaveResponses } = require("../../lang/"+lang+"/answer");
-const { serverError } = require("../../lang/"+lang+"/general");
-
-// Principaux éléments du DOM manipulés :
-const btnSubmit = document.getElementById("checkResponses");
-const divResponse = document.getElementById("response");
-const explanationsTitle = document.getElementById("explanationsTitle");
-const explanationsContent = document.getElementById("explanationsContent");
-const myForm = document.getElementById("group");
-
-// Affiche le bouton de soumission + déclenche le chronomètre mesurant la durée de la réponse.
-let chronoBegin=0;
-const beginAnswer = () =>
-{
- chronoBegin=Date.now();
- btnSubmit.style.display="block";
-}
-
-let isConnected, user;
-const initialise = async () =>
-{
- try
- {
- // Si JS activé, on affiche le bouton de soumission du formulaire :
- beginAnswer();
- /*
- 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);// lien vers le compte adapté pour les utilisateurs connectés
- checkPreviousResponses(user);
- }
- else */
- loadMatomo();
- }
- catch(e)
- {
- console.error(e);
- }
-}
-initialise();
-helloDev();
-
-// Traitement de l'envoi de la réponse de l'utilisateur :
-let answer = {};
-myForm.addEventListener("submit", function(e)
-{
- try
- {
- e.preventDefault();
- 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.GroupId=document.getElementById("groupId").value;
- // 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.
- {
- idChoice = item.substring(item.lastIndexOf("_") + 1);
- if(userResponses["question_id_response_"+idChoice] != idQuestion) // = on commence à traiter une nouvelle question.
- {
- idQuestion=userResponses["question_id_response_"+idChoice];
- answer.nbQuestions++;
- if(goodResponse) // = pas d'erreur à la question précédente
- answer.nbCorrectAnswers++;
- goodResponse=true;// La réponse est considérée comme bonne, jusqu'à la première erreur...
- }
- if(userResponses[item] == "true")
- {
- document.getElementById("response_"+idChoice).parentNode.classList.add("isCorrect");
- if(userResponses["response_"+idChoice] === undefined)// = une bonne réponse n'a pas été sélectionnée
- goodResponse=false;
- }
- else
- {
- if(userResponses["response_"+idChoice] === "on")
- {
- goodResponse=false; // = une mauvaise réponse a été sélectionnée
- document.getElementById("response_"+idChoice).parentNode.classList.add("isNotCorrect");
- }
- }
- }
- }
- // Si j'ai bien répondu à la dernière question, il faut le compter ici, car on est sorti de la boucle :
- if(goodResponse)
- answer.nbCorrectAnswers++;
-
- // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score :
- let getOuput=checkAnswerOuput(answer);
- /*if(isConnected)
- {
- // Si l'utilisateur est connecté, on passe son résultat au serveur pour le sauvegarder.
- const xhrSaveAnswer = new XMLHttpRequest();
- xhrSaveAnswer.open("POST", apiUrl+groupRoutes+saveAnswersRoute);
- xhrSaveAnswer.onreadystatechange = function()
- {
- if (this.readyState == XMLHttpRequest.DONE)
- {
- let xhrResponse=JSON.parse(this.responseText);
- if (this.status === 201 && (xhrResponse.message))
- {
- getOuput+="
"+xhrResponse.message.replace("#URL", configTemplate.userHomePage);
- checkPreviousResponses(user);
- }
- else
- getOuput+="
"+responseSavedError.replace("#URL", configTemplate.userHomePage);
- // Puis on le redirige vers son résultat :
- window.location.hash="";
- const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview"...
- window.location.hash="explanations";
- }
- }
- xhrSaveAnswer.setRequestHeader("Authorization", "Bearer "+user.token);
- xhrSaveAnswer.setRequestHeader("Content-Type", "application/json");
- answer.timeDifference=getTimeDifference();// On en profite pour mettre les pendules à l'heure.
- xhrSaveAnswer.send(JSON.stringify(answer));
- }
- else
- { // Si internaute non 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+="
"+wantToSaveResponses+"
"; - addElement(divResponse, "p", getOuput, "", ["success"]); - document.querySelector(".subscribeBtns").style.display="block"; - } - else // Mais inutile de proposer de créer un compte si le stockage local ne fonctionne pas */ - addElement(divResponse, "p", getOuput, "", ["success"]); - // Puis on le redirige vers son résultat : - window.location.hash=""; - const here=window.location;// window.location à ajouter pour ne pas quitter la page en mode "preview"... - window.location.hash="response"; - //} - // + Affichage des textes d'explications pour chaque question - const explanations=document.querySelectorAll(".help"); - for(let i in explanations) - if(explanations[i].style !== undefined) // sinon, la console affiche une erreur "TypeError: explanations[i].style is undefined", bien que tout fonctionne (?) - explanations[i].style.display="block"; - } - catch(e) - { - addElement(divResponse, "p", serverError, "", ["error"]); - console.error(e); - } -}) - -/* -// Fonction vérifiant les précédentes réponses de l'utilisateur. -// Utile si connecté lors du premier chargement de la page, puis après une nouvelle réponse. -const checkPreviousResponses = (user) => -{ - const xhrPreviousRes = new XMLHttpRequest(); - xhrPreviousRes.open("GET", apiUrl+groupRoutes+getPreviousAnswers+user.id+"/"+document.getElementById("groupId").value); - xhrPreviousRes.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let response=JSON.parse(this.responseText); - if (this.status === 200) - { - const nbResponses=response.length; - let previousAnswersContent=""; - addElement(explanationsTitle, "span", previousAnswersTitle.replace("#NOM", user.name)); - if(nbResponses!==0) - { - let totNbQuestions=0, totNbCorrectAnswers=0, totDuration=0, mapLineContent; - for(let i in response) - { - 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, lang), - NBCORRECTANSWERS : response[i].nbCorrectAnswers, - NBQUESTIONS : response[i].nbQuestions, - AVGDURATION : response[i].duration - }; - previousAnswersContent+="