From 303bb0e2e15e6a2cfd9b175b998c137f74d50faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20PENHO=C3=8BT?= Date: Thu, 24 Sep 2020 17:09:17 +0200 Subject: [PATCH] =?UTF-8?q?Revue=20formulaire=20=C3=A9dition=20des=20abonn?= =?UTF-8?q?=C3=A9s/administrateur=20site=20:=20template=20wikilerni=20+=20?= =?UTF-8?q?optimisation=20script=20JS.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/users.js | 31 +- front/public/gestion-utilisateurs.html | 329 ++++------ front/public/themes/wikilerni/css/style.css | 20 +- front/src/manageUsers.js | 640 ++++++++++---------- 4 files changed, 479 insertions(+), 541 deletions(-) diff --git a/config/users.js b/config/users.js index 320f10b..9a15146 100644 --- a/config/users.js +++ b/config/users.js @@ -2,25 +2,25 @@ module.exports = { // API'routes (after "apiUrl" defined in instance.js) userRoutes: "/user", - subscribeRoute: "/signup", - getGodfatherRoute: "/getgodfatherid", + checkDeleteLinkRoute: "/confirmdelete/", checkIfIsEmailfreeRoute: "/isemailfree", - checkSubscribeTokenRoute: "/validation/", checkLoginRoute: "/checklogin/", - connectionRoute: "/login", - getLoginLinkRoute: "/getloginlink", - connectionWithLinkRoute: "/checkloginlink", - getUserInfos: "/get/", - createUserRoute: "/create", - validateUserRoute: "/validate/", - updateUserInfos: "/modify/", - searchUserRoute: "/search/", - getGodChilds: "/getgodchilds/", checkNewLoginLinkRoute: "/confirmnewlogin/", - checkDeleteLinkRoute: "/confirmdelete/", - getPayments: "/payment/getforoneuser/", - unsubscribeRoute: "/subscription/stop/", + checkSubscribeTokenRoute: "/validation/", + connectionRoute: "/login", + connectionWithLinkRoute: "/checkloginlink", + createUserRoute: "/create", getAdminStats: "/getadminstats/", + getGodChilds: "/getgodchilds/", + getGodfatherRoute: "/getgodfatherid", + getLoginLinkRoute: "/getloginlink", + getPayments: "/payment/getforoneuser/", + getUserInfos: "/get/", + searchUserRoute: "/search/", + subscribeRoute: "/signup", + unsubscribeRoute: "/subscription/stop/", + updateUserInfos: "/modify/", + validateUserRoute: "/validate/", // forms : à compléter avec valeurs par défaut, etc. cf modèle name: { maxlength: 70, required: true }, email: { maxlength: 255, required: true }, @@ -28,6 +28,7 @@ module.exports = newPassword: { minlength: 8, maxlength:72 }, codeGodfather: { maxlength: 255 }, cguOk: { value: "true", required: true }, + search: { minlength: 3, required: true }, timeDifferenceMin: -720, timeDifferenceMax:840, // JSON dir diff --git a/front/public/gestion-utilisateurs.html b/front/public/gestion-utilisateurs.html index ebcd666..c3cce21 100644 --- a/front/public/gestion-utilisateurs.html +++ b/front/public/gestion-utilisateurs.html @@ -1,207 +1,140 @@ - - - - - - Les abonnés + + + + + + Mon WikiLerni - - - - - - - - + + + + + - - - - -
- - -
-

Les abonnés

- - - -
-
-
-
-
- Informations de l'abonné -
-
- - - -
-
- - - -
- -
- - -
+ -
- - -
+

Informations de l'abonné

+
+
+
+
+
+
+
+ + +
+
+ + +
+
+
+
Laisser vide sauf si vous souhaitez le changer.
+
+
Depuis la création de son compte.
+
+

Jours valables pour l'abonnement

+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+ +
+ +
+
+

Payments reçus via l'API WebPortage

+
+

Parrainages

+
+
-
- - -
- -
- - - Laisser vide sauf si vous souhaitez le changer. -
- -
- - -
- -
- - Depuis la création de son compte. -
- -
- Jours valables pour l'abonnement - -
-
- - - - - - - Vider -
-
-

Payments reçus via l'API WebPortage

-

Parrainages

- - - - - - - - - - + + \ No newline at end of file diff --git a/front/public/themes/wikilerni/css/style.css b/front/public/themes/wikilerni/css/style.css index b7bca72..7da344d 100644 --- a/front/public/themes/wikilerni/css/style.css +++ b/front/public/themes/wikilerni/css/style.css @@ -258,7 +258,8 @@ label.check padding:0; margin:0; } -input[type=submit], input[type=text], input[type=email], input[type=password], .button +input[type=submit], input[type=text], input[type=email], input[type=password], input[type=number], +select, textarea, .button { background-color: #8c599c; padding: 10px; @@ -278,7 +279,7 @@ input[type=submit]:hover, .button:hover margin-top: 2px; box-shadow: inset 0px 1px 0px rgba(255,255,255,0.66), inset 0px -1px 0px rgba(0, 0, 0,0.66), 0px 0px 5px rgba(0,0,0,0.66); } -input[type=text], input[type=password], input[type=email] +input[type=text], input[type=password], input[type=email], textarea { box-shadow: inset 0 1px 0 rgba(0,0,0,0.66), inset 0 -1px 0 rgba(255,255,255,0.66), inset 0 3px 8px rgba(0,0,0,0.66); width: 95%; @@ -291,6 +292,13 @@ margin-left: 0; margin-right: -15px; opacity:0.0; } +/* This allow the motion of the button while overing without displacing the content of the page */ +.input_wrapper +{ +height: 40px; +display: inline-block; +margin: 0.5em; +} /* The following is a trick to force browser to let me redefine checkbox style */ .checkbox_override { @@ -350,13 +358,7 @@ text-align:left; line-height:1.5em; } -/* This allow the motion of the button while overing without displacing the content of the page : vérifier que cela est utilisé ? -.input_wrapper -{ -height: 40px; -display: inline-block; -margin-top: 1em; -}*/ + /* Sous-menu pour tags ou utilisateur connecté, etc. */ #menu { diff --git a/front/src/manageUsers.js b/front/src/manageUsers.js index e106fac..538a5c7 100644 --- a/front/src/manageUsers.js +++ b/front/src/manageUsers.js @@ -7,364 +7,366 @@ /// À ajouter : /// - importation liste de comptes utilisateur à créer -/// - attribution d'un parrain à un utilisateur (via un moteur de recherche). Prévu par le contrôleur. +/// - attribution d'un parrain à un utilisateur (via un moteur de recherche). Déjà prévu par le contrôleur. // Fichier de configuration côté client : import { apiUrl, availableLangs, theme } from "../../config/instance.js"; const lang=availableLangs[0]; -const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); +const configUsers = require("../../config/users.js"); +const configTemplate = require("../../views/"+theme+"/config/"+lang+".js"); -// Fonctions utiles au script : !! revoir quand le reste sera fini pour vérifier si tout est utile -import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; +// Fonctions utiles au script : +import { getLocaly, removeLocaly } from "./tools/clientstorage.js"; import { addElement } from "./tools/dom.js"; import { helloDev, updateAccountLink } from "./tools/everywhere.js"; import { empyForm, getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js"; import { dateFormat, isEmpty, replaceAll } from "../../tools/main"; import { getUrlParams } from "./tools/url.js"; -import { checkSession, getConfig, getPassword } from "./tools/users.js"; +import { checkSession, getPassword } from "./tools/users.js"; // Dictionnaires : -const txt = require("../../lang/"+lang+"/general"); -const txtUsers = require("../../lang/"+lang+"/user"); -const txtSubscriptions = require("../../lang/"+lang+"/subscription"); - -helloDev(); +const txtAddOkMessage = require("../../lang/"+lang+"/general").addOkMessage; +const txtServerError = require("../../lang/"+lang+"/general").serverError; +const txtInfosAdminGodfather = require("../../lang/"+lang+"/user").infosAdminGodfather; +const txtInfosAdminNbGodChilds = require("../../lang/"+lang+"/user").infosAdminNbGodChilds; +const txtInfosUserForAdmin = require("../../lang/"+lang+"/user").infosUserForAdmin; +const txtNeedBeConnected = require("../../lang/"+lang+"/user").needBeConnected; +const txtNotFound = require("../../lang/"+lang+"/user").notFound; +const txtInfosExpiratedAdmin = require("../../lang/"+lang+"/subscription").infosExpiratedAdmin; +const txtInfosNbDaysAdmin = require("../../lang/"+lang+"/subscription").infosNbDaysAdmin; +const txtInfosPaymentsAdmin = require("../../lang/"+lang+"/subscription").infosPaymentsAdmin; +const txtIsNotValided = require("../../lang/"+lang+"/subscription").isNotValided; // Principaux éléments du DOM manipulés : const divMain = document.getElementById("main-content"); const divMessage = document.getElementById("message"); const divResponse = document.getElementById("response"); +const divCrash = document.getElementById("crash"); const divSubscribeIntro = document.getElementById("subscribeIntro"); const divPaymentsInfos = document.getElementById("infosPayments"); const divGodchildsInfos = document.getElementById("infosGodchilds"); - const formUser = document.getElementById("users"); const deleteCheckBox = document.getElementById("deleteOkLabel"); const validationCheckBox = document.getElementById("validationOkLabel"); const btnNewUser = document.getElementById("wantNewUser"); const newPassword = document.getElementById("newPassword"); const timeDifference = document.getElementById("timeDifference"); -const formSearch = document.getElementById("search"); +const formSearch = document.getElementById("searchUsers"); const divSearchResult = document.getElementById("searchResult"); +helloDev(); + const initialise = async () => { try - { - const config = await getConfig(); - if(!config) - addElement(divMessage, "p", txt.serverError, "", ["error"]); - else + { + const isConnected=await checkSession(["manager", "admin"], "/"+configTemplate.connectionPage, { message: txtNeedBeConnected, color:"error" }, window.location); + if(isConnected) { - const isConnected=await checkSession(["manager", "admin"], "/"+configFrontEnd.connectionPage, { message: txtUsers.needBeConnected, color:"error" }, window.location); - if(isConnected) + const user=getLocaly("user", true); + updateAccountLink(user.status, configTemplate); + divMain.style.display="block"; + if(!isEmpty(getLocaly("message"))) { - const user=getLocaly("user", true); - updateAccountLink(user.status, configFrontEnd); - divMain.style.display="block"; - if(!isEmpty(getLocaly("message"))) - { - addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); - removeLocaly("message"); - } - // Initialisation du formulaire de recherche : - setAttributesToInputs(config, formSearch); - - // Fonction utile pour vider le formulaire, y compris les champs hidden, etc. - // Cache aussi certains champs en mode création - const emptyUserForm = () => - { - empyForm(formUser); - // Case de suppression cachée par défaut, car inutile pour formulaire de création - deleteCheckBox.style.display="none"; - // Case de validation cachée par défaut, car utile que dans certains cas - validationCheckBox.style.display="none"; - divSubscribeIntro.innerHTML=""; - divPaymentsInfos.innerHTML=""; - divGodchildsInfos.innerHTML=""; - // Certains navigateurs ont tendance à remplir tout seul les champs password - newPassword.value=""; - // En mode création, pas de champ pour changer le mot de passe - newPassword.parentNode.style.display="none"; - // Inutile en mode création - timeDifference.parentNode.style.display="none"; - } - emptyUserForm(); - // Initialise les contraintes du formulaire : - setAttributesToInputs(config, formUser); - - // Fonction affichant les infos connues concernant un utilisateur et son abonnement - const showFormUserInfos = (id) => - { - // on commence par tout vider, des fois que... : - emptyUserForm(); - const xhrGetInfos = new XMLHttpRequest(); - xhrGetInfos.open("GET", apiUrl+config.userRoutes+config.getUserInfos+id); - xhrGetInfos.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let response=JSON.parse(this.responseText); - if (this.status === 200 && response.User != undefined) - { - newPassword.parentNode.style.display="block"; - timeDifference.parentNode.style.display="block"; - const mapText = - { - ID_USER : response.User.id, - DATE_CREA : dateFormat(response.User.createdAt), - DATE_UPDATE : dateFormat(response.User.updatedAt), - DATE_CONNECTION : dateFormat(response.User.connectedAt) - }; - let subscribeIntro=replaceAll(txtUsers.infosUserForAdmin, mapText); - for(let data in response.User) - { - if(formUser.elements[data]!==undefined) - { - if(response.User[data]!==true && response.User[data]!==false)// booléen = case à cocher ! - formUser.elements[data].value=response.User[data]; - else if (response.User[data]==true) // si false, on ne fait rien - formUser.elements[""+data].checked="checked"; - } - } - if(response.Subscription != undefined) - { - // nombre de jours de l'abonnement - formUser.elements["numberOfDays"].value=response.Subscription["numberOfDays"]; - // infos de l'abonnement - if(response.Subscription.noticeOk==true) - formUser.elements["noticeOk"].checked="checked"; - // jours de réception - for(let i in response.Subscription.receiptDays) - formUser.elements["d"+response.Subscription.receiptDays[i]].checked="checked"; - - const beginSubTS=new Date(response.Subscription.createdAt).getTime(); - const nbDaysOk=response.Subscription.numberOfDays-Math.round((Date.now()-beginSubTS)/1000/3600/24); - if(nbDaysOk>0) - subscribeIntro+="
"+txtSubscriptions.infosNbDaysAdmin.replace("NB_DAYS", nbDaysOk); - else - subscribeIntro+="
"+txtSubscriptions.infosExpiratedAdmin; - addElement(divSubscribeIntro, "p", subscribeIntro, "", ["information"], "", false); - } - else - { - addElement(divSubscribeIntro, "p", txtSubscriptions.isNotValided, "", ["error"]); - validationCheckBox.style.display="block"; - } - deleteCheckBox.style.display="block"; - // Infos de paiements via API WP - const xhrGetPaymentsInfos = new XMLHttpRequest(); - xhrGetPaymentsInfos.open("GET", apiUrl+config.getPayments+response.User.id); - xhrGetPaymentsInfos.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let responsePay=JSON.parse(this.responseText); - if (this.status === 200) - { - if(responsePay.length!==0) - { - let txtPayments=""; - for(let i in responsePay) - { - const mapText = - { - DATE_PAYMENT : dateFormat(responsePay[i].createdAt, "fr"), - AMOUNT : responsePay[i].amount, - CLIENT_NAME : responsePay[i].clientName - }; - txtPayments+="
  • "+replaceAll(txtSubscriptions.infosPaymentsAdmin, mapText)+"
  • "; - } - addElement(divPaymentsInfos, "ul", txtPayments, "", ["information"], "", false); - divPaymentsInfos.style.display="block" - } - } - } - } - xhrGetPaymentsInfos.setRequestHeader("Authorization", "Bearer "+user.token); - xhrGetPaymentsInfos.send(); - - // Un parrain ou deux par deux ? - let txtGodchilds=""; - if(!isEmpty(response.User.GodfatherId)) - { - const xhrGetGodFatherInfos = new XMLHttpRequest(); - xhrGetGodFatherInfos.open("GET", apiUrl+config.userRoutes+config.getUserInfos+response.User.GodfatherId); - xhrGetGodFatherInfos.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let responseGF=JSON.parse(this.responseText); - if (this.status === 200 && responseGF.User != undefined) - txtGodchilds+=txtUsers.infosAdminGodfather+""+responseGF.User.name+""+".
    "; - } - } - xhrGetGodFatherInfos.setRequestHeader("Authorization", "Bearer "+user.token); - xhrGetGodFatherInfos.send(); - } - // Des filleuls ? - const xhrGetGodchilds = new XMLHttpRequest(); - xhrGetGodchilds.open("GET", apiUrl+config.userRoutes+config.getGodChilds+id); - xhrGetGodchilds.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let responseGS=JSON.parse(this.responseText); - if (this.status === 200) - { - if(responseGS.length!==0) - { - txtGodchilds+=txtUsers.infosAdminNbGodChilds.replace("#NB", responseGS.length); - for(let i in responseGS) - txtGodchilds+=""+responseGS[i].name+""; - } - } - } - } - xhrGetGodchilds.setRequestHeader("Authorization", "Bearer "+user.token); - xhrGetGodchilds.send(); - if(txtGodchilds!=="") - { - addElement(divGodchildsInfos, "p", txtGodchilds+".", "", ["information"], "", false); - divGodchildsInfos.style.display="block"; - } - } - } - } - xhrGetInfos.setRequestHeader("Authorization", "Bearer "+user.token); - xhrGetInfos.send(); - } - - // Si un id est passé par l'url, on essaye d'afficher l'utilisateur : - let urlDatas=getUrlParams(); - if(urlDatas && urlDatas.id!==undefined) - showFormUserInfos(urlDatas.id); - - // Besoin d'un coup de Kärcher ? - btnNewUser.addEventListener("click", function(e) - { - emptyUserForm(); - }); - - // Envoi du formulaire des infos de l'utilisateur - formUser.addEventListener("submit", function(e) - { - e.preventDefault(); - divResponse.innerHTML=""; - let datas=getDatasFromInputs(formUser); - // recomposition des jours valables pour l'abonnement : - datas.receiptDays=""; - for(let i=1; i<=7; i++) - { - if(datas["d"+i]!==undefined) - datas.receiptDays+=""+i; - } - if(datas.noticeOk===undefined) - datas.noticeOk="false"; - if(datas.newsletterOk===undefined) - datas.newsletterOk="false"; - const xhrUserDatas = new XMLHttpRequest(); - if(!isEmpty(datas.id) && (datas.deleteOk!==undefined)) - xhrUserDatas.open("DELETE", apiUrl+config.userRoutes+"/"+datas.id); - else if(!isEmpty(datas.id) && (datas.validationOk!==undefined)) - xhrUserDatas.open("POST", apiUrl+config.userRoutes+config.validateUserRoute+datas.id); - else if(!isEmpty(datas.id)) - xhrUserDatas.open("PUT", apiUrl+config.userRoutes+config.updateUserInfos+datas.id); - else - { - datas.password=getPassword(config.password.minlength, config.password.minlength+2);// mot de passe temporaire - xhrUserDatas.open("POST", apiUrl+config.userRoutes+config.createUserRoute); - } - xhrUserDatas.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let response=JSON.parse(this.responseText); - if (this.status === 201 && response.id!=undefined) - { - addElement(divResponse, "p", txt.addOkMessage, "", ["success"]); - datas.id=response.id; - } - else if (this.status === 200 && response.message!=undefined) - { - if(Array.isArray(response.message)) - response.message = response.message.join("
    "); - else - response.message = response.message; - addElement(divResponse, "p", response.message, "", ["success"]); - } - else if (response.errors) - { - if(Array.isArray(response.errors)) - response.errors = response.errors.join("
    "); - else - response.errors = txt.serverError; - addElement(divResponse, "p", response.errors, "", ["error"]); - } - else - addElement(divResponse, "p", txt.serverError, "", ["error"]); - if(isEmpty(response.errors)) - { - if(datas.deleteOk===undefined) - showFormUserInfos(datas.id);// peut avoir évolué suivant ce qui s'est passé - else - emptyUserForm(); - } - } - } - xhrUserDatas.setRequestHeader("Content-Type", "application/json"); - xhrUserDatas.setRequestHeader("Authorization", "Bearer "+user.token); - if(datas) - xhrUserDatas.send(JSON.stringify(datas)); - }); - - // Traitement du lancement d'une recherche - formSearch.addEventListener("submit", function(e) - { - e.preventDefault(); - let datas=getDatasFromInputs(formSearch); - const xhrSearch = new XMLHttpRequest(); - xhrSearch.open("POST", apiUrl+config.userRoutes+config.searchUserRoute); - xhrSearch.onreadystatechange = function() - { - if (this.readyState == XMLHttpRequest.DONE) - { - let response=JSON.parse(this.responseText); - if (this.status === 200 && Array.isArray(response)) - { - if(response.length===0) - addElement(divSearchResult, "p", txtUsers.notFound, "", ["information"]); - else - { - let selectHTML=""; - for(let i in response) - selectHTML+=""; - addElement(divSearchResult, "select", selectHTML, "selectSearch"); - const searchSelect=document.getElementById("selectSearch"); - searchSelect.addEventListener("change", function() - { - if(searchSelect.value!=="") - showFormUserInfos(searchSelect.value); - }); - } - } - else - addElement(divSearchResult, "p", txt.serverError, "", ["error"]); - } - } - xhrSearch.setRequestHeader("Content-Type", "application/json"); - xhrSearch.setRequestHeader("Authorization", "Bearer "+user.token); - if(datas) - xhrSearch.send(JSON.stringify(datas)); - }); - + addElement(divMessage, "p", getLocaly("message", true).message, "", [getLocaly("message", true).color], "", false); + removeLocaly("message"); } + // Initialisation du formulaire de recherche : + setAttributesToInputs(configUsers, formSearch); + + // Fonction utile pour vider le formulaire, y compris les champs hidden, etc. + // Cache aussi certains champs en mode création + const emptyUserForm = () => + { + empyForm(formUser); + // Case de suppression cachée par défaut, car inutile pour formulaire de création + deleteCheckBox.style.display="none"; + // Case de validation cachée par défaut, car utile que dans certains cas + validationCheckBox.style.display="none"; + divSubscribeIntro.innerHTML=""; + divPaymentsInfos.innerHTML=""; + divGodchildsInfos.innerHTML=""; + // Certains navigateurs ont tendance à remplir tout seul les champs configUsers.password + newPassword.value=""; + // En mode création, pas de champ pour changer le mot de passe + newPassword.parentNode.style.display="none"; + // Inutile en mode création + timeDifference.parentNode.style.display="none"; + } + emptyUserForm(); + // Initialise les contraintes du formulaire : + setAttributesToInputs(configUsers, formUser); + + // Fonction affichant les infos connues concernant un utilisateur et son abonnement + const showFormUserInfos = (id) => + { + // on commence par tout vider, des fois que... : + emptyUserForm(); + const xhrGetInfos = new XMLHttpRequest(); + xhrGetInfos.open("GET", apiUrl+configUsers.userRoutes+configUsers.getUserInfos+id); + xhrGetInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && response.User != undefined) + { + newPassword.parentNode.style.display="block"; + timeDifference.parentNode.style.display="block"; + const mapText = + { + ID_USER : response.User.id, + DATE_CREA : dateFormat(response.User.createdAt), + DATE_UPDATE : dateFormat(response.User.updatedAt), + DATE_CONNECTION : dateFormat(response.User.connectedAt) + }; + let subscribeIntro=replaceAll(txtInfosUserForAdmin, mapText); + for(let data in response.User) + { + if(formUser.elements[data]!==undefined) + { + if(response.User[data]!==true && response.User[data]!==false)// booléen = case à cocher ! + formUser.elements[data].value=response.User[data]; + else if (response.User[data]==true) // si false, on ne fait rien + formUser.elements[""+data].checked="checked"; + } + } + if(response.Subscription != undefined) + { + // nombre de jours de l'abonnement + formUser.elements["numberOfDays"].value=response.Subscription["numberOfDays"]; + if(response.Subscription.noticeOk==true) + formUser.elements["noticeOk"].checked="checked"; + // jours de réception + for(let i in response.Subscription.receiptDays) + formUser.elements["d"+response.Subscription.receiptDays[i]].checked="checked"; + const beginSubTS=new Date(response.Subscription.createdAt).getTime(); + const nbDaysOk=response.Subscription.numberOfDays-Math.round((Date.now()-beginSubTS)/1000/3600/24); + if(nbDaysOk > 0) + subscribeIntro+="
    "+txtInfosNbDaysAdmin.replace("NB_DAYS", nbDaysOk); + else + subscribeIntro+="
    "+txtInfosExpiratedAdmin; + addElement(divSubscribeIntro, "p", subscribeIntro, "", ["info"], "", false); + } + else + { + addElement(divSubscribeIntro, "p", txtIsNotValided, "", ["error"]); + validationCheckBox.style.display="block"; + } + deleteCheckBox.style.display="block"; + // Infos de paiements via API WP + const xhrGetPaymentsInfos = new XMLHttpRequest(); + xhrGetPaymentsInfos.open("GET", apiUrl+configUsers.getPayments+response.User.id); + xhrGetPaymentsInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let responsePay=JSON.parse(this.responseText); + if (this.status === 200) + { + if(responsePay.length!==0) + { + let txtPayments=""; + for(let i in responsePay) + { + const mapText = + { + DATE_PAYMENT : dateFormat(responsePay[i].createdAt, "fr"), + AMOUNT : responsePay[i].amount, + CLIENT_NAME : responsePay[i].clientName + }; + txtPayments+="
  • "+replaceAll(txtInfosPaymentsAdmin, mapText)+"
  • "; + } + addElement(divPaymentsInfos, "ul", txtPayments, "", ["info"], "", false); + divPaymentsInfos.style.display="block" + } + } + } + } + xhrGetPaymentsInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetPaymentsInfos.send(); + + // Un parrain ou deux par deux ? + if(!isEmpty(response.User.GodfatherId)) + { + const xhrGetGodFatherInfos = new XMLHttpRequest(); + xhrGetGodFatherInfos.open("GET", apiUrl+configUsers.userRoutes+configUsers.getUserInfos+response.User.GodfatherId); + xhrGetGodFatherInfos.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let responseGF=JSON.parse(this.responseText); + if (this.status === 200 && responseGF.User != undefined) + { + addElement(divGodchildsInfos, "p", txtInfosAdminGodfather+""+responseGF.User.name+""+".
    ", "", ["info"], "", false); + divGodchildsInfos.style.display="block"; + } + } + } + xhrGetGodFatherInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetGodFatherInfos.send(); + } + + // Des filleuls ? + let txtGodchilds=""; + const xhrGetGodchilds = new XMLHttpRequest(); + xhrGetGodchilds.open("GET", apiUrl+configUsers.userRoutes+configUsers.getGodChilds+id); + xhrGetGodchilds.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let responseGS=JSON.parse(this.responseText); + if (this.status === 200) + { + if(responseGS.length!==0) + { + txtGodchilds+=txtInfosAdminNbGodChilds.replace("#NB", responseGS.length); + for(let i in responseGS) + txtGodchilds+=""+responseGS[i].name+""; + addElement(divGodchildsInfos, "p", txtGodchilds+".", "", ["info"], "", false); + divGodchildsInfos.style.display="block"; + } + } + } + } + xhrGetGodchilds.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetGodchilds.send(); + } + } + } + xhrGetInfos.setRequestHeader("Authorization", "Bearer "+user.token); + xhrGetInfos.send(); + } + + // Si un id est passé par l'url, on essaye d'afficher l'utilisateur : + let urlDatas=getUrlParams(); + if(urlDatas && urlDatas.id!==undefined) + showFormUserInfos(urlDatas.id); + + // Besoin d'un coup de Kärcher ? + btnNewUser.addEventListener("click", function(e) + { + emptyUserForm(); + }); + + // Envoi du formulaire des infos de l'utilisateur + formUser.addEventListener("submit", function(e) + { + e.preventDefault(); + divResponse.innerHTML=""; + let datas=getDatasFromInputs(formUser); + // recomposition des jours valables pour l'abonnement : + datas.receiptDays=""; + for(let i=1; i<=7; i++) + { + if(datas["d"+i]!==undefined) + datas.receiptDays+=""+i; + } + if(datas.noticeOk===undefined) + datas.noticeOk="false"; + if(datas.newsletterOk===undefined) + datas.newsletterOk="false"; + const xhrUserDatas = new XMLHttpRequest(); + if(!isEmpty(datas.id) && (datas.deleteOk!==undefined)) + xhrUserDatas.open("DELETE", apiUrl+configUsers.userRoutes+"/"+datas.id); + else if(!isEmpty(datas.id) && (datas.validationOk!==undefined)) + xhrUserDatas.open("POST", apiUrl+configUsers.userRoutes+configUsers.validateUserRoute+datas.id); + else if(!isEmpty(datas.id)) + xhrUserDatas.open("PUT", apiUrl+configUsers.userRoutes+configUsers.updateUserInfos+datas.id); + else + { + console.log("je suis ici"); + datas.password=getPassword(configUsers.password.minlength, configUsers.password.minlength+2);// mot de passe temporaire + xhrUserDatas.open("POST", apiUrl+configUsers.userRoutes+configUsers.createUserRoute); + } + xhrUserDatas.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 201 && response.id!=undefined) + { + addElement(divResponse, "p", txtAddOkMessage, "", ["success"]); + datas.id=response.id; + } + else if (this.status === 200 && response.message!=undefined) + { + if(Array.isArray(response.message)) + response.message = response.message.join("
    "); + else + response.message = response.message; + addElement(divResponse, "p", response.message, "", ["success"]); + } + else if (response.errors) + { + if(Array.isArray(response.errors)) + response.errors = response.errors.join("
    "); + else + response.errors = txtServerError; + addElement(divResponse, "p", response.errors, "", ["error"]); + } + else + addElement(divResponse, "p", txtServerError, "", ["error"]); + if(isEmpty(response.errors)) + { + if(datas.deleteOk===undefined) + showFormUserInfos(datas.id); + else + emptyUserForm(); + } + } + } + xhrUserDatas.setRequestHeader("Content-Type", "application/json"); + xhrUserDatas.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + xhrUserDatas.send(JSON.stringify(datas)); + }); + + // Traitement du lancement d'une recherche + formSearch.addEventListener("submit", function(e) + { + e.preventDefault(); + let datas=getDatasFromInputs(formSearch); + const xhrSearch = new XMLHttpRequest(); + xhrSearch.open("POST", apiUrl+configUsers.userRoutes+configUsers.searchUserRoute); + xhrSearch.onreadystatechange = function() + { + if (this.readyState == XMLHttpRequest.DONE) + { + let response=JSON.parse(this.responseText); + if (this.status === 200 && Array.isArray(response)) + { + if(response.length===0) + addElement(divSearchResult, "p", txtNotFound, "", ["info"]); + else + { + let selectHTML=""; + for(let i in response) + selectHTML+=""; + addElement(divSearchResult, "select", selectHTML, "selectSearch"); + const searchSelect=document.getElementById("selectSearch"); + searchSelect.addEventListener("change", function() + { + if(searchSelect.value!=="") + showFormUserInfos(searchSelect.value); + }); + } + } + else + addElement(divSearchResult, "p", txtServerError, "", ["error"]); + } + } + xhrSearch.setRequestHeader("Content-Type", "application/json"); + xhrSearch.setRequestHeader("Authorization", "Bearer "+user.token); + if(datas) + xhrSearch.send(JSON.stringify(datas)); + }); } } catch(e) { + addElement(divCrash, "p", txtServerError, "", ["error"]); console.error(e); - addElement(divMessage, "p", txt.serverError, "", ["error"]); } } initialise(); \ No newline at end of file