2021-07-05 12:12:51 +02:00
/******/ ( function ( ) { // webpackBootstrap
/******/ var _ _webpack _modules _ _ = ( {
2020-08-07 12:23:59 +02:00
/***/ "../config/instance.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / config / instance . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2021-07-05 12:12:51 +02:00
/***/ ( function ( module , _ _unused _webpack _exports , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-05-03 17:40:50 +02:00
const users = _ _webpack _require _ _ ( /*! ./users */ "../config/users.js" ) ;
2020-08-07 12:23:59 +02:00
2021-05-03 17:40:50 +02:00
const questionnaires = _ _webpack _require _ _ ( /*! ./questionnaires */ "../config/questionnaires.js" ) ;
2020-08-07 12:23:59 +02:00
2021-05-03 17:40:50 +02:00
module . exports = {
2020-08-07 12:23:59 +02:00
apiUrl : "http://localhost:3000/api" ,
siteUrl : "http://localhost:8080" ,
adminName : "Fabrice" ,
adminEmail : "dev@wikilerni.com" ,
2020-08-07 12:38:19 +02:00
senderName : "WikiLerni (local)" ,
2020-08-07 12:23:59 +02:00
senderEmail : "bonjour@wikilerni.com" ,
adminLang : "fr" ,
2020-08-07 12:38:19 +02:00
theme : "wikilerni" ,
2020-08-07 12:23:59 +02:00
// le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.
availableLangs : [ "fr" ] ,
// Languages in which the site is available. The first one is the default one.
2020-08-07 12:38:19 +02:00
siteName : "WikiLerni (local)" ,
beginCodeGodfather : "WL" ,
2020-08-07 12:23:59 +02:00
// case-sensitive and can't contain "@" !
2020-10-06 11:38:07 +02:00
defaultReceiptDays : "147" ,
// Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)
2020-08-07 12:23:59 +02:00
cronTimingAlertInSeconde : 120 ,
// for logs
responseTimingAlertInSeconde : 3 ,
// idem
tokenSignupValidationTimeInHours : "48h" ,
// https://github.com/zeit/ms
tokenLoginLinkTimeInHours : "1h" ,
tokenConnexionMinTimeInHours : "24h" ,
tokenConnexionMaxTimeInDays : "180 days" ,
tokenLoginChangingTimeInHours : "1h" ,
// for email & password changing
tokenDeleteUserTimeInHours : "1h" ,
tokenUnsubscribeLinkTimeInDays : "7 days" ,
// token send with subscription's emails
2021-01-25 16:54:16 +01:00
freeAccountTimingInDays : 0 ,
// if 0 = unlimited
2020-10-06 11:38:07 +02:00
freeAccountExpirationNotificationInDays : 3 ,
accountExpirationFirstNotificationInDays : 10 ,
accountExpirationSecondNotificationInDays : 3 ,
2020-08-07 12:23:59 +02:00
inactiveAccountTimeToDeleteInDays : 180 ,
// Questionnaires:
nbQuestionsMin : 1 ,
// minimum number of questions for the questionnaire to be publishable
2020-08-07 12:38:19 +02:00
nbQuestionsMax : 2 ,
2020-08-07 12:23:59 +02:00
// if 0 = not maximum
nbChoicesMax : 10 ,
2020-10-06 11:38:07 +02:00
nbNewQuestionnaires : 12 ,
2020-08-07 12:23:59 +02:00
// for RSS, etc.
2020-10-06 11:38:07 +02:00
hourGiveNewQuestionnaireBegin : 7 ,
2020-08-07 12:23:59 +02:00
// in user local time
2020-10-06 11:38:07 +02:00
hourGiveNewQuestionnaireEnd : 21 ,
2020-08-07 12:23:59 +02:00
// idem
2020-11-04 10:33:14 +01:00
maxQuestionnaireSendedAtSameTime : 50 ,
// for subscription's e-mailing
2020-08-07 12:23:59 +02:00
minSearchQuestionnaires : 3 ,
2020-10-06 11:38:07 +02:00
fieldNewQuestionnaires : "publishingAt" ,
// field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt"
2020-10-12 17:51:35 +02:00
// Groups :
2021-01-25 16:54:16 +01:00
nbQuestionnairesByGroupMin : 1 ,
2020-10-12 17:51:35 +02:00
nbQuestionnairesByGroupMax : 0 ,
2020-08-07 12:23:59 +02:00
// Illustrations:
2020-11-04 10:33:14 +01:00
nbIllustrationsMin : 1 ,
2020-08-07 12:23:59 +02:00
nbIllustrationsMax : 1 ,
maxIllustrationSizeinOctet : 1000000 ,
// pas contrôlé pour l'instant. À revoir.
mimeTypesForIllustration : [ "image/jpg" , "image/jpeg" , "image/png" , "image/gif" , "image/png" ] ,
// -- Upload and resize:
2020-10-06 11:38:07 +02:00
illustrationsWidthMaxInPx : 500 ,
2020-08-07 12:23:59 +02:00
illustrationsMiniaturesWidthMaxInPx : 200 ,
// Links:
nbLinksMin : 1 ,
2021-05-03 17:40:50 +02:00
nbLinksMax : 0 ,
// Questions & responses:
nbQuestionsMin : 1 ,
nbQuestionsMax : 0 ,
nbChoicesMax : 10 ,
// à supprimer quand tous les "require" à jour:
passwordMinLength : users . password . minlength ,
dirCacheUsers : users . dirCacheUsers ,
dirCacheUsersAnswers : users . dirCacheUsersAnswers ,
dirCacheQuestionnaires : questionnaires . dirCacheQuestionnaires ,
dirCacheQuestions : questionnaires . dirCacheQuestions ,
dirCacheUsersQuestionnaires : questionnaires . dirCacheUsersQuestionnaires ,
dirHTMLQuestionnaires : questionnaires . dirHTMLQuestionnaires ,
dirWebQuestionnaires : questionnaires . dirWebQuestionnaires
} ;
2020-08-07 12:23:59 +02:00
/***/ } ) ,
2020-08-14 17:15:06 +02:00
/***/ "../config/matomo.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / config / matomo . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2021-07-05 12:12:51 +02:00
/***/ ( function ( module ) {
2020-08-14 17:15:06 +02:00
// Si non utilisé, supprimer l'appel des JS front-end puis recompiler.
// Revoir comment réorganiser cela sous-forme de module indépendant.
module . exports = {
// Stats Matomo :
matomo : {
url : "https://stats.le-fab-lab.com/" ,
siteId : "5"
}
} ;
/***/ } ) ,
2020-08-07 12:23:59 +02:00
/***/ "../config/questionnaires.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / config / questionnaires . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2021-07-05 12:12:51 +02:00
/***/ ( function ( module ) {
2020-08-07 12:23:59 +02:00
module . exports = {
// API'routes (after "apiUrl" defined in instance.js)
questionnaireRoutes : "/questionnaire" ,
2020-10-12 17:51:35 +02:00
// la base à laquelle s'ajoute les routes suivantes
getListNextQuestionnaires : "/getlistnextquestionnaires/" ,
2020-08-07 12:23:59 +02:00
getQuestionnaireRoutes : "/get" ,
2020-10-12 17:51:35 +02:00
getRandomQuestionnairesRoute : "/getrandom" ,
getStatsQuestionnaires : "/stats/" ,
2020-08-07 12:23:59 +02:00
previewQuestionnaireRoutes : "/preview" ,
publishedQuestionnaireRoutes : "/quiz/" ,
2020-10-12 17:51:35 +02:00
regenerateHTML : "/htmlregenerated" ,
2020-08-07 12:23:59 +02:00
searchAdminQuestionnairesRoute : "/searchadmin" ,
2020-10-12 17:51:35 +02:00
searchQuestionnairesRoute : "/search" ,
2020-11-04 10:33:14 +01:00
// -- groupes :
groupRoutes : "/group" ,
getGroupRoute : "/get/" ,
previewGroupRoutes : "/preview" ,
searchGroupsRoute : "/search" ,
2020-08-07 12:23:59 +02:00
// -- questions & choices :
questionsRoute : "/question/" ,
// -- tags :
tagsSearchRoute : "/tags/search/" ,
// -- answers :
2020-10-12 17:51:35 +02:00
getAdminStats : "/getadminstats/" ,
2020-08-07 12:23:59 +02:00
getPreviousAnswers : "/user/answers/" ,
getStatsAnswers : "/user/anwswers/stats/" ,
2020-11-04 10:33:14 +01:00
// fonctionne aussi pour les groupes
saveAnswersRoute : "/answer/" ,
// idem
2020-08-07 12:23:59 +02:00
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Questionnaire : {
title : {
maxlength : 255 ,
required : true
} ,
slug : {
maxlength : 150
} ,
2020-10-12 17:51:35 +02:00
// champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
2020-08-07 12:23:59 +02:00
introduction : {
required : true
}
} ,
searchQuestionnaires : {
minlength : 3 ,
required : true
} ,
2020-11-04 10:33:14 +01:00
Group : {
title : {
maxlength : 255 ,
required : true
} ,
slug : {
maxlength : 150
} // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
} ,
2020-08-07 12:23:59 +02:00
Question : {
text : {
maxlength : 255 ,
required : true
} ,
rank : {
required : true ,
min : 1 ,
defaultValue : 1
}
} ,
Choice : {
text : {
maxlength : 255 ,
required : true
}
} ,
2020-10-06 11:38:07 +02:00
search : {
minlength : 3 ,
required : true
} ,
2020-10-12 17:51:35 +02:00
searchGroups : {
minlength : 3 ,
required : true
} ,
// Emplacement des fichiers JSON générés :
dirCacheGroups : "datas/questionnaires/groups" ,
2020-08-07 12:23:59 +02:00
dirCacheQuestionnaires : "datas/questionnaires" ,
dirCacheQuestions : "datas/questionnaires/questions" ,
dirCacheTags : "datas/questionnaires/tags" ,
2020-10-12 17:51:35 +02:00
dirCacheUsersQuestionnaires : "datas/users/questionnaires" ,
// Emplacement des fichiers HTML générés :
2020-11-04 10:33:14 +01:00
dirHTMLGroups : "front/public/quiz/gp" ,
2020-10-12 17:51:35 +02:00
dirHTMLQuestionnaires : "front/public/quiz" ,
2020-11-04 10:33:14 +01:00
dirHTMLNews : "front/public/quizs" ,
2020-08-07 12:23:59 +02:00
dirHTMLTags : "front/public/quizs" ,
2020-10-12 17:51:35 +02:00
// Idem mais pour urls :
2020-11-04 10:33:14 +01:00
dirWebGroups : "quiz/gp" ,
2020-10-12 17:51:35 +02:00
dirWebQuestionnaires : "quiz" ,
2020-11-04 10:33:14 +01:00
dirWebNews : "quizs/" ,
2020-10-06 11:38:07 +02:00
dirWebTags : "quizs/" ,
2020-10-12 17:51:35 +02:00
// limite des résultat du moteur de recherche, quand demande de résultats au hasard :
nbRandomResults : 3 ,
/* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */
nbQuestionsMin : 1 ,
nbQuestionsMax : 0 ,
nbChoicesMax : 10 ,
nbTagsMin : 0 ,
nbTagsMax : 0 // 0 = not max
2020-08-07 12:23:59 +02:00
} ;
/***/ } ) ,
/***/ "../config/users.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / config / users . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * /
2021-07-05 12:12:51 +02:00
/***/ ( function ( module ) {
2020-08-07 12:23:59 +02:00
module . exports = {
// API'routes (after "apiUrl" defined in instance.js)
userRoutes : "/user" ,
2020-10-06 11:38:07 +02:00
checkDeleteLinkRoute : "/confirmdelete/" ,
2020-08-07 12:23:59 +02:00
checkIfIsEmailfreeRoute : "/isemailfree" ,
checkLoginRoute : "/checklogin/" ,
2020-10-06 11:38:07 +02:00
checkNewLoginLinkRoute : "/confirmnewlogin/" ,
checkSubscribeTokenRoute : "/validation/" ,
2020-08-07 12:23:59 +02:00
connectionRoute : "/login" ,
connectionWithLinkRoute : "/checkloginlink" ,
createUserRoute : "/create" ,
2020-10-06 11:38:07 +02:00
getAdminStats : "/getadminstats/" ,
2020-08-07 12:23:59 +02:00
getGodChilds : "/getgodchilds/" ,
2020-10-06 11:38:07 +02:00
getGodfatherRoute : "/getgodfatherid" ,
getLoginLinkRoute : "/getloginlink" ,
2020-08-07 12:23:59 +02:00
getPayments : "/payment/getforoneuser/" ,
2020-10-06 11:38:07 +02:00
getUserInfos : "/get/" ,
2020-11-04 10:33:14 +01:00
getUsersQuestionnairesRoute : "/getusersquestionnaires/" ,
// les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement
2020-10-06 11:38:07 +02:00
searchUserRoute : "/search/" ,
2020-11-04 10:33:14 +01:00
signupCompletionRoute : "/signupcompletion/" ,
2020-10-06 11:38:07 +02:00
subscribeRoute : "/signup" ,
2020-08-07 12:23:59 +02:00
unsubscribeRoute : "/subscription/stop/" ,
2020-10-06 11:38:07 +02:00
updateUserInfos : "/modify/" ,
validateUserRoute : "/validate/" ,
2020-08-07 12:23:59 +02:00
// forms : à compléter avec valeurs par défaut, etc. cf modèle
name : {
maxlength : 70 ,
required : true
} ,
email : {
maxlength : 255 ,
required : true
} ,
password : {
minlength : 8 ,
maxlength : 72 ,
required : true
} ,
// https://www.npmjs.com/package/bcrypt#security-issues-and-concerns
newPassword : {
minlength : 8 ,
maxlength : 72
} ,
codeGodfather : {
maxlength : 255
} ,
cguOk : {
value : "true" ,
required : true
} ,
2020-10-06 11:38:07 +02:00
search : {
minlength : 1 ,
required : true
} ,
2020-08-07 12:23:59 +02:00
timeDifferenceMin : - 720 ,
timeDifferenceMax : 840 ,
// JSON dir
dirCacheUsers : "datas/users" ,
2020-10-06 11:38:07 +02:00
dirCacheUsersAnswers : "datas/users/questionnaires/answers" ,
dirCacheUsersWithoutAnswers : "datas/users/questionnaires/without"
2020-08-07 12:23:59 +02:00
} ;
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "./src/config/general.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / config / general . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
// à supprimer une fois que tout récupérer du backend :
module . 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/"
2020-08-07 12:23:59 +02:00
} ;
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/answers.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / answers . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "saveAnswer" : function ( ) { return /* binding */ saveAnswer ; } ,
/* harmony export */ "checkAnswerOuput" : function ( ) { return /* binding */ checkAnswerOuput ; }
/* harmony export */ } ) ;
/* harmony import */ var _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( /*! ./clientstorage.js */ "./src/tools/clientstorage.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ = _ _webpack _require _ _ ( /*! ../../../tools/main */ "../tools/main.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ ) ;
const configFrontEnd = _ _webpack _require _ _ ( /*! ../config/general */ "./src/config/general.js" ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const txt = _ _webpack _require _ _ ( "../lang sync recursive ^\\.\\/.*\\/answer$" ) ( "./" + configFrontEnd . lang + "/answer" ) ; // Enregistrement côté client du dernier résultat à un quiz en attendant d'être connecté
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const saveAnswer = answer => {
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . duration ) && ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . nbCorrectAnswers ) && ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . nbQuestions ) && ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . QuestionnaireId ) || ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . GroupId ) ) ) {
( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . saveLocaly ) ( "lastAnswer" , answer ) ;
return true ;
} else return false ;
} ; // Retourne un texte suivant le nombre de bonnes réponses
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const checkAnswerOuput = answer => {
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . duration ) && ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . nbCorrectAnswers ) && ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . isEmpty ) ( answer . nbQuestions ) ) {
const ratio = answer . nbCorrectAnswers / answer . nbQuestions ;
const mapObj = {
DURATION : answer . duration ,
NBCORRECTANSWERS : answer . nbCorrectAnswers ,
NBQUESTIONS : answer . nbQuestions
} ;
let output = "" ;
if ( ratio < 0.4 ) output = ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . replaceAll ) ( txt . checkResponsesOuputFail , mapObj ) ; else if ( ratio < 0.8 ) output = ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . replaceAll ) ( txt . checkResponsesOuputMedium , mapObj ) ; else output = ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _1 _ _ . replaceAll ) ( txt . checkResponsesOuputSuccess , mapObj ) ;
if ( output ) return output ; else return "" ;
} else return "" ;
2020-08-07 12:23:59 +02:00
} ;
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/clientstorage.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / clientstorage . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "saveLocaly" : function ( ) { return /* binding */ saveLocaly ; } ,
/* harmony export */ "getLocaly" : function ( ) { return /* binding */ getLocaly ; } ,
/* harmony export */ "removeLocaly" : function ( ) { return /* binding */ removeLocaly ; }
/* harmony export */ } ) ;
// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
const saveLocaly = ( name , data ) => {
localStorage . setItem ( name , JSON . stringify ( data ) ) ;
} ;
const getLocaly = ( name , json = false ) => {
if ( json ) return JSON . parse ( localStorage . getItem ( name ) ) ; else return localStorage . getItem ( name ) ;
} ;
const removeLocaly = name => {
localStorage . removeItem ( name ) ;
2020-08-07 12:23:59 +02:00
} ;
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/dom.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / dom . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "addElement" : function ( ) { return /* binding */ addElement ; }
/* harmony export */ } ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( /*! ../../../tools/main */ "../tools/main.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
// Fonction associant les attributs fournis à un champ de formulaire
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const addElement = ( eltParent , eltType , eltContent = "" , eltId = "" , eltClass = [ ] , eltAttributes = { } , replace = true ) => {
if ( ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ . isEmpty ) ( eltType ) || ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ . isEmpty ) ( eltParent ) ) return false ; else {
const newElement = document . createElement ( eltType ) ;
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ . isEmpty ) ( eltId ) ) // tester si l'id n'est pas déjà utilisé dans le DOM ?
newElement . id = eltId ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( Array . isArray ( eltClass ) && eltClass . length != 0 ) {
for ( let i in eltClass ) newElement . classList . add ( eltClass [ i ] ) ;
2021-05-03 17:40:50 +02:00
}
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( typeof eltAttributes === "object" ) // !! tous les objets ne sont pas ok
{
for ( let attributName in eltAttributes ) newElement . setAttribute ( attributName , eltAttributes [ attributName ] ) ;
}
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ . isEmpty ) ( eltContent ) ) newElement . innerHTML = eltContent . replace ( /\n/g , "<br>" ) ; // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( replace ) eltParent . innerHTML = "" ;
eltParent . appendChild ( newElement ) ;
}
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/everywhere.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / everywhere . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-11-04 10:33:14 +01:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "helloDev" : function ( ) { return /* binding */ helloDev ; } ,
/* harmony export */ "updateAccountLink" : function ( ) { return /* binding */ updateAccountLink ; }
/* harmony export */ } ) ;
// Ce script fournit des fonctions utilisées sur toutes les pages du site
const helloDev = ( ) => {
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 ****" ) ;
return true ;
} ;
const updateAccountLink = ( status , configTemplate ) => {
const link = document . getElementById ( "accountHeadLink" ) ;
const homePage = status + "HomePage" ;
link . href = "/" + configTemplate [ homePage ] ;
} ;
2021-05-03 17:40:50 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2021-05-03 17:40:50 +02:00
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/forms.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / forms . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-11-04 10:33:14 +01:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "setAttributesToInputs" : function ( ) { return /* binding */ setAttributesToInputs ; } ,
/* harmony export */ "getDatasFromInputs" : function ( ) { return /* binding */ getDatasFromInputs ; } ,
/* harmony export */ "empyForm" : function ( ) { return /* binding */ empyForm ; } ,
/* harmony export */ "empyAndHideForm" : function ( ) { return /* binding */ empyAndHideForm ; }
/* harmony export */ } ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( /*! ../../../tools/main */ "../tools/main.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
// Fonction associant les attributs fournis à un champ de formulaire
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const setAttributesToInputs = ( inputsConf , myForm ) => {
for ( let i in myForm . elements ) {
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _0 _ _ . isEmpty ) ( myForm . elements [ i ] . id ) ) {
let idInput = myForm . elements [ i ] . id ;
if ( inputsConf [ idInput ] !== undefined ) {
let inputHTML = document . getElementById ( idInput ) ;
for ( let attribute in inputsConf [ idInput ] ) inputHTML . setAttribute ( attribute , inputsConf [ idInput ] [ attribute ] ) ;
}
}
2021-05-03 17:40:50 +02:00
}
2021-07-05 12:12:51 +02:00
return true ;
} ; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const getDatasFromInputs = myForm => {
const datas = { } ;
const formData = new FormData ( myForm ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
for ( let entrie of formData . entries ( ) ) datas [ entrie [ 0 ] ] = entrie [ 1 ] ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
return datas ;
} ; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
// Revoir pour les select
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const empyForm = myForm => {
const formData = new FormData ( myForm ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
for ( let entrie of formData . entries ( ) ) {
if ( myForm . elements [ entrie [ 0 ] ] . type == "checkbox" || myForm . elements [ entrie [ 0 ] ] . type == "radio" ) myForm . elements [ entrie [ 0 ] ] . checked = false ; else myForm . elements [ entrie [ 0 ] ] . value = "" ;
}
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
return true ;
} ; // Vide et cache le formulaire
const empyAndHideForm = myForm => {
empyForm ( myForm ) ;
myForm . style . display = "none" ;
2020-08-07 12:23:59 +02:00
} ;
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/matomo.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / matomo . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "loadMatomo" : function ( ) { return /* binding */ loadMatomo ; }
/* harmony export */ } ) ;
/* harmony import */ var _config _matomo _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( /*! ../../../config/matomo.js */ "../config/matomo.js" ) ;
/* harmony import */ var _config _matomo _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _config _matomo _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
// Fonction chargeant le code matomo
const loadMatomo = ( ) => {
// chargement de matomo
var _paq = window . _paq = window . _paq || [ ] ; //ajout cnil :
_paq . push ( [ function ( ) {
var self = this ;
function getOriginalVisitorCookieTimeout ( ) {
var now = new Date ( ) ,
nowTs = Math . round ( now . getTime ( ) / 1000 ) ,
visitorInfo = self . getVisitorInfo ( ) ;
var createTs = parseInt ( visitorInfo [ 2 ] ) ;
var cookieTimeout = 33696000 ; // 13 mois en secondes
var originalTimeout = createTs + cookieTimeout - nowTs ;
return originalTimeout ;
2020-08-07 12:23:59 +02:00
}
2021-07-05 12:12:51 +02:00
this . setVisitorCookieTimeout ( getOriginalVisitorCookieTimeout ( ) ) ;
} ] ) ; //--fin ajout cnil
_paq . push ( [ 'trackPageView' ] ) ;
_paq . push ( [ 'enableLinkTracking' ] ) ;
( function ( ) {
var u = _config _matomo _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . matomo . url ;
_paq . push ( [ 'setTrackerUrl' , u + 'matomo.php' ] ) ;
_paq . push ( [ 'setSiteId' , _config _matomo _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . matomo . siteId ] ) ;
var d = document ,
g = d . createElement ( 'script' ) ,
s = d . getElementsByTagName ( 'script' ) [ 0 ] ;
g . type = 'text/javascript' ;
g . async = true ;
g . src = u + 'matomo.js' ;
s . parentNode . insertBefore ( g , s ) ;
} ) ( ) ;
2020-08-07 12:38:19 +02:00
} ;
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "./src/tools/users.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / tools / users . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( _ _unused _webpack _module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-08-07 12:38:19 +02:00
2021-07-05 12:12:51 +02:00
"use strict" ;
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
/* harmony export */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
/* harmony export */ "getTimeDifference" : function ( ) { return /* binding */ getTimeDifference ; } ,
/* harmony export */ "setSession" : function ( ) { return /* binding */ setSession ; } ,
/* harmony export */ "checkAnswerDatas" : function ( ) { return /* binding */ checkAnswerDatas ; } ,
/* harmony export */ "checkSession" : function ( ) { return /* binding */ checkSession ; }
/* harmony export */ } ) ;
/* harmony import */ var _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( /*! ../../../config/instance.js */ "../config/instance.js" ) ;
/* harmony import */ var _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
/* harmony import */ var _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ = _ _webpack _require _ _ ( /*! ../../../config/users.js */ "../config/users.js" ) ;
/* harmony import */ var _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ ) ;
/* harmony import */ var _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ = _ _webpack _require _ _ ( /*! ./clientstorage.js */ "./src/tools/clientstorage.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ = _ _webpack _require _ _ ( /*! ../../../tools/main */ "../tools/main.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ ) ;
2020-10-12 17:51:35 +02:00
2021-07-05 12:12:51 +02:00
const lang = _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . availableLangs [ 0 ] ;
2020-10-12 17:51:35 +02:00
2021-07-05 12:12:51 +02:00
const configTemplate = _ _webpack _require _ _ ( "../views sync recursive ^\\.\\/.*\\.js$" ) ( "./" + _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . theme + "/config/" + lang + ".js" ) ;
2020-10-12 17:51:35 +02:00
2020-11-04 10:33:14 +01:00
2020-10-12 17:51:35 +02:00
2021-07-05 12:12:51 +02:00
const getTimeDifference = ( ) => {
// multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse
const timeLocal = new Date ( ) . getTimezoneOffset ( ) * - 1 ;
if ( timeLocal > _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . timeDifferenceMax || timeLocal < _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . timeDifferenceMin ) return 0 ; else return timeLocal ;
} ; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite
// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const setSession = ( userId , token , durationTS ) => {
const storageUser = {
id : userId ,
token : token ,
duration : durationTS
} ;
( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . saveLocaly ) ( "user" , storageUser ) ;
} ; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const checkAnswerDatas = datas => {
const lastAnswer = ( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . getLocaly ) ( "lastAnswer" ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( lastAnswer ) ) {
const answer = JSON . parse ( lastAnswer ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( answer . duration ) && ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( answer . nbCorrectAnswers ) && ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( answer . nbQuestions ) && ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( answer . QuestionnaireId ) || ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( answer . GroupId ) ) ) {
datas . duration = answer . duration ;
datas . nbCorrectAnswers = answer . nbCorrectAnswers ;
datas . nbQuestions = answer . nbQuestions ;
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( answer . QuestionnaireId ) ) datas . QuestionnaireId = answer . QuestionnaireId ; else datas . GroupId = answer . GroupId ;
}
}
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
return datas ;
} ; // Cette fonction teste la connexion de l'utilisateur d'une page
// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const checkSession = async ( status = [ ] , urlRedirection , message , urlWanted ) => {
return new Promise ( ( resolve , reject ) => {
const userDatas = ( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . getLocaly ) ( "user" ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( userDatas ) ) {
redirectUser ( urlRedirection , message , urlWanted ) ;
resolve ( false ) ;
} else {
const user = JSON . parse ( userDatas ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( user . id ) || ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( user . token ) || ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( user . duration ) || user . duration < Date . now ( ) ) {
( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . removeLocaly ) ( "user" ) ;
redirectUser ( urlRedirection , message , urlWanted ) ;
resolve ( false ) ;
} else {
const xhr = new XMLHttpRequest ( ) ;
xhr . open ( "GET" , _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . apiUrl + _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . userRoutes + _config _users _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . checkLoginRoute + user . token ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
xhr . onload = ( ) => {
let response = JSON . parse ( xhr . responseText ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( xhr . status === 200 && response . isValid && response . id != undefined ) {
if ( response . id === user . id ) {
user . name = response . name ;
user . language = response . language ;
user . timeDifference = response . timeDifference ;
user . status = response . status ; // c'est le token qui sert à vérifier le statut à chaque requête à l'API
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . saveLocaly ) ( "user" , user ) ; // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-)
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( response . status === "user" && response . nbDaysOk <= 0 ) {
const urlAccount = _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . siteUrl + "/" + configTemplate . accountPage ;
if ( window . location . href . indexOf ( urlAccount ) === - 1 ) window . location . assign ( "/" + configTemplate . accountPage + "#subscribe" ) ; // passée directement ici, l'ancre #subscribe ne fonctionne pas !?
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
resolve ( true ) ;
} else {
if ( status . length !== 0 && status . indexOf ( response . status ) === - 1 ) {
redirectUser ( urlRedirection , message , urlWanted ) ;
resolve ( false ) ;
} else resolve ( true ) ;
}
} else {
( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . removeLocaly ) ( "user" ) ;
redirectUser ( urlRedirection , message , urlWanted ) ;
resolve ( false ) ;
}
} else {
( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . removeLocaly ) ( "user" ) ;
redirectUser ( urlRedirection , message , urlWanted ) ;
resolve ( false ) ;
}
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
xhr . onerror = ( ) => reject ( xhr . statusText ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
xhr . send ( ) ;
}
}
} ) ;
} ; // Cette fonction sert à la précédente en cas de connexion non valide
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const redirectUser = ( urlRedirection , message , urlWanted ) => {
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( message ) ) ( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . saveLocaly ) ( "message" , message ) ;
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( urlWanted ) ) ( 0 , _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . saveLocaly ) ( "url" , urlWanted ) ;
if ( ! ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _3 _ _ . isEmpty ) ( urlRedirection ) ) window . location . assign ( urlRedirection ) ;
} ;
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ "../lang/fr/answer.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / lang / fr / answer . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module ) {
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
module . exports = {
checkResponsesOuputFail : "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. C'est certain, vous ferez mieux la prochaine fois !" ,
checkResponsesOuputMedium : "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. C'est pas mal du tout !" ,
checkResponsesOuputSuccess : "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. 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 <b>AVGCORRECTANSWERS % de bonnes réponses</b>." ,
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. <a href='/#URL'>Accèder à tous vos quizs</a>." ,
responseSavedMessage : "Votre résultat a été enregistré. <a href='/#URL'>Accèder à tous vos quizs</a>." ,
statsUser : "Vous avez enregistré <b>NBANSWERS réponseS1 à NBQUESTIONNAIRES quizS2 différentS3</b> sur les NBTOTQUESTIONNAIRES proposéS4 par le site.<br>En moyenne, vous avez mis AVGDURATION secondes à répondre et avez <b>correctement répondu à AVGCORRECTANSWERS % des questions</b>." ,
wantToSaveResponses : "Si vous le souhaitez, vous pouvez <u><b>sauvegarder votre résultat</b></u> en créant votre compte ci-dessous. Cela vous permettra aussi de <u><b>recevoir régulièrement de nouvelles \"graines de culture\"</b></u> directement sur votre e-mail."
} ;
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
/***/ "../lang/fr/general.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / lang / fr / general . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module ) {
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
module . 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.<br>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.<br>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."
2021-03-01 13:02:07 +01:00
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:38:19 +02:00
2021-07-05 12:12:51 +02:00
/***/ "../tools/main.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / tools / main . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
// Quelques fonctions utiles pour les chaînes
class Tool {
static isEmpty ( myVar ) {
if ( myVar === undefined || myVar === null ) return true ; else {
myVar += "" ; // si autre chose qu'une chaîne envoyé...
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
myVar = myVar . trim ( ) ;
if ( myVar === "" ) return true ; else return false ;
}
2020-08-07 12:23:59 +02:00
}
2021-07-05 12:12:51 +02:00
static trimIfNotNull ( myString ) {
if ( Tool . isEmpty ( myString ) ) myString = null ; else {
myString += "" ; // si autre chose qu'une chaîne envoyé...
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
myString = myString . trim ( ) ;
}
return myString ;
}
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
static shortenIfLongerThan ( myString , max ) {
myString += "" ; // au cas où cela ne serait pas une chaîne...
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( myString . length > max ) myString = myString . substring ( 0 , max - 3 ) + "…" ;
return myString ;
} // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
static replaceAll ( myString , mapObj ) {
const replaceElts = new RegExp ( Object . keys ( mapObj ) . join ( "|" ) , "gi" ) ;
return myString . replace ( replaceElts , matched => {
return mapObj [ matched ] ;
} ) ;
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
static getRandomInt ( min , max ) {
min = Math . ceil ( min ) ;
max = Math . floor ( max ) ;
return Math . floor ( Math . random ( ) * ( max - min ) ) + min ;
} // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country
2020-10-06 11:38:07 +02:00
2021-07-05 12:12:51 +02:00
static dateFormat ( dateString , lang = "fr" ) {
if ( Tool . isEmpty ( dateString ) ) return "" ;
let myDate = new Date ( dateString ) ;
let myDay = myDate . getDate ( ) + "" ;
if ( myDay . length === 1 ) myDay = "0" + myDay ;
let myMounth = myDate . getMonth ( ) + 1 + "" ;
if ( myMounth . length === 1 ) myMounth = "0" + myMounth ;
let myYear = myDate . getFullYear ( ) ;
if ( lang === "fr" ) return myDay + "/" + myMounth + "/" + myYear ; else if ( lang === "form" ) // 2014-02-09
return myYear + "-" + myMounth + "-" + myDay ; else return myMounth + "/" + myDay + "/" + myYear ;
} // On enlève volontairement les 0/O pour éviter les confusions !
// Et mieux vaut aussi débuter et finir par une lettre simple.
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
static getPassword ( nbCarMin , nbCarMax ) {
const nbCar = nbCarMin + Math . floor ( Math . random ( ) * ( nbCarMax - nbCarMin ) ) ;
const letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz" ;
const others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ" ;
let password = letters [ Math . floor ( Math . random ( ) * letters . length ) ] ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
for ( let i = 1 ; i < nbCar - 1 ; i ++ ) {
if ( i % 2 === 1 ) password += others [ Math . floor ( Math . random ( ) * others . length ) ] ; else password += letters [ Math . floor ( Math . random ( ) * letters . length ) ] ;
}
2020-08-07 12:38:19 +02:00
2021-07-05 12:12:51 +02:00
password += letters [ Math . floor ( Math . random ( ) * letters . length ) ] ;
return password ;
}
2020-08-07 12:38:19 +02:00
2021-07-05 12:12:51 +02:00
}
2020-08-07 12:38:19 +02:00
2021-07-05 12:12:51 +02:00
module . exports = Tool ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ "../views/default/config/fr.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / views / default / c o n f i g / f r . j s * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
module . exports = {
headLinks : [ {
anchor : "Accueil" ,
attributes : {
href : "/"
2020-08-07 12:23:59 +02:00
}
2021-07-05 12:12:51 +02:00
} , {
anchor : "Mon compte" ,
attributes : {
href : "/connexion.html" ,
id : "accountHeadLink"
}
} , {
anchor : "À propos" ,
attributes : {
href : "/a-propos.html"
}
} , {
anchor : "Contact" ,
attributes : {
href : "/contact.html"
}
} ] ,
footLinks : [ {
anchor : "Crédits" ,
attributes : {
href : "/credits.html"
}
} , {
anchor : "Mentions légales" ,
attributes : {
href : "/mentions-legales.html" ,
rel : "nofollow"
}
} , {
anchor : "Données personnelles" ,
attributes : {
href : "/donnees.html"
}
} , {
anchor : "C.G.U." ,
attributes : {
href : "/cgu.html" ,
rel : "nofollow"
}
} , {
anchor : "C.G.V." ,
attributes : {
href : "/cgv.html" ,
rel : "nofollow"
}
} ] ,
maxQuestionnairesByPage : 10 ,
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/" ,
siteSlogan : "Cultivons notre jardin !" ,
homeTitle1 : "De nature curieuse ?" ,
homeP1 : "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.<br>Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.<br>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.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><small><em>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</em></small>" ,
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é.<br>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.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses</b>, mais libre à vous d'essayer d'y répondre immédiatement.<br><br>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 ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.<br>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.<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>." ,
noJSNotification : "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript." ,
tagsListTxt : "Parcourir les rubriques :"
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ "../views/wikilerni/config/fr.js" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / views / wikilerni / config / fr . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
module . exports = {
// liens de l'interface
headLinks : [ {
anchor : "Contact" ,
attributes : {
href : "/contact.html" ,
rel : "nofollow"
}
} , {
anchor : "Parcourir" ,
attributes : {
href : "/quizs/" ,
id : "indexHeadLink" ,
title : "Les dernières publications"
}
} , {
anchor : "Mon compte" ,
attributes : {
href : "/connexion.html" ,
id : "accountHeadLink" ,
title : "Accéder ou créez votre compte WikiLerni"
}
} , {
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://framasphere.org/people/7e54b7a0b53201389eef2a0000053625" ,
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=" ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/* Textes (général) */
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 <a href=\"/credits.html\" title=\"En savoir plus ?\">est libre</a> et vous est offert sans publicité. Vous pouvez <a href=\"/participer-financement.html\" title=\"Financement participatif avec contre-parties\">participer à son financement en cliquant ici</a>." ,
2020-08-10 16:58:03 +02:00
2021-07-05 12:12:51 +02:00
/* Page d'accueil */
homePageTxt : "Page d'accueil" ,
homeTitle1 : "De nature curieuse ?" ,
homeP1 : "<b>Avec WikiLerni, vous apprenez régulièrement de nouvelles choses</b>.<br>Vous recevez de courts articles, lisibles en quelques minutes.<br>Des quizs vous permettent ensuite de tester ce que vous avez retenu.<br>De jour en jour <b>de nouvelles graines de culture sont ainsi semées dans votre jardin</b>." ,
homeTitle2 : "La culture générale en liberté" ,
homeP2 : "<b>Pas de faits alternatifs</b>, tous les contenus sont <b>sourcés par des articles Wikipédia</b>.<br>Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus sur ce sujet\">sont partagés sous licences libres</a>.<br>Le tout sans publicité, ni commercialisation de vos données.<br><b>Sur WikiLerni, vous cultivez votre jardin en toute tranquillité.</b>" ,
homeBtnAboutTxt : "En savoir plus sur WikiLerni ?" ,
homeBtnSubscribeTxt : "Testez WikiLerni" ,
homeSubcriptionFormTitle : "Recevez les prochains articles WikiLerni" ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/* Page dernières publications... */
newQuestionnairesTitle : "Culture générale - apprenez de nouvelles choses avec WikiLerni" ,
newQuestionnairesIntro : "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni." ,
newsListTitle : "<p><b>Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau</b><br>Si dessous les dernières publications. Vous pouvez aussi <a href='/quizs/themes.html'>parcourir le site par thèmes ou mots-clés</a>.</p>" ,
2020-10-06 11:38:07 +02:00
2021-07-05 12:12:51 +02:00
/* Plan du site, liste des tags */
tagListTitle : "Culture générale - des articles et quizs sur de nombreux thèmes !" ,
tagListMetaDesc : "WikiLerni : découvrir les différents thèmes abordés par WikiLerni. Inxex du site." ,
tagListIntro : "<h3>Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)</h3><blockquote>Aristote : « L’ homme a naturellement la passion de connaître… »</blockquote>" ,
2020-10-06 11:38:07 +02:00
2021-07-05 12:12:51 +02:00
/* Page quizs */
answersExplanationsLinkText : "Relire" ,
quizElementLinksIntro : "En savoir plus" ,
quizElementSubcriptionFormTitle : "Recevez les prochains articles WikiLerni" ,
explanationTitle : "Vous découvrez WikiLerni ?" ,
explanationTxt : "<p>Le principe est simple : <b>vous commencez par lire l’ article Wikipédia dont le lien vous est proposé</b>. Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>. Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées. C’ est toujours <b>le contenu de l’ article Wikipédia qui fait foi</b> 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 <a href='/contact.html'>à me signaler une erreur</a>.</p><p><b>WikiLerni vous propose d’ autres solutions pour améliorer votre culture générale</b>. Pour en savoir plus, cliquez sur le bouton ci-dessous.</p>" ,
explanationElementTxt : "<p>WikiLerni vous propose de <b>recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes</b> et portant sur des sujets très variés de <b>culture générale</b> (arts, histoire, littérature, sciences, etc.).</p><p>Ces articles sont basés sur <b>une ou plusieurs pages de Wikipédia</b> (fournies en lien), dont <b>ils extraient certaines informations</b>.</p><p>Chaque série d’ articles est <b>suivie d’ un quiz</b> permettant de tester ce que vous en avez retenu.</p><p><b>Vous apprenez ainsi régulièrement de nouvelles choses</b> très simplement.</p>" ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/* Autres */
illustrationDir : "/img/quizs/" ,
twitterAccount : "WikiLerni" ,
maxQuestionnairesByPage : 12 ,
maxQuestionnairesSiteHomePage : 3 ,
nbQuestionnairesUserHomePage : 3
2020-08-07 12:23:59 +02:00
} ;
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "../lang sync recursive ^\\.\\/.*\\/answer$" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / lang / sync ^ \ . \ / . * \ / answer$ * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module , _ _unused _webpack _exports , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
var map = {
"./fr/answer" : "../lang/fr/answer.js"
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
function webpackContext ( req ) {
var id = webpackContextResolve ( req ) ;
return _ _webpack _require _ _ ( id ) ;
}
function webpackContextResolve ( req ) {
if ( ! _ _webpack _require _ _ . o ( map , req ) ) {
var e = new Error ( "Cannot find module '" + req + "'" ) ;
e . code = 'MODULE_NOT_FOUND' ;
throw e ;
}
return map [ req ] ;
}
webpackContext . keys = function webpackContextKeys ( ) {
return Object . keys ( map ) ;
} ;
webpackContext . resolve = webpackContextResolve ;
module . exports = webpackContext ;
webpackContext . id = "../lang sync recursive ^\\.\\/.*\\/answer$" ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ } ) ,
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/***/ "../lang sync recursive ^\\.\\/.*\\/general$" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / lang / sync ^ \ . \ / . * \ / general$ * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module , _ _unused _webpack _exports , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
var map = {
"./fr/general" : "../lang/fr/general.js"
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
function webpackContext ( req ) {
var id = webpackContextResolve ( req ) ;
return _ _webpack _require _ _ ( id ) ;
}
function webpackContextResolve ( req ) {
if ( ! _ _webpack _require _ _ . o ( map , req ) ) {
var e = new Error ( "Cannot find module '" + req + "'" ) ;
e . code = 'MODULE_NOT_FOUND' ;
throw e ;
}
return map [ req ] ;
}
webpackContext . keys = function webpackContextKeys ( ) {
return Object . keys ( map ) ;
2020-08-07 12:23:59 +02:00
} ;
2021-07-05 12:12:51 +02:00
webpackContext . resolve = webpackContextResolve ;
module . exports = webpackContext ;
webpackContext . id = "../lang sync recursive ^\\.\\/.*\\/general$" ;
2020-08-07 12:23:59 +02:00
/***/ } ) ,
2021-07-05 12:12:51 +02:00
/***/ "../views sync recursive ^\\.\\/.*\\.js$" :
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . . / views / sync ^ \ . \ / . * \ . js$ * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
/***/ ( function ( module , _ _unused _webpack _exports , _ _webpack _require _ _ ) {
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
var map = {
"./default/config/fr.js" : "../views/default/config/fr.js" ,
"./wikilerni/config/fr.js" : "../views/wikilerni/config/fr.js"
2020-08-07 12:23:59 +02:00
} ;
2021-07-05 12:12:51 +02:00
function webpackContext ( req ) {
var id = webpackContextResolve ( req ) ;
return _ _webpack _require _ _ ( id ) ;
}
function webpackContextResolve ( req ) {
if ( ! _ _webpack _require _ _ . o ( map , req ) ) {
var e = new Error ( "Cannot find module '" + req + "'" ) ;
e . code = 'MODULE_NOT_FOUND' ;
throw e ;
}
return map [ req ] ;
}
webpackContext . keys = function webpackContextKeys ( ) {
return Object . keys ( map ) ;
} ;
webpackContext . resolve = webpackContextResolve ;
module . exports = webpackContext ;
webpackContext . id = "../views sync recursive ^\\.\\/.*\\.js$" ;
/***/ } )
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
/******/ } ) ;
/************************************************************************/
/******/ // The module cache
/******/ var _ _webpack _module _cache _ _ = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/ // Check if module is in cache
/******/ var cachedModule = _ _webpack _module _cache _ _ [ moduleId ] ;
/******/ if ( cachedModule !== undefined ) {
/******/ return cachedModule . exports ;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = _ _webpack _module _cache _ _ [ moduleId ] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports : { }
/******/ } ;
/******/
/******/ // Execute the module function
/******/ _ _webpack _modules _ _ [ moduleId ] ( module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ ! function ( ) {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ _ _webpack _require _ _ . n = function ( module ) {
/******/ var getter = module && module . _ _esModule ?
/******/ function ( ) { return module [ 'default' ] ; } :
/******/ function ( ) { return module ; } ;
/******/ _ _webpack _require _ _ . d ( getter , { a : getter } ) ;
/******/ return getter ;
/******/ } ;
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/define property getters */
/******/ ! function ( ) {
/******/ // define getter functions for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , definition ) {
/******/ for ( var key in definition ) {
/******/ if ( _ _webpack _require _ _ . o ( definition , key ) && ! _ _webpack _require _ _ . o ( exports , key ) ) {
/******/ Object . defineProperty ( exports , key , { enumerable : true , get : definition [ key ] } ) ;
/******/ }
/******/ }
/******/ } ;
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ ! function ( ) {
/******/ _ _webpack _require _ _ . o = function ( obj , prop ) { return Object . prototype . hasOwnProperty . call ( obj , prop ) ; }
/******/ } ( ) ;
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ ! function ( ) {
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
/******/ } ( ) ;
/******/
/************************************************************************/
var _ _webpack _exports _ _ = { } ;
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
! function ( ) {
2020-08-07 12:23:59 +02:00
"use strict" ;
2021-07-05 12:12:51 +02:00
/ * ! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ! * \
! * * * . / src / questionnaire . js * * * !
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2020-08-07 12:23:59 +02:00
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
2021-07-05 12:12:51 +02:00
/* harmony import */ var _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( /*! ../../config/instance.js */ "../config/instance.js" ) ;
/* harmony import */ var _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
/* harmony import */ var _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ = _ _webpack _require _ _ ( /*! ../../config/questionnaires.js */ "../config/questionnaires.js" ) ;
/* harmony import */ var _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ ) ;
/* harmony import */ var _tools _answers _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ = _ _webpack _require _ _ ( /*! ./tools/answers.js */ "./src/tools/answers.js" ) ;
/* harmony import */ var _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ = _ _webpack _require _ _ ( /*! ./tools/dom.js */ "./src/tools/dom.js" ) ;
/* harmony import */ var _tools _everywhere _js _ _WEBPACK _IMPORTED _MODULE _4 _ _ = _ _webpack _require _ _ ( /*! ./tools/everywhere.js */ "./src/tools/everywhere.js" ) ;
/* harmony import */ var _tools _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _5 _ _ = _ _webpack _require _ _ ( /*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js" ) ;
/* harmony import */ var _tools _forms _js _ _WEBPACK _IMPORTED _MODULE _6 _ _ = _ _webpack _require _ _ ( /*! ./tools/forms.js */ "./src/tools/forms.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _7 _ _ = _ _webpack _require _ _ ( /*! ../../tools/main */ "../tools/main.js" ) ;
/* harmony import */ var _tools _main _ _WEBPACK _IMPORTED _MODULE _7 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( _tools _main _ _WEBPACK _IMPORTED _MODULE _7 _ _ ) ;
/* harmony import */ var _tools _matomo _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ = _ _webpack _require _ _ ( /*! ./tools/matomo.js */ "./src/tools/matomo.js" ) ;
/* harmony import */ var _tools _users _js _ _WEBPACK _IMPORTED _MODULE _9 _ _ = _ _webpack _require _ _ ( /*! ./tools/users.js */ "./src/tools/users.js" ) ;
// -- GESTION DU FORMULAIRE PERMETTANT D'AFFICHER ET RÉPONDRE À UN QUIZ
/// 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 :
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const lang = _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . availableLangs [ 0 ] ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const configTemplate = _ _webpack _require _ _ ( "../views sync recursive ^\\.\\/.*\\.js$" ) ( "./" + _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . theme + "/config/" + lang + ".js" ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
// Dictionnaires :
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const {
noPreviousAnswer ,
previousAnswersLine ,
previousAnswersStats ,
previousAnswersTitle ,
responseSavedError ,
wantToSaveResponses
} = _ _webpack _require _ _ ( "../lang sync recursive ^\\.\\/.*\\/answer$" ) ( "./" + lang + "/answer" ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const {
serverError
} = _ _webpack _require _ _ ( "../lang sync recursive ^\\.\\/.*\\/general$" ) ( "./" + lang + "/general" ) ; // Principaux éléments du DOM manipulés :
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const myForm = document . getElementById ( "questionnaire" ) ;
const divResponse = document . getElementById ( "response" ) ;
const btnShow = document . getElementById ( "showQuestionnaire" ) ;
const btnSubmit = document . getElementById ( "checkResponses" ) ;
const explanationsTitle = document . getElementById ( "explanationsTitle" ) ;
const explanationsContent = document . getElementById ( "explanationsContent" ) ;
let isConnected , user ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const initialise = async ( ) => {
try {
btnShow . style . display = "inline" ; // bouton caché si JS inactif, car JS nécessaire pour vérifier les réponses
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
isConnected = await ( 0 , _tools _users _js _ _WEBPACK _IMPORTED _MODULE _9 _ _ . 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
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( isConnected ) {
user = ( 0 , _tools _clientstorage _js _ _WEBPACK _IMPORTED _MODULE _5 _ _ . getLocaly ) ( "user" , true ) ;
( 0 , _tools _everywhere _js _ _WEBPACK _IMPORTED _MODULE _4 _ _ . updateAccountLink ) ( user . status , configTemplate ) ; // lien vers le compte adapté pour les utilisateurs connectés
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
checkPreviousResponses ( user ) ;
} else ( 0 , _tools _matomo _js _ _WEBPACK _IMPORTED _MODULE _8 _ _ . loadMatomo ) ( ) ;
} catch ( e ) {
console . error ( e ) ;
}
2020-08-07 12:23:59 +02:00
} ;
2021-07-05 12:12:51 +02:00
initialise ( ) ;
( 0 , _tools _everywhere _js _ _WEBPACK _IMPORTED _MODULE _4 _ _ . helloDev ) ( ) ; // 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.
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const showQuestionnaire = ( ) => {
chronoBegin = Date . now ( ) ;
myForm . style . display = "block" ;
btnShow . style . display = "none" ;
const here = window . location ; // window.location à ajouter pour ne pas quitter la page en mode "preview".
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
if ( window . location . hash !== "" ) {
window . location . hash = "" ; // ! le "#" reste
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
window . location . assign ( here + "questionnaire" ) ;
} else window . location . assign ( here + "#questionnaire" ) ;
} ;
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
let chronoBegin = 0 ;
btnShow . addEventListener ( "click" , function ( e ) {
try {
e . preventDefault ( ) ;
showQuestionnaire ( ) ;
} catch ( e ) {
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
console . error ( e ) ;
}
} ) ; // Lien passé par mail pour voir directement le quiz
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
if ( location . hash != "" && location . hash === "#questionnaire" ) showQuestionnaire ( ) ; // Traitement de l'envoi de la réponse de l'utilisateur :
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
let answer = { } ;
myForm . addEventListener ( "submit" , function ( e ) {
try {
e . preventDefault ( ) ;
btnSubmit . style . display = "none" ; // seulement un envoi à la fois, SVP :)
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
divResponse . innerHTML = "" ; // supprime les éventuels messages déjà affichés
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
const userResponses = ( 0 , _tools _forms _js _ _WEBPACK _IMPORTED _MODULE _6 _ _ . 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 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.
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
let idChoice ,
idQuestion = "" ,
goodResponse = false ;
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
for ( let item in userResponses ) {
if ( item . startsWith ( "isCorrect_response_" ) ) // = Nouvelle réponse possible.
{
idChoice = item . substring ( item . lastIndexOf ( "_" ) + 1 ) ; // si on change de queston
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
if ( userResponses [ "question_id_response_" + idChoice ] != idQuestion ) // on commence à traiter une nouvelle question
{
idQuestion = userResponses [ "question_id_response_" + idChoice ] ;
answer . nbQuestions ++ ;
if ( goodResponse ) // résultat de la question précédente
answer . nbCorrectAnswers ++ ;
goodResponse = true ; // réponse bonne jusqu'à la première erreur...
}
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
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" ) // réponse cochée ne faisant pas partie des bonnes
{
goodResponse = false ;
document . getElementById ( "response_" + idChoice ) . parentNode . classList . add ( "isNotCorrect" ) ;
}
}
}
} // si j'ai bien répondu à la dernière question, il faut le compter ici, car je suis sorti de la boucle :
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
if ( goodResponse ) answer . nbCorrectAnswers ++ ; // Affichage du résultat, suivant si l'utilisateur est connecté ou pas et son score :
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
let getOuput = ( 0 , _tools _answers _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . checkAnswerOuput ) ( answer ) ;
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
if ( isConnected ) {
// Si l'utilisateur est connecté, on enregistre son résultat sur le serveur.
const xhrSaveAnswer = new XMLHttpRequest ( ) ;
xhrSaveAnswer . open ( "POST" , _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . apiUrl + _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . questionnaireRoutes + _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . saveAnswersRoute ) ;
2020-08-14 17:15:06 +02:00
2021-07-05 12:12:51 +02:00
xhrSaveAnswer . onreadystatechange = function ( ) {
if ( this . readyState == XMLHttpRequest . DONE ) {
let xhrResponse = JSON . parse ( this . responseText ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( this . status === 201 && xhrResponse . message ) {
getOuput += "<br>" + xhrResponse . message . replace ( "#URL" , configTemplate . userHomePage ) ;
checkPreviousResponses ( user ) ;
} else getOuput += "<br>" + responseSavedError . replace ( "#URL" , configTemplate . userHomePage ) ; // on redirige vers le résultat
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
window . location . hash = "" ;
const here = window . location ; // window.location à ajouter pour ne pas quitter la page en mode "preview"...
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
window . location . assign ( here + "explanations" ) ;
}
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
xhrSaveAnswer . setRequestHeader ( "Authorization" , "Bearer " + user . token ) ;
xhrSaveAnswer . setRequestHeader ( "Content-Type" , "application/json" ) ;
answer . timeDifference = ( 0 , _tools _users _js _ _WEBPACK _IMPORTED _MODULE _9 _ _ . getTimeDifference ) ( ) ; // on en profite pour mettre les pendules à l'heure.
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
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.
if ( ( 0 , _tools _answers _js _ _WEBPACK _IMPORTED _MODULE _2 _ _ . saveAnswer ) ( answer ) ) {
getOuput += "<br><br>" + wantToSaveResponses ;
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( divResponse , "p" , getOuput , "" , [ "info" ] ) ;
document . querySelector ( ".subscribeBtns" ) . style . display = "block" ;
} else // inutile de proposer de créer un compte si le stockage local ne fonctionne pas
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( divResponse , "p" , getOuput , "" , [ "info" ] ) ; // on redirige vers le résultat
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
window . location . hash = "" ;
const here = window . location ; // window.location à ajouter pour ne pas quitter la page en mode "preview"...
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
window . location . assign ( here + "response" ) ;
} // + affichage des textes d'explications pour chaque question
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
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" ;
2020-08-07 12:23:59 +02:00
}
2021-07-05 12:12:51 +02:00
} catch ( e ) {
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( divResponse , "p" , serverError , "" , [ "error" ] ) ;
console . error ( e ) ;
2020-08-07 12:23:59 +02:00
}
2021-07-05 12:12:51 +02:00
} ) ; // 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
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
const checkPreviousResponses = user => {
const xhrPreviousRes = new XMLHttpRequest ( ) ;
xhrPreviousRes . open ( "GET" , _config _instance _js _ _WEBPACK _IMPORTED _MODULE _0 _ _ . apiUrl + _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . questionnaireRoutes + _config _questionnaires _js _ _WEBPACK _IMPORTED _MODULE _1 _ _ . getPreviousAnswers + user . id + "/" + document . getElementById ( "questionnaireId" ) . value ) ;
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
xhrPreviousRes . onreadystatechange = function ( ) {
if ( this . readyState == XMLHttpRequest . DONE ) {
let response = JSON . parse ( this . responseText ) ;
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
if ( this . status === 200 ) {
const nbResponses = response . length ;
let previousAnswersContent = "" ;
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( explanationsTitle , "span" , previousAnswersTitle . replace ( "#NOM" , user . name ) ) ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
if ( nbResponses !== 0 ) {
let totNbQuestions = 0 ,
totNbCorrectAnswers = 0 ,
totDuration = 0 ,
mapLineContent ;
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
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.
2021-03-01 13:02:07 +01:00
2021-07-05 12:12:51 +02:00
totNbCorrectAnswers += response [ i ] . nbCorrectAnswers ;
totDuration += response [ i ] . duration ;
mapLineContent = {
DATEANSWER : ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _7 _ _ . dateFormat ) ( response [ i ] . createdAt , lang ) ,
NBCORRECTANSWERS : response [ i ] . nbCorrectAnswers ,
NBQUESTIONS : response [ i ] . nbQuestions ,
AVGDURATION : response [ i ] . duration
} ;
previousAnswersContent += "<li>" + ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _7 _ _ . replaceAll ) ( previousAnswersLine , mapLineContent ) + "</li>" ;
2021-03-01 13:02:07 +01:00
}
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
mapLineContent = {
AVGDURATION : Math . round ( totDuration / nbResponses ) ,
AVGCORRECTANSWERS : Math . round ( totNbCorrectAnswers / totNbQuestions * 100 )
} ;
previousAnswersContent = "<h5>" + ( 0 , _tools _main _ _WEBPACK _IMPORTED _MODULE _7 _ _ . replaceAll ) ( previousAnswersStats , mapLineContent ) + "</h5>" + previousAnswersContent ;
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( explanationsContent , "ul" , previousAnswersContent ) ;
} else ( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( explanationsContent , "ul" , noPreviousAnswer ) ; // dans un cas comme dans l'autre, bouton pour revenir à l'accueil du compte
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
( 0 , _tools _dom _js _ _WEBPACK _IMPORTED _MODULE _3 _ _ . addElement ) ( explanationsContent , "p" , "<a href=\"/" + configTemplate . userHomePage + "\" class=\"button cardboard\">" + configTemplate . userHomePageTxt + "</a>" , "" , [ "btn" ] , "" , false ) ;
2021-03-01 13:02:07 +01:00
}
}
2021-07-05 12:12:51 +02:00
} ;
2020-08-07 12:23:59 +02:00
2021-07-05 12:12:51 +02:00
xhrPreviousRes . setRequestHeader ( "Authorization" , "Bearer " + user . token ) ;
xhrPreviousRes . send ( ) ;
2020-08-07 12:23:59 +02:00
} ;
2021-07-05 12:12:51 +02:00
} ( ) ;
/******/ } ) ( )
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aWtpbGVybmkvLi4vY29uZmlnL2luc3RhbmNlLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvbWF0b21vLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9jb25maWcvcXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2NvbmZpZy91c2Vycy5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvY29uZmlnL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4vc3JjL3Rvb2xzL2Fuc3dlcnMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4vc3JjL3Rvb2xzL21hdG9tby5qcyIsIndlYnBhY2s6Ly93aWtpbGVybmkvLi9zcmMvdG9vbHMvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL2xhbmcvZnIvYW5zd2VyLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi9sYW5nL2ZyL2dlbmVyYWwuanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4uL3ZpZXdzL2RlZmF1bHQvY29uZmlnL2ZyLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8uLi92aWV3cy93aWtpbGVybmkvY29uZmlnL2ZyLmpzIiwid2VicGFjazovL3dpa2lsZXJuaS8vaG9tZS9mYWJyaWNlL0RvY3VtZW50cy9CaWRvdWlsbGVzL3dpa2lsZXJuaS9sYW5nfHN5bmN8L15cXC5cXC8uKlxcL2Fuc3dlciQvIiwid2VicGFjazovL3dpa2lsZXJuaS8vaG9tZS9mYWJyaWNlL0RvY3VtZW50cy9CaWRvdWlsbGVzL3dpa2lsZXJuaS9sYW5nfHN5bmN8L15cXC5cXC8uKlxcL2dlbmVyYWwkLyIsIndlYnBhY2s6Ly93aWtpbGVybmkvL2hvbWUvZmFicmljZS9Eb2N1bWVudHMvQmlkb3VpbGxlcy93aWtpbGVybmkvdmlld3N8c3luY3wvXlxcLlxcLy4qXFwuanMkLyIsIndlYnBhY2s6Ly93aWtpbGVybmkvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3dpa2lsZXJuaS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vd2lraWxlcm5pLy4vc3JjL3F1ZXN0aW9ubmFpcmUuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJkZWZhdWx0UmVjZWlwdERheXMiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiZmllbGROZXdRdWVzdGlvbm5haXJlcyIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXgiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmRNaW5MZW5ndGgiLCJwYXNzd29yZCIsIm1pbmxlbmd0aCIsImRpckNhY2hlVXNlcnMiLCJkaXJDYWNoZVVzZXJzQW5zd2VycyIsImRpckNhY2hlUXVlc3Rpb25uYWlyZXMiLCJkaXJDYWNoZVF1ZXN0aW9ucyIsImRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyIsImRpckhUTUxRdWVzdGlvbm5haXJlcyIsImRpcldlYlF1ZXN0aW9ubmFpcmVzIiwibWF0b21vIiwidXJsIiwic2l0ZUlkIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJyZWdlbmVyYXRlSFRNTCIsInNlYXJ