Revue de la page d'accueil de l'abonné.
This commit is contained in:
parent
fc7949fabe
commit
8ce66d7981
@ -398,7 +398,7 @@ const creaStatsGroupsJson = async () =>
|
|||||||
const stats =
|
const stats =
|
||||||
{
|
{
|
||||||
nbTot : Groups.length,
|
nbTot : Groups.length,
|
||||||
nbPublished : GroupsPublished.length, // ! en fait, peuvent être passé de date et non publié : À REVOIR QUAND DES EXEMPLES EN BD!
|
nbPublished : GroupsPublished.length, // ! en fait, peuvent être passé de date et non publié
|
||||||
nbQuestionnaires : QuestionnairesInGroups.length
|
nbQuestionnaires : QuestionnairesInGroups.length
|
||||||
}
|
}
|
||||||
await toolFile.createJSON(configQuestionnaires.dirCacheGroups, "stats", stats);
|
await toolFile.createJSON(configQuestionnaires.dirCacheGroups, "stats", stats);
|
||||||
|
@ -195,7 +195,7 @@ exports.showOneQuestionnaireById = async (req, res, next) =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recherche par mots-clés parmis tous les questionnaires publiés en filtrant parmi ceux auxquels l'abonné a déjà répondu ou pas
|
// Recherche par mots-clés parmis tous les questionnaires publiés associés à un groupe
|
||||||
// Seul un certain nombre de résultats est renvoyé (pagination)
|
// Seul un certain nombre de résultats est renvoyé (pagination)
|
||||||
exports.searchQuestionnaires = async (req, res, next) =>
|
exports.searchQuestionnaires = async (req, res, next) =>
|
||||||
{
|
{
|
||||||
@ -207,11 +207,7 @@ exports.searchQuestionnaires = async (req, res, next) =>
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const db = require("../models/index");
|
const db = require("../models/index");
|
||||||
let getQuestionnaires;
|
const getQuestionnaires = await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE (`title` LIKE :search OR `keywords` LIKE :search) AND `isPublished` = 1 AND GroupId IS NOT NULL", { replacements: { search: "%"+search+"%" }, type: QueryTypes.SELECT });
|
||||||
if(!tool.isEmpty(req.body.onlyAnswers) && !tool.isEmpty(req.connectedUser.User.id))
|
|
||||||
getQuestionnaires=await db.sequelize.query("SELECT DISTINCT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `Answers` WHERE `Answers`.`QuestionnaireId`=`Questionnaires`.`id` AND `Answers`.`UserId`=:id AND (`title` LIKE :search OR `keywords` LIKE :search) AND `isPublished` = 1", { replacements: { id:req.connectedUser.User.id, search: "%"+search+"%" }, type: QueryTypes.SELECT });
|
|
||||||
else
|
|
||||||
getQuestionnaires=await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE (`title` LIKE :search OR `keywords` LIKE :search) AND `isPublished` = 1", { replacements: { search: "%"+search+"%" }, type: QueryTypes.SELECT });
|
|
||||||
let begin=0, end, output="";
|
let begin=0, end, output="";
|
||||||
if(!tool.isEmpty(req.body.begin))
|
if(!tool.isEmpty(req.body.begin))
|
||||||
begin=parseInt(req.body.begin, 10);
|
begin=parseInt(req.body.begin, 10);
|
||||||
@ -229,19 +225,14 @@ exports.searchQuestionnaires = async (req, res, next) =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recherche aléatoire parmi tous les questionnaires publiés
|
// Recherche aléatoire parmi tous les questionnaires publiés associés à un groupe
|
||||||
// De nouveau on peut filtrer ou non ceux auxquels l'utilisateur a répondu
|
// Ici pas de pagination car on maîtrise le nombre de résultats envoyés
|
||||||
// Par contre, ici pas de pagination car on maîtrise le nombre de résultats envoyés
|
|
||||||
exports.getRandomQuestionnaires = async (req, res, next) =>
|
exports.getRandomQuestionnaires = async (req, res, next) =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
const db = require("../models/index");
|
const db = require("../models/index");
|
||||||
let getQuestionnaires;
|
const getQuestionnaires=await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE `isPublished` = 1 AND GroupId IS NOT NULL ORDER BY RAND() LIMIT "+configQuestionnaires.nbRandomResults, { type: QueryTypes.SELECT });
|
||||||
if(!tool.isEmpty(req.body.onlyAnswers) && !tool.isEmpty(req.connectedUser.User.id))
|
|
||||||
getQuestionnaires=await db.sequelize.query("SELECT DISTINCT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `Answers` WHERE `Answers`.`QuestionnaireId`=`Questionnaires`.`id` AND `Answers`.`UserId`=:id AND `isPublished` = 1 ORDER BY RAND() LIMIT "+configQuestionnaires.nbRandomResults, { replacements: { id:req.connectedUser.User.id }, type: QueryTypes.SELECT });
|
|
||||||
else
|
|
||||||
getQuestionnaires=await db.sequelize.query("SELECT `id` FROM `Questionnaires` WHERE `isPublished` = 1 ORDER BY RAND() LIMIT "+configQuestionnaires.nbRandomResults, { type: QueryTypes.SELECT });
|
|
||||||
let begin=0, end;
|
let begin=0, end;
|
||||||
end=begin+configTpl.nbQuestionnairesUserHomePage-1;
|
end=begin+configTpl.nbQuestionnairesUserHomePage-1;
|
||||||
datas=await getListingsQuestionnairesOuput(getQuestionnaires, begin, end, "html");
|
datas=await getListingsQuestionnairesOuput(getQuestionnaires, begin, end, "html");
|
||||||
@ -732,18 +723,22 @@ const creaNewQuestionnairesJson = async () =>
|
|||||||
}
|
}
|
||||||
exports.creaNewQuestionnairesJson = creaNewQuestionnairesJson;
|
exports.creaNewQuestionnairesJson = creaNewQuestionnairesJson;
|
||||||
|
|
||||||
// Se limite à compter le nombre total de questionnaires et à le stocker pour éviter de lancer une requête sql à chaque fois
|
// Se limite à compter le nombre total de questionnaires non groupés et à le stocker pour éviter de lancer une requête sql à chaque fois
|
||||||
const creaStatsQuestionnairesJson = async () =>
|
const creaStatsQuestionnairesJson = async () =>
|
||||||
{
|
{
|
||||||
const db = require("../models/index");
|
const db = require("../models/index");
|
||||||
const Questionnaires=await db["Questionnaire"].findAll({ attributes: ["id"] });
|
const Questionnaires=await db.sequelize.query("SELECT DISTINCT `id` FROM `Questionnaires`", { type: QueryTypes.SELECT });
|
||||||
const QuestionnairesPublished=await db["Questionnaire"].findAll({ where: { isPublished : true }, attributes: ["id"] });
|
const QuestionnairesPublished=await db.sequelize.query("SELECT DISTINCT `id` FROM `Questionnaires` WHERE `isPublished`=1", { type: QueryTypes.SELECT });
|
||||||
|
const QuestionnairesWithoutGroup=await db.sequelize.query("SELECT DISTINCT `id` FROM `Questionnaires` WHERE `GroupId` IS NULL", { type: QueryTypes.SELECT });
|
||||||
|
const QuestionnairesWithoutGroupPublished=await db.sequelize.query("SELECT DISTINCT `id` FROM `Questionnaires` WHERE `GroupId` IS NULL AND `isPublished`=1", { type: QueryTypes.SELECT });
|
||||||
if(Questionnaires && QuestionnairesPublished)
|
if(Questionnaires && QuestionnairesPublished)
|
||||||
{
|
{
|
||||||
const stats =
|
const stats =
|
||||||
{
|
{
|
||||||
nbTot : Questionnaires.length,
|
nbTot : Questionnaires.length,
|
||||||
nbPublished : QuestionnairesPublished.length
|
nbPublished : QuestionnairesPublished.length,
|
||||||
|
nbTotWithoutGroup : QuestionnairesWithoutGroup.length,
|
||||||
|
nbWithoutGroupPublished : QuestionnairesWithoutGroupPublished.length
|
||||||
}
|
}
|
||||||
await toolFile.createJSON(config.dirCacheQuestionnaires, "stats", stats);
|
await toolFile.createJSON(config.dirCacheQuestionnaires, "stats", stats);
|
||||||
return stats;
|
return stats;
|
||||||
|
@ -51,14 +51,17 @@ exports.getQuestionnairesForUser = async(req, res, next) =>
|
|||||||
err.message=txtGeneral.neededParams;
|
err.message=txtGeneral.neededParams;
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
const questionnaires = await db.sequelize.query("SELECT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `QuestionnaireAccesses` ON `QuestionnaireAccesses`.`QuestionnaireId`=`Questionnaires`.`id` AND `QuestionnaireAccesses`.`UserId`=:id ORDER BY `QuestionnaireAccesses`.`createdAt` DESC LIMIT :begin,:nb", { replacements: { id:req.params.id, begin:req.params.begin, nb:req.params.nb }, type: QueryTypes.SELECT });
|
const db = require("../models/index");
|
||||||
|
const questionnaires = await db.sequelize.query("SELECT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `QuestionnaireAccesses` ON `QuestionnaireAccesses`.`QuestionnaireId`=`Questionnaires`.`id` AND `QuestionnaireAccesses`.`UserId`=:id ORDER BY `QuestionnaireAccesses`.`createdAt` DESC LIMIT :begin,:nb", { replacements: { id: req.params.id, begin: parseInt(req.params.begin), nb: parseInt(req.params.nb) }, type: QueryTypes.SELECT });
|
||||||
// je vais chercher les infos dans les json car ma vue a besoin des infos présentées de cette manière
|
// je vais chercher les infos dans les json car ma vue a besoin des infos présentées de cette manière
|
||||||
const datas=[];
|
const datas=[];
|
||||||
for(let i in questionnaires)
|
for(let i in questionnaires)
|
||||||
datas.push(await questionnaireCtrl.searchQuestionnaireById(questionnaires[i].id, true));
|
datas.push(await questionnaireCtrl.searchQuestionnaireById(questionnaires[i].id, true));
|
||||||
if(req.params.output !== undefined && req.params.output == "html")
|
if(req.params.output !== undefined && req.params.output == "html")
|
||||||
{
|
{
|
||||||
if(datas.length !== 0)
|
const output={};
|
||||||
|
output.nbTot=datas.length;
|
||||||
|
if(output.nbTot !== 0)
|
||||||
{
|
{
|
||||||
const pug = require("pug");
|
const pug = require("pug");
|
||||||
const striptags = require("striptags");
|
const striptags = require("striptags");
|
||||||
@ -73,11 +76,9 @@ exports.getQuestionnairesForUser = async(req, res, next) =>
|
|||||||
questionnaires: datas,
|
questionnaires: datas,
|
||||||
nbQuestionnairesList:configTpl.nbQuestionnairesUserHomePage
|
nbQuestionnairesList:configTpl.nbQuestionnairesUserHomePage
|
||||||
}
|
}
|
||||||
datas.html=await compiledFunction(pageDatas);
|
output.html=await compiledFunction(pageDatas);
|
||||||
}
|
}
|
||||||
else
|
res.status(200).json(output);
|
||||||
datas.html="";
|
|
||||||
res.status(200).json(datas);
|
|
||||||
}
|
}
|
||||||
else// on retourne seulement les données
|
else// on retourne seulement les données
|
||||||
res.status(200).json(datas);
|
res.status(200).json(datas);
|
||||||
|
@ -42,18 +42,15 @@
|
|||||||
<img id="logo" src="/themes/wikilerni/img/wikilerni-purple-2-512.png" alt="Logo WikiLerni" />
|
<img id="logo" src="/themes/wikilerni/img/wikilerni-purple-2-512.png" alt="Logo WikiLerni" />
|
||||||
<div id="message" class="cardboard"></div>
|
<div id="message" class="cardboard"></div>
|
||||||
|
|
||||||
<h2>Chercher un quiz</h2>
|
<h2>Votre jardin WikiLerni</h2>
|
||||||
<form id="search" method="POST">
|
<form id="search" method="POST">
|
||||||
<input id="searchQuestionnaires" type="text" name="searchQuestionnaires" placeholder="Votre recherche" class="cardboard" />
|
<input id="searchQuestionnaires" type="text" name="searchQuestionnaires" placeholder="Votre recherche" class="cardboard" />
|
||||||
<input id="begin" type="hidden" name="begin" value="0">
|
<input id="begin" type="hidden" name="begin" value="0">
|
||||||
<div class="line"><label for="onlyAnswers" class="check"><input type="checkbox" id="onlyAnswers" name="onlyAnswers" /><div class="checkbox_override"></div> Parmi mes réponses.</li></div>
|
<!--<div class="line"><label for="onlyAnswers" class="check"><input type="checkbox" id="onlyAnswers" name="onlyAnswers" /><div class="checkbox_override"></div> Parmi mes lectures.</li></div>-->
|
||||||
<input type="submit" value="Chercher" class="cardboard" /><br>
|
<input type="submit" value="Chercher" class="cardboard" /><br>
|
||||||
<button type="button" id="random" class="button cardboard">Au hasard !</button>
|
<button type="button" id="random" class="button cardboard">Au hasard !</button>
|
||||||
</form>
|
</form>
|
||||||
|
<h4 id="quizsIntro"></h4>
|
||||||
|
|
||||||
<h2 id="quizsTitle">Les quizs attendant votre réponse</h2>
|
|
||||||
<div id="quizsIntro"></div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="quizs">
|
<div id="quizs">
|
||||||
|
@ -11,7 +11,8 @@
|
|||||||
import { apiUrl, availableLangs, theme } from "../../config/instance.js";
|
import { apiUrl, availableLangs, theme } from "../../config/instance.js";
|
||||||
const lang=availableLangs[0];
|
const lang=availableLangs[0];
|
||||||
const configTemplate = require("../../views/"+theme+"/config/"+lang+".js");
|
const configTemplate = require("../../views/"+theme+"/config/"+lang+".js");
|
||||||
const { getQuestionnairesWithoutAnswer, getRandomQuestionnairesRoute, getStatsAnswers, questionnaireRoutes, searchQuestionnaires, searchQuestionnairesRoute } = require("../../config/questionnaires");
|
const { getRandomQuestionnairesRoute, getStatsAnswers, questionnaireRoutes, searchQuestionnaires, searchQuestionnairesRoute } = require("../../config/questionnaires");
|
||||||
|
const { getUsersQuestionnairesRoute, userRoutes } = require("../../config/users");
|
||||||
|
|
||||||
// Fonctions utiles au script :
|
// Fonctions utiles au script :
|
||||||
import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js";
|
import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js";
|
||||||
@ -22,16 +23,16 @@ import { isEmpty, replaceAll } from "../../tools/main";
|
|||||||
import { checkSession } from "./tools/users.js";
|
import { checkSession } from "./tools/users.js";
|
||||||
|
|
||||||
// Dictionnaires :
|
// Dictionnaires :
|
||||||
const { nbQuestionnaireWithoudAnswer, noQuestionnaireWithoudAnswer, statsUser } = require("../../lang/"+lang+"/answer");
|
const { statsUser } = require("../../lang/"+lang+"/answer");
|
||||||
const { nextPage, previousPage, serverError } = require("../../lang/"+lang+"/general");
|
const { nextPage, previousPage, serverError } = require("../../lang/"+lang+"/general");
|
||||||
const { searchQuestionnaireResultTitle, searchQuestionnaireWithResult, searchQuestionnaireWithNoResult } = require("../../lang/"+lang+"/questionnaire");
|
const { searchQuestionnaireWithResult, searchQuestionnaireWithNoResult } = require("../../lang/"+lang+"/questionnaire");
|
||||||
|
const { lastQuestionnairesForUser, noQuestionnaireAccess } = require("../../lang/"+lang+"/questionnaireaccess");
|
||||||
const { needBeConnected, welcomeMessage } = require("../../lang/"+lang+"/user");
|
const { needBeConnected, welcomeMessage } = require("../../lang/"+lang+"/user");
|
||||||
|
|
||||||
// Principaux éléments du DOM manipulés :
|
// Principaux éléments du DOM manipulés :
|
||||||
const divMain= document.getElementById("main-content");
|
const divMain= document.getElementById("main-content");
|
||||||
const divCrash= document.getElementById("crash");
|
const divCrash= document.getElementById("crash");
|
||||||
const divMessage = document.getElementById("message");
|
const divMessage = document.getElementById("message");
|
||||||
const quizTitle = document.getElementById("quizsTitle");
|
|
||||||
const quizIntro = document.getElementById("quizsIntro");
|
const quizIntro = document.getElementById("quizsIntro");
|
||||||
const quizListing = document.getElementById("quizsList");
|
const quizListing = document.getElementById("quizsList");
|
||||||
const quizPaginationPrevious = document.getElementById("previous");
|
const quizPaginationPrevious = document.getElementById("previous");
|
||||||
@ -71,25 +72,30 @@ const initialise = async () =>
|
|||||||
let response=JSON.parse(this.responseText);
|
let response=JSON.parse(this.responseText);
|
||||||
if (this.status === 200 && !isEmpty(response.nbAnswers) && response.nbAnswers!==0)// pas de stats si aucune réponse !
|
if (this.status === 200 && !isEmpty(response.nbAnswers) && response.nbAnswers!==0)// pas de stats si aucune réponse !
|
||||||
{
|
{
|
||||||
|
let txtIntro="";
|
||||||
const mapText =
|
const mapText =
|
||||||
{
|
{
|
||||||
NBANSWERS : response.nbAnswers,
|
NBANSWERS : response.nbAnswers,
|
||||||
NBQUESTIONNAIRES : response.nbQuestionnaires,
|
NBQUESTIONNAIRES : response.nbQuestionnaires,
|
||||||
NBTOTQUESTIONNAIRES : response.general.nbPublished,
|
NBTOTQUESTIONNAIRES : response.groups.nbPublished+response.questionnaires.nbWithoutGroupPublished,
|
||||||
AVGDURATION : response.avgDuration,
|
AVGDURATION : response.avgDuration,
|
||||||
AVGCORRECTANSWERS : response.avgCorrectAnswers
|
AVGCORRECTANSWERS : response.avgCorrectAnswers
|
||||||
};
|
};
|
||||||
addElement(divMessage, "p", replaceAll(statsUser, mapText), "", "", "", false);
|
// La situation est plurielle...
|
||||||
|
txtIntro=replaceAll(statsUser, mapText);
|
||||||
|
txtIntro=(response.nbAnswers > 1) ? txtIntro.replace("S1", "s") : txtIntro.replace("S1", "");
|
||||||
|
txtIntro=(response.nbQuestionnaires > 1) ? txtIntro.replace("S2", "s").replace("S3", "s") : txtIntro.replace("S2", "").replace("S3", "s");
|
||||||
|
txtIntro=(mapText.NBTOTQUESTIONNAIRES > 1) ? txtIntro.replace("S4", "s") : txtIntro.replace("S4", "");
|
||||||
|
addElement(divMessage, "p", txtIntro, "", "", "", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xhrStats.setRequestHeader("Authorization", "Bearer "+user.token);
|
xhrStats.setRequestHeader("Authorization", "Bearer "+user.token);
|
||||||
xhrStats.send();
|
xhrStats.send();
|
||||||
|
|
||||||
/*
|
// Par défaut, on affiche des derniers éléments supposés lus par l'utilisateur :
|
||||||
// Par défaut, on affiche des derniers quizs proposés sans réponse :
|
|
||||||
const xhrLastQuizs = new XMLHttpRequest();
|
const xhrLastQuizs = new XMLHttpRequest();
|
||||||
xhrLastQuizs.open("GET", apiUrl+questionnaireRoutes+getQuestionnairesWithoutAnswer+""+user.id+"/"+0+"/"+configTemplate.nbQuestionnairesUserHomePage+"/html");
|
xhrLastQuizs.open("GET", apiUrl+userRoutes+getUsersQuestionnairesRoute+""+user.id+"/"+0+"/"+configTemplate.nbQuestionnairesUserHomePage+"/html");
|
||||||
xhrLastQuizs.onreadystatechange = function()
|
xhrLastQuizs.onreadystatechange = function()
|
||||||
{
|
{
|
||||||
if (this.readyState == XMLHttpRequest.DONE)
|
if (this.readyState == XMLHttpRequest.DONE)
|
||||||
@ -98,13 +104,11 @@ const initialise = async () =>
|
|||||||
if (this.status === 200)
|
if (this.status === 200)
|
||||||
{
|
{
|
||||||
if(response.nbTot === 0)
|
if(response.nbTot === 0)
|
||||||
addElement(quizIntro, "p", noQuestionnaireWithoudAnswer, "", ["success"]);
|
addElement(quizIntro, "p", noQuestionnaireAccess, "", ["info"]);
|
||||||
else if(response.html)
|
else if(response.html)
|
||||||
{
|
{
|
||||||
addElement(quizIntro, "p", nbQuestionnaireWithoudAnswer.replace("#NB", response.questionnaires.length), "", ["info"]);
|
addElement(quizIntro, "p", lastQuestionnairesForUser, "", ["info"]);
|
||||||
quizListing.innerHTML=response.html;
|
quizListing.innerHTML=response.html;
|
||||||
window.location.hash="";// sinon les hash s'enchaînent...
|
|
||||||
window.location.assign("#quizsTitle");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
addElement(quizs, "p", serverError, "", ["error"]);// revoir si intérêt d'afficher quelque chose
|
addElement(quizs, "p", serverError, "", ["error"]);// revoir si intérêt d'afficher quelque chose
|
||||||
@ -114,13 +118,12 @@ const initialise = async () =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
xhrLastQuizs.setRequestHeader("Authorization", "Bearer "+user.token);
|
xhrLastQuizs.setRequestHeader("Authorization", "Bearer "+user.token);
|
||||||
xhrLastQuizs.send();*/
|
xhrLastQuizs.send();
|
||||||
|
|
||||||
// Traitement du lancement d'une recherche
|
// Traitement du lancement d'une recherche
|
||||||
// La recherche peut être lancée via la bouton submit ou un lien de pagination
|
// La recherche peut être lancée via la bouton submit ou un lien de pagination
|
||||||
const sendSearch = (type="search") =>
|
const sendSearch = (type="search") =>
|
||||||
{
|
{
|
||||||
quizTitle.innerHTML=searchQuestionnaireResultTitle;
|
|
||||||
quizListing.innerHTML=""+"";
|
quizListing.innerHTML=""+"";
|
||||||
let datas=getDatasFromInputs(formSearch);
|
let datas=getDatasFromInputs(formSearch);
|
||||||
const xhrSearch = new XMLHttpRequest();
|
const xhrSearch = new XMLHttpRequest();
|
||||||
@ -139,14 +142,16 @@ const initialise = async () =>
|
|||||||
{
|
{
|
||||||
addElement(quizIntro, "p", searchQuestionnaireWithNoResult, "", ["info"]);
|
addElement(quizIntro, "p", searchQuestionnaireWithNoResult, "", ["info"]);
|
||||||
window.location.hash="";// sinon les hash s'enchaînent...
|
window.location.hash="";// sinon les hash s'enchaînent...
|
||||||
window.location.assign("#quizsTitle");
|
window.location.assign("#quizsIntro");
|
||||||
}
|
}
|
||||||
else if(response.html)
|
else if(response.html)
|
||||||
{
|
{
|
||||||
addElement(quizIntro, "p", searchQuestionnaireWithResult.replace("#NB", response.nbTot) , "", ["success"]);
|
let txtIntro=searchQuestionnaireWithResult.replace("#NB", response.nbTot);
|
||||||
|
txtIntro=(response.nbTot > 1) ? txtIntro.replace("#S","s") : txtIntro.replace("#S","");
|
||||||
|
addElement(quizIntro, "p", txtIntro , "", ["success"]);
|
||||||
quizListing.innerHTML=response.html;
|
quizListing.innerHTML=response.html;
|
||||||
window.location.hash="";
|
window.location.hash="";
|
||||||
window.location.assign("#quizsTitle");
|
window.location.assign("#quizsIntro");
|
||||||
// Pagination nécessaire ?
|
// Pagination nécessaire ?
|
||||||
// on commence par vider...
|
// on commence par vider...
|
||||||
quizPaginationPrevious.innerHTML="";
|
quizPaginationPrevious.innerHTML="";
|
||||||
@ -164,7 +169,7 @@ const initialise = async () =>
|
|||||||
document.getElementById("begin").value=newBegin;
|
document.getElementById("begin").value=newBegin;
|
||||||
sendSearch();
|
sendSearch();
|
||||||
window.location.hash="";
|
window.location.hash="";
|
||||||
window.location.assign("#quizsTitle");// pour remonter
|
window.location.assign("#quizsIntro");// pour remonter
|
||||||
}
|
}
|
||||||
previousPageElt.addEventListener("click", function(e)
|
previousPageElt.addEventListener("click", function(e)
|
||||||
{
|
{
|
||||||
@ -188,7 +193,7 @@ const initialise = async () =>
|
|||||||
document.getElementById("begin").value=response.end+1;
|
document.getElementById("begin").value=response.end+1;
|
||||||
sendSearch();
|
sendSearch();
|
||||||
window.location.hash="";// sinon les hash s'enchaînent...
|
window.location.hash="";// sinon les hash s'enchaînent...
|
||||||
window.location.assign("#quizsTitle"); // pour remonter
|
window.location.assign("#quizsIntro"); // pour remonter
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ 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 !",
|
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 !",
|
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 !",
|
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 !",
|
||||||
nbQuestionnaireWithoudAnswer: "Il y a #NB quizs qui vous ont été proposés et auxquels vous n'avez pas répondu. Voici les derniers :!",
|
|
||||||
needIntegerNumberCorrectResponses : "Le nombre de réponses correctes doit être un nombre entier.",
|
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.",
|
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.",
|
needIntegerNumberUserResponses : "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.",
|
||||||
@ -15,12 +14,11 @@ module.exports =
|
|||||||
needMinNumberCorrectResponses : "Le nombre de réponses correctes ne peut être négatif.",
|
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.",
|
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 !",
|
noPreviousAnswer: "On dirait que c'est la première fois que vous répondez à ce quiz. Bonne lecture !",
|
||||||
noQuestionnaireWithoudAnswer: "Bravo ! Vous avez répondu à tous les quizs qui vous on été proposés !<br>Il y en a des nouveaux publiés régulièrement et qui vous seront proposés.<br>En attendant vous pouvez peut-être essayer de répondre de nouveau à certain quiz pour voir si vous vous souvenez des bonnes réponses ?",
|
|
||||||
previousAnswersLine: "Le DATEANSWER, vous avez répondu correctement à NBCORRECTANSWERS questions sur NBQUESTIONS en AVGDURATION secondes.",
|
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>.",
|
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",
|
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>.",
|
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>.",
|
responseSavedMessage : "Votre résultat a été enregistré. <a href='/#URL'>Accèder à tous vos quizs</a>.",
|
||||||
statsUser: "Vous avez enregistré NBANSWERS réponses à <b>NBQUESTIONNAIRES questionnaires différents</b> sur les NBTOTQUESTIONNAIRES proposés par le site.<br>En moyenne, vous avez mis AVGDURATION secondes à répondre et avez <b>correctement répondu à AVGCORRECTANSWERS % des questions</b>.",
|
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.",
|
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.",
|
||||||
};
|
};
|
@ -4,7 +4,7 @@ module.exports =
|
|||||||
addOkMessage : "Les données ont bien été enregistrées.",
|
addOkMessage : "Les données ont bien été enregistrées.",
|
||||||
alertNewWindow: "nouvelle fenêtre",
|
alertNewWindow: "nouvelle fenêtre",
|
||||||
badUrl : "Tentative d'accès à une page n'existant pas :",
|
badUrl : "Tentative d'accès à une page n'existant pas :",
|
||||||
btnLinkToQuestionnaire : "Aller au quiz !",
|
btnLinkToQuestionnaire : "Afficher !",
|
||||||
btnProposeConnection: "Je me connecte.",
|
btnProposeConnection: "Je me connecte.",
|
||||||
btnProposeSubscribe: "Je crée mon compte.",
|
btnProposeSubscribe: "Je crée mon compte.",
|
||||||
btnShowOnWebSite: "Voir sur #SITE_NAME.",
|
btnShowOnWebSite: "Voir sur #SITE_NAME.",
|
||||||
|
@ -38,6 +38,6 @@ module.exports =
|
|||||||
publishedBy: "Quiz publié par",
|
publishedBy: "Quiz publié par",
|
||||||
searchQuestionnaireResultTitle : "Résultat pour votre recherche",
|
searchQuestionnaireResultTitle : "Résultat pour votre recherche",
|
||||||
searchQuestionnaireWithNoResult : "Aucun quiz n'a été trouvé pour votre recherche.",
|
searchQuestionnaireWithNoResult : "Aucun quiz n'a été trouvé pour votre recherche.",
|
||||||
searchQuestionnaireWithResult : "Voici #NB quizs pour votre recherche :",
|
searchQuestionnaireWithResult : "Il y a #NB article#S correspondant à votre recherche :",
|
||||||
wrongAnswerTxt: "Mauvaise réponse"
|
wrongAnswerTxt: "Mauvaise réponse"
|
||||||
};
|
};
|
@ -1,6 +1,8 @@
|
|||||||
module.exports =
|
module.exports =
|
||||||
{
|
{
|
||||||
|
lastQuestionnairesForUser: "Vos dernières lectures :",
|
||||||
notFound : "Les informations d'un questionnaire attribué à un abonné n'ont pas été trouvées : ",
|
notFound : "Les informations d'un questionnaire attribué à un abonné n'ont pas été trouvées : ",
|
||||||
|
noQuestionnaireAccess: "Aucun article ne vous a encore été envoyé par e-mail. Sans doute, venez-vous de créer votre compte. En attendant d'en recevoir, vous pouvez mieux découvrir le site WikiLerni <a href=\"/a-propos.html\">en lisant la page à propos</a> ou encore commencer à parcourir librement son contenu à l'aide du moteur de recherche ci-dessus.",
|
||||||
questionnaireRetryInfo : "<b>Vous avez déjà reçu tous les quizs publiés à ce jour ! En attendant la publication de nouveaux quizs, vous pouvez peut-être réessayer le suivant ?</b>",
|
questionnaireRetryInfo : "<b>Vous avez déjà reçu tous les quizs publiés à ce jour ! En attendant la publication de nouveaux quizs, vous pouvez peut-être réessayer le suivant ?</b>",
|
||||||
questionnaireRetryInfoTxt : "Bonjour USER_NAME,\n\nVous avez déjà reçu tous les quizs publiés à ce jour ! En attendant la publication de nouveaux quizs, vous pouvez peut-être réessayer le suivant ?\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",
|
questionnaireRetryInfoTxt : "Bonjour USER_NAME,\n\nVous avez déjà reçu tous les quizs publiés à ce jour ! En attendant la publication de nouveaux quizs, vous pouvez peut-être réessayer le suivant ?\n\nQUESTIONNAIRE_URL\n\nBonne lecture !\n\nStopper les envois ?\nUNSUBSCRIBE_URL",
|
||||||
searchIsNotLongEnough : "Merci de fournir un mot-clés d'au moins deux caractères pour votre recherche."
|
searchIsNotLongEnough : "Merci de fournir un mot-clés d'au moins deux caractères pour votre recherche."
|
||||||
|
@ -7,8 +7,6 @@ const authAdmin = require("../middleware/authAdmin");
|
|||||||
const userCtrl = require("../controllers/user");
|
const userCtrl = require("../controllers/user");
|
||||||
const subscriptionCtrl = require("../controllers/subscription");
|
const subscriptionCtrl = require("../controllers/subscription");
|
||||||
|
|
||||||
//router.get("/getconfig", userCtrl.getConfig); // ne devrait plus être utile !
|
|
||||||
|
|
||||||
router.post("/getgodfatherid", userCtrl.getGodfatherId);
|
router.post("/getgodfatherid", userCtrl.getGodfatherId);
|
||||||
router.post("/isemailfree", userCtrl.checkEmailIsFree);
|
router.post("/isemailfree", userCtrl.checkEmailIsFree);
|
||||||
router.post("/signup", userCtrl.signup);
|
router.post("/signup", userCtrl.signup);
|
||||||
|
Loading…
Reference in New Issue
Block a user