Réorganisation et débuggage script formulaire édition des quizs avant ajout des nouveaux champs pour les groupes

This commit is contained in:
Fabrice PENHOËT 2020-10-13 17:28:48 +02:00
parent 9a6bb5d882
commit d52be75633
3 changed files with 559 additions and 560 deletions

View File

@ -439,10 +439,10 @@ const deleteQuestionnaire = async (id, req) =>
await questionCtrl.deleteQuestionById(questionnaire.Questions[i].id); await questionCtrl.deleteQuestionById(questionnaire.Questions[i].id);
for(let i in questionnaire.Illustrations) for(let i in questionnaire.Illustrations)
await illustrationCtrl.deleteIllustrationById(questionnaire.Illustrations[i].id); await illustrationCtrl.deleteIllustrationById(questionnaire.Illustrations[i].id);
const nb=await db["Questionnaire"].destroy( { where: { id : req.params.id }, limit:1 }); const nb=await db["Questionnaire"].destroy( { where: { id : id }, limit:1 });
if(nb===1)// = json existant, bien que sql déjà supprimé if(nb===1)// = json existant, bien que sql déjà supprimé
{ {
toolFile.deleteJSON(configQuestionnaires.dirCacheQuestionnaires, req.params.id); toolFile.deleteJSON(configQuestionnaires.dirCacheQuestionnaires, id);
// + HTML : // + HTML :
toolFile.deleteFile(configQuestionnaires.dirHTMLQuestionnaires, questionnaire.Questionnaire.slug+".html"); toolFile.deleteFile(configQuestionnaires.dirHTMLQuestionnaires, questionnaire.Questionnaire.slug+".html");
// Actualisation de liste des questionnaires pour les tags concernés. // Actualisation de liste des questionnaires pour les tags concernés.

View File

@ -5,13 +5,13 @@
/// Si un id est passé par l'url on affiche les informations du groupe dans un formulaire permettant de l'éditer/supprimer. /// Si un id est passé par l'url on affiche les informations du groupe dans un formulaire permettant de l'éditer/supprimer.
/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouveau. /// Si pas d'id passé par l'url, on affiche un formulaire vide permettant d'en saisir un nouveau.
// Fichier de configuration côté client : // Fichiers de configuration :
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 configQuestionnaires = require("../../config/questionnaires.js"); const configQuestionnaires = require("../../config/questionnaires.js");
const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); const configTemplate = require("../../views/"+theme+"/config/"+lang+".js");
// Fonctions utiles au script : // Fonctions :
import { getLocaly, removeLocaly } from "./tools/clientstorage.js"; import { getLocaly, removeLocaly } from "./tools/clientstorage.js";
import { addElement } from "./tools/dom.js"; import { addElement } from "./tools/dom.js";
import { helloDev, updateAccountLink } from "./tools/everywhere.js"; import { helloDev, updateAccountLink } from "./tools/everywhere.js";
@ -26,18 +26,67 @@ const { infosGroupForAdmin, searchWithoutResult } = require("../../lang/"+lang+"
const { needBeConnected } = require("../../lang/"+lang+"/user"); const { needBeConnected } = require("../../lang/"+lang+"/user");
// Principaux éléments du DOM manipulés : // Principaux éléments du DOM manipulés :
const btnNewGroup = document.getElementById("wantNewGroup");
const deleteCheckBox = document.getElementById("deleteOkLabel");
const divCrash = document.getElementById("crash");
const divGroupIntro = document.getElementById("groupIntro");
const divMain = document.getElementById("main-content"); const divMain = document.getElementById("main-content");
const divMessage = document.getElementById("message"); const divMessage = document.getElementById("message");
const divResponse = document.getElementById("response"); const divResponse = document.getElementById("response");
const divCrash = document.getElementById("crash");
const divGroupIntro = document.getElementById("groupIntro");
const formGroup = document.getElementById("groups");
const deleteCheckBox = document.getElementById("deleteOkLabel");
const btnNewGroup = document.getElementById("wantNewGroup");
const formSearch = document.getElementById("search");
const divSearchResult = document.getElementById("searchResult"); const divSearchResult = document.getElementById("searchResult");
const formGroup = document.getElementById("groups");
const formSearch = document.getElementById("search");
helloDev(); // Fonction utile pour vider le formulaire, y compris les champs hidden, etc.
const emptyGroupForm = () =>
{
empyForm(formGroup);
// Case de suppression inutile en mode création :
deleteCheckBox.style.display="none";
// Intro à vider !
divGroupIntro.innerHTML="";
}
// Fonction affichant les infos connues concernant un groupe.
const showFormGroupInfos = (id, token) =>
{
// on commence par tout vider, des fois que... :
emptyGroupForm();
const xhrGetInfos = new XMLHttpRequest();
xhrGetInfos.open("GET", apiUrl+configQuestionnaires.groupRoutes+configQuestionnaires.getGroupRoute+id);
xhrGetInfos.onreadystatechange = function()
{
if (this.readyState == XMLHttpRequest.DONE)
{
let response=JSON.parse(this.responseText);
if (this.status === 200 && response.Group != undefined)
{
const mapText =
{
GROUP_ID : response.Group.id,
DATE_CREA : dateFormat(response.Group.createdAt),
DATE_UPDATE : dateFormat(response.Group.updatedAt),
NB_ELEMENTS : (response.Group.Questionnaires!==undefined) ? response.Group.Questionnaires.length : 0
};
const groupIntro=replaceAll(infosGroupForAdmin, mapText);
addElement(divGroupIntro, "p", groupIntro, "", ["info"]);
for(let data in response.Group)
{
if(formGroup.elements[data]!==undefined)
{
if(data==="publishingAt" && response.Group[data]!==null)
formGroup.elements[data].value=dateFormat(response.Group[data], "form");// !! format pouvant poser soucis si navigateur ne gère pas les champs de type "date"
else
formGroup.elements[data].value=response.Group[data];
}
}
deleteCheckBox.style.display="block";
}// ajout gestion erreur 404 ???
}
}
xhrGetInfos.setRequestHeader("Authorization", "Bearer "+token);
xhrGetInfos.send();
}
const initialise = async () => const initialise = async () =>
{ {
@ -47,104 +96,50 @@ const initialise = async () =>
if(isConnected) if(isConnected)
{ {
const user=getLocaly("user", true); const user=getLocaly("user", true);
updateAccountLink(user.status, configTemplate); updateAccountLink(user.status, configTemplate);// lien "Compte" menu header template
divMain.style.display="block"; divMain.style.display="block";
if(!isEmpty(getLocaly("message"))) if(!isEmpty(getLocaly("message")))
{ {
addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false);
removeLocaly("message"); removeLocaly("message");
} }
// Initialisation du formulaire de recherche : // Initialisation des formulaires :
setAttributesToInputs(configQuestionnaires, formSearch); setAttributesToInputs(configQuestionnaires, formSearch);
// Fonction utile pour vider le formulaire, y compris les champs hidden, etc.
// Cache aussi certains champs en mode création
const emptyGroupForm = () =>
{
empyForm(formGroup);
// Case de suppression cachée par défaut, car inutile pour formulaire de création
deleteCheckBox.style.display="none";
}
emptyGroupForm();
// Initialise les contraintes du formulaire :
setAttributesToInputs(configQuestionnaires.Group, formGroup); setAttributesToInputs(configQuestionnaires.Group, formGroup);
emptyGroupForm();
// Fonction affichant les infos connues concernant un utilisateur et son abonnement
const showFormGroupInfos = (id) =>
{
// on commence par tout vider, des fois que... :
emptyGroupForm();
const xhrGetInfos = new XMLHttpRequest();
xhrGetInfos.open("GET", apiUrl+configQuestionnaires.groupRoutes+configQuestionnaires.getGroupRoute+id);
xhrGetInfos.onreadystatechange = function()
{
if (this.readyState == XMLHttpRequest.DONE)
{
let response=JSON.parse(this.responseText);
if (this.status === 200 && response.Group != undefined)
{
const mapText =
{
GROUP_ID : response.Group.id,
DATE_CREA : dateFormat(response.Group.createdAt),
DATE_UPDATE : dateFormat(response.Group.updatedAt),
NB_ELEMENTS : (response.Group.Questionnaires!==undefined) ? response.Group.Questionnaires.length : 0
};
const groupIntro=replaceAll(infosGroupForAdmin, mapText);
addElement(divGroupIntro, "p", groupIntro, "", ["info"]);
for(let data in response.Group)
{
if(formGroup.elements[data]!==undefined)
{
if(data==="publishingAt" && response.Group[data]!==null)
formGroup.elements[data].value=dateFormat(response.Group[data], "form");// !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date"
else
formGroup.elements[data].value=response.Group[data];
}
}
deleteCheckBox.style.display="block";
}
}
}
xhrGetInfos.setRequestHeader("Authorization", "Bearer "+user.token);
xhrGetInfos.send();
}
// Si un id est passé par l'url, on essaye d'afficher les infos : // Si un id est passé par l'url, on essaye d'afficher les infos :
let urlDatas=getUrlParams(); let urlDatas=getUrlParams();
if(urlDatas && urlDatas.id!==undefined) if(urlDatas && urlDatas.id!==undefined)
showFormGroupInfos(urlDatas.id); showFormGroupInfos(urlDatas.id, user.token);
// Besoin d'un coup de Kärcher ? // Besoin d'un coup de Kärcher ?
btnNewGroup.addEventListener("click", function(e) btnNewGroup.addEventListener("click", function(e)
{ {
emptyGroupForm(); emptyGroupForm();
}); });
// Envoi du formulaire principal :
// Envoi du formulaire des infos du groupe
formGroup.addEventListener("submit", function(e) formGroup.addEventListener("submit", function(e)
{ {
e.preventDefault(); e.preventDefault();
divResponse.innerHTML=""; divResponse.innerHTML="";
let datas=getDatasFromInputs(formGroup); let datas=getDatasFromInputs(formGroup);
const xhrGroupDatas = new XMLHttpRequest(); const xhrGroupDatas = new XMLHttpRequest();
if(!isEmpty(datas.id) && (datas.deleteOk!==undefined)) if(!isEmpty(datas.id) && (datas.deleteOk !== undefined))
xhrGroupDatas.open("DELETE", apiUrl+configQuestionnaires.groupRoutes+"/"+datas.id); xhrGroupDatas.open("DELETE", apiUrl+configQuestionnaires.groupRoutes+"/"+datas.id);
else if(!isEmpty(datas.id)) else if(!isEmpty(datas.id))
xhrGroupDatas.open("PUT", apiUrl+configQuestionnaires.groupRoutes+"/"+datas.id); xhrGroupDatas.open("PUT", apiUrl+configQuestionnaires.groupRoutes+"/"+datas.id);// mise à jour
else else
xhrGroupDatas.open("POST", apiUrl+configQuestionnaires.groupRoutes); xhrGroupDatas.open("POST", apiUrl+configQuestionnaires.groupRoutes);// nouvel enregistrement
xhrGroupDatas.onreadystatechange = function() xhrGroupDatas.onreadystatechange = function()
{ {
if (this.readyState == XMLHttpRequest.DONE) if (this.readyState == XMLHttpRequest.DONE)
{ {
let response=JSON.parse(this.responseText); let response=JSON.parse(this.responseText);
if (this.status === 201 && response.id!=undefined) if (this.status === 201 && response.id != undefined) // nouvel enregistrement créé
{ {
addElement(divResponse, "p", addOkMessage, "", ["success"]); addElement(divResponse, "p", addOkMessage, "", ["success"]);
datas.id=response.id; datas.id=response.id; // utile pour réaffichage + bas
} }
else if (this.status === 200 && response.message!=undefined) else if (this.status === 200 && response.message != undefined) // mise à jour ou suppression ok
{ {
if(Array.isArray(response.message)) if(Array.isArray(response.message))
response.message = response.message.join("<br>"); response.message = response.message.join("<br>");
@ -164,8 +159,8 @@ const initialise = async () =>
addElement(divResponse, "p", serverError, "", ["error"]); addElement(divResponse, "p", serverError, "", ["error"]);
if(isEmpty(response.errors)) if(isEmpty(response.errors))
{ {
if(datas.deleteOk===undefined) if(datas.deleteOk === undefined)
showFormGroupInfos(datas.id); showFormGroupInfos(datas.id, user.token);// actualisation de l'affichage après traitement serveur
else else
emptyGroupForm(); emptyGroupForm();
} }
@ -177,7 +172,7 @@ const initialise = async () =>
xhrGroupDatas.send(JSON.stringify(datas)); xhrGroupDatas.send(JSON.stringify(datas));
}); });
// Traitement du lancement d'une recherche // Envoi d'une recherche
formSearch.addEventListener("submit", function(e) formSearch.addEventListener("submit", function(e)
{ {
e.preventDefault(); e.preventDefault();
@ -191,8 +186,8 @@ const initialise = async () =>
let response=JSON.parse(this.responseText); let response=JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) if (this.status === 200 && Array.isArray(response))
{ {
if(response.length===0) if(response.length === 0)
addElement(divSearchResult, "p", searchWithoutResult, "", ["info"]);// vérifier et importer texte addElement(divSearchResult, "p", searchWithoutResult, "", ["info"]);
else else
{ {
let selectHTML="<option value=''></option>"; let selectHTML="<option value=''></option>";
@ -202,8 +197,8 @@ const initialise = async () =>
const searchSelect=document.getElementById("selectSearch"); const searchSelect=document.getElementById("selectSearch");
searchSelect.addEventListener("change", function() searchSelect.addEventListener("change", function()
{ {
if(searchSelect.value!=="") if(searchSelect.value !== "")
showFormGroupInfos(searchSelect.value); showFormGroupInfos(searchSelect.value, user.token);
}); });
} }
} }
@ -232,4 +227,5 @@ const initialise = async () =>
console.error(e); console.error(e);
} }
} }
initialise(); initialise();
helloDev();

File diff suppressed because it is too large Load Diff