//! jusers.js let idUser; let libUser; let oldColorLn; let oldIdLn; window.addEventListener('DOMContentLoaded', (event) => { console.log('#'); // Initialisation des éléments utilisés let elLigUsers = document.getElementsByClassName("ligUser"); let elCelUsers = document.getElementsByClassName("celUser"); let elBtnCreateUser = document.getElementById("btnCreateUser"); let elBtnModUsers = document.getElementsByClassName("btnModUser"); let elBtnCancelModUser = document.getElementById("btnCancelModUser"); let elBtnSubmitModUser = document.getElementById("btnSubmitModUser"); let elBtnSuppUsers = document.getElementsByClassName("btnSuppUser"); let elBtnMaintenance = document.getElementById("btnMaintenance"); let tabRoles; // tableau des rôles let tabRegions; // tableau des régions // on récupère la liste des rôles fetch('/jxpost/load_roles', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json;charset=utf-8', } }).then((response) => { if (!response.ok) { showNotification("Erreur", "Le chargement des rôles n'a pas pu s'effectuer", "error"); } else { const ret = response.json(); ret.then(function (ret) { tabRoles = ret; }); } }); // et la liste des régions fetch('/jxpost/load_regions', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json;charset=utf-8', } }).then((response) => { if (!response.ok) { showNotification("Erreur", "Le chargement des régions n'a pas pu s'effectuer", "error"); } else { const ret = response.json(); ret.then(function (ret) { tabRegions = ret; }); } }); let clickLigUser = function () { //! Event Click sur une cellule d'une ligne d'un marché qui a la classe celUsers idUser = this.getAttribute("data-rowid"); libUser = this.getAttribute("data-libelle"); showLoading(); Array.from(elCelUsers).forEach(function (clickLigUser) { if (clickLigUser.getAttribute("data-rowid") == oldIdLn) { clickLigUser.style.backgroundColor = oldColorLn; } else if (clickLigUser.getAttribute("data-rowid") == idUser) { oldColorLn = clickLigUser.style.backgroundColor; clickLigUser.style.backgroundColor = "#9bbce7"; } }); oldIdLn = idUser; // effectue la requête ajax fetch pour charger les produits du marché fetch('/jxpost/load_user', { method: 'POST', body: JSON.stringify({cid: idUser}), headers: { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json;charset=utf-8', } }) .then((response) => { if (!response.ok) { showNotification("Erreur", "Le chargement des informations de l'utilisateur n'a pas pu s'effectuer", "error"); } else { const ret = response.json(); ret.then(function (ret) { }); } }) .catch((error) => { console.error('Error:', error); showNotification("Erreur", "Le chargement des produits de ce marché n'a pas pu s'effectuer", "error"); }); hideLoading(); return false; }; let clickCreateUser = function () { //! Event Click sur le bouton de création d'un marché //! on reset les champs du formulaire form = document.getElementById("frmUser"); form.reset(); //! on met tous les input de type number à 0 let inputs = document.querySelectorAll('input[type=number]'); for (let i = 0; i < inputs.length; i++) { inputs[i].value = 0; } //! on reset le champ caché rowid document.getElementById("userRowid").value = "0"; document.getElementById("userAct").value = "C"; document.getElementById("userActive").checked = true; document.getElementById("modUserTitre").innerHTML = "Création d'un nouvel utilisateur"; showModal(document.getElementById("modalEditUser")); document.getElementById("userLibelle").focus(); } let clickModUser = function () { //! Event Click sur un bouton de modification d'une ligne d'un marché idUser = this.getAttribute("data-rowid"); libUser = this.getAttribute("data-libelle"); showLoading(); // Va chercher la 1ère cellule de la ligne pour lancer la function click() => clickLigUser let firstCellOfRow = this.parentNode.parentNode.cells[0]; firstCellOfRow.click(); fetch('/jxpost/load_user', { method: 'POST', body: JSON.stringify({cid: idUser}), headers: { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json;charset=utf-8', } }) .then((response) => { if (!response.ok) { showNotification("Erreur", "Le chargement des informations de cet utilisateur n'a pas pu s'effectuer", "error"); } else { const ret = response.json(); //! Boucle sur le résultat de la requête ajax ret.then(function (ret) { if (ret.length == 1) { let user = ret[0]; document.getElementById("userAct").value = "M"; document.getElementById("userRowid").value = user.rowid; document.getElementById("userLibelle").value = user.libelle; document.getElementById("userPrenom").value = user.prenom; document.getElementById("userEmail").value = user.email; document.getElementById("userMobile").value = user.mobile; document.getElementById("userName").value = user.username; if (user.chk_grands_comptes == '1') { document.getElementById("userChk_grands_comptes").checked = true; } else { document.getElementById("userChk_grands_comptes").checked = false; } document.getElementById("userRole").value = user.fk_role; document.getElementById("userParent").value = user.fk_parent; document.getElementById("userRegion").value = user.fk_region; document.getElementById("userLst_depts").value = user.lst_depts; if (user.active == '1') { document.getElementById("userActive").checked = true; } else { document.getElementById("userActive").checked = false; } document.getElementById("modUserTitre").innerHTML = "Modification de la fiche de l'utilisateur " + libUser; showModal(document.getElementById("modalEditUser")); document.getElementById("userLibelle").focus(); } }); } }); hideLoading(); return false; } let clickCancelModUser = function () { //! Event Click sur le bouton Annuler de la modale d'un marché hideModal(document.getElementById("modalEditUser")); } let clickSubmitModUser = function () { //! Event Click sur le bouton Enregistrer de la modale d'un utilisateur if (document.getElementById("userLibelle").value == "") { showNotification("Enregistrement impossible", "L'utilisateur doit obligatoirement avoir un nom", "warning"); document.getElementById("userLibelle").focus(); return false; } if (document.getElementById("userName").value == "") { showNotification("Enregistrement impossible", "L'utilisateur doit obligatoirement avoir un Login pour se connecter", "warning"); document.getElementById("userName").focus(); return false; } if (document.getElementById("userEmail").value == "") { showNotification("Enregistrement impossible", "L'utilisateur doit obligatoirement avoir un email", "warning"); document.getElementById("userEmail").focus(); return false; } if (document.getElementById("userRole").value == 0) { showNotification("Enregistrement impossible", "L'utilisateur doit obligatoirement avoir un rôle", "warning"); document.getElementById("userRole").focus(); return false; } showLoading(); let frmData = new FormData(document.getElementById('frmUser')); let objData = {}; frmData.forEach(function (value, key) { objData[key] = value; }); fetch('/jxpost/save_user', { method: 'POST', body: JSON.stringify(objData), headers: { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json;charset=utf-8', } }).then((response) => { if (!response.ok) { showNotification("Erreur", "L'enregistrement de cet utilisateur n'a pas pu s'effectuer", "error"); } else { const ret = response.json(); ret.then(function (ret) { if (ret.ret == "ok") { showNotification("Enregistrement", "L'enregistrement de cet utilisateur a été effectué avec succès", "success"); } else { showNotification("Enregistrement", "Erreur lors de l'enregistrement de cet utilisateur", "error"); } }); } }); hideLoading(); if (document.getElementById("userRowid").value == "0") { //! si c'était une création, on ajoute le nouveau marché en bas de tableau // TODO: on ajoute la ligne créée dans le tableau } else { //! on recherche la ligne du tableau à mettre à jour let cell; Array.from(elLigUsers).forEach(function (clickLigUser) { cell = clickLigUser.cells[0]; if (cell.getAttribute("data-rowid") == idUser) { clickLigUser.cells[0].innerHTML = document.getElementById("userLibelle").value; clickLigUser.cells[1].innerHTML = document.getElementById("userPrenom").value; // recherche dans tabRoles la valeur de document.getElementById("userRole").value let leRole = tabRoles.find(function (role) { return role.rowid == document.getElementById("userRole").value; }); if (leRole == undefined) { clickLigUser.cells[2].innerHTML = ""; } else { clickLigUser.cells[2].innerHTML = leRole.libelle } clickLigUser.cells[3].innerHTML = document.getElementById("userMobile").value; clickLigUser.cells[4].innerHTML = document.getElementById("userEmail").value; let laRegion = tabRegions.find(function (region) { return region.rowid == document.getElementById("userRegion").value; }); if (laRegion == undefined) { clickLigUser.cells[5].innerHTML = ""; } else { clickLigUser.cells[5].innerHTML = laRegion.libelle; } } }) } hideModal(document.getElementById("modalEditUser")); return false; } let clickSuppUser = function () { //! Event Click sur le bouton Supprimer d'un marché idUser = this.getAttribute("data-rowid"); libUser = this.getAttribute("data-libelle"); if (confirm("Voulez-vous vraiment supprimer l'utilisateur " + libUser + " ?")) { if (confirm("ATTENTION ! Cette suppression est définitive et supprimera aussi tous ses devis et historique rattachés. Voulez-vous vraiment supprimer l'utilisateur " + libUser + " ?")) { showLoading(); fetch('/jxpost/delete_user', { method: 'POST', body: JSON.stringify({cid: idUser}), headers: { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json;charset=utf-8', } }).then((response) => { if (!response.ok) { showNotification("Erreur", "La suppression de cet utilisateur n'a pas pu s'effectuer", "error"); } else { const ret = response.json(); ret.then(function (ret) { if (ret.ret == "ok") { //! on recherche la ligne du tableau à supprimer let cell; Array.from(elLigUsers).forEach(function (clickLigUser) { cell = clickLigUser.cells[0]; if (cell.getAttribute("data-rowid") == idUser) { clickLigUser.remove(); } }); showNotification("Suppression", "La suppression de cet utilisateur a été effectuée avec succès", "success"); } else { showNotification("Suppression", "Erreur lors de la suppression de cet utilisateur", "error"); } }); } }); hideLoading(); } } return false; } let clickMaintenance = function () { fetch('/jxpost/maintenance', { method: 'POST', }) } let clickImportProduitsUser = function () { //! Event Click sur le bouton d'importation des produits d'un marché document.getElementById("modImportTitre").innerHTML = "Importation des produits de marché"; showModal(document.getElementById("modalImportUser")); } let clickCancelImportUser = function () { //! Event Click sur le bouton Annuler de la modale d'importation des produits d'un marché hideModal(document.getElementById("modalImportUser")); } let clickSubmitImportProduitsUser = function () { //! Click Importation du CSV des produits d'un marché // TODO: prévoir une progress bar hideModal(document.getElementById("modalImportUser")); showLoading(); let xhttp = new XMLHttpRequest(); xhttp.open("POST", "/jximport/upload_User_produits", true); xhttp.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { let retour = JSON.parse(this.responseText); let msg = ""; hideLoading(); if (retour.ret == "ok") { msg = (retour.message) ? retour.message : "L'importation des produits de ce marché a été effectuée avec succès"; showNotification("Importation", msg, "success"); } else { msg = (retour.message) ? retour.message : "Erreur lors de l'importation des produits de ce marché"; showNotification("Importation", msg, "error"); } } }; let frmData = new FormData(); frmData.append("file1", document.getElementById("importFileUser").files[0]); frmData.append("MAX_FILE_SIZE", document.getElementById("MAX_FILE_SIZE").value) frmData.append("importidUser", document.getElementById("importidUser").value); xhttp.send(frmData); return false; } let clickGestionListes = function () { //! Click sur le bouton de gestion des listes tarifaires par marché // TODO: On appelle la liste de tous les marchés, et pour chaque marché on récupère son éventuelle ligne dans Users_listes showLoading(); let xhttp1 = new XMLHttpRequest(); xhttp1.open("POST", "/jxpost/load_Users_listes", true); xhttp1.setRequestHeader("Content-Type", "application/json"); xhttp1.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { let listes = JSON.parse(this.responseText); //! on alimente dynamiquement les lignes suivant les marchés actuels let xhttp2 = new XMLHttpRequest(); xhttp2.open("POST", "/jxpost/load_Users", true); xhttp2.setRequestHeader("Content-Type", "application/json"); xhttp2.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { let tblBody = document.getElementById("tblListes").getElementsByTagName("tbody")[0]; // on vide le body de cette table tblBody.innerHTML = ""; let mar = JSON.parse(this.responseText); if (mar.length > 0) { // au moins un marché trouvé let nameInputMotCle; let valInputMotCle; let nameInputAchat; let valInputAchat; let nameInputVente; let valInputVente; let laListe; for (let key in mar) { if (mar.hasOwnProperty(key)) { // Récupération des valeurs de la ligne let val = mar[key]; // ## Comment chercher une valeur dans un tableau en javascript laListe = listes.find(({fk_User}) => fk_User === val["rowid"]); if (laListe) { valInputMotCle = laListe["mot_cle"] ? laListe["mot_cle"] : ""; valInputAchat = laListe["terme_achat"] ? laListe["terme_achat"] : ""; valInputVente = laListe["terme_vente"] ? laListe["terme_vente"] : ""; } else { valInputMotCle = ""; valInputAchat = ""; valInputVente = ""; } // Insertion d'une nouvelle ligne et création de ses colonnes let newRow = tblBody.insertRow(0); let celId = newRow.insertCell(0); celId.innerHTML = val['rowid']; let celLibelle = newRow.insertCell(1); celLibelle.innerHTML = val['libelle']; let celMotCle = newRow.insertCell(2); nameInputMotCle = "motcle_" + val["rowid"]; celMotCle.innerHTML = ''; let celTermeAchat = newRow.insertCell(3); nameInputAchat = "motcleachat_" + val["rowid"]; celTermeAchat.innerHTML = ''; let celTermeVente = newRow.insertCell(4); nameInputVente = "motclevente_" + val["rowid"]; celTermeVente.innerHTML = ''; } } } hideLoading(); } } xhttp2.send(); } } xhttp1.send(); showModal(document.getElementById("modalEditListes")); } let clickCancelListes = function () { //! Click sur le bouton Annuler de la modale d'importation des produits d'un marché hideModal(document.getElementById("modalEditListes")); } let clickSubmitListes = function () { //! Click sur le bouton Enregistrer de la modale de la gestion des listes tarifaires par marché hideModal(document.getElementById("modalEditListes")); showLoading(); let xhttp = new XMLHttpRequest(); xhttp.open("POST", "/jxpost/save_Users_listes", true); xhttp.setRequestHeader("Content-Type", "application/json"); xhttp.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { let retour = JSON.parse(this.responseText); if (retour.ret == "ok") { showNotification("Enregistrement", "L'enregistrement de la gestion des listes tarifaires par marché a été effectué avec succès", "success"); } else { showNotification("Enregistrement", "Erreur lors de l'enregistrement", "error"); } hideLoading(); } }; let frmData = new FormData(document.getElementById('frmListes')); let objData = {}; frmData.forEach(function (value, key) { objData[key] = value; }); xhttp.send(JSON.stringify(objData)); } let clickModFamilles = function () { showLoading(); //! on charge d'abord la liste des x_familles let familles; let xhttp1 = new XMLHttpRequest(); xhttp1.open("POST", "/jxpost/load_familles", false); xhttp1.setRequestHeader("Content-Type", "application/json"); xhttp1.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { familles = JSON.parse(this.responseText); } } let data1 = {}; xhttp1.send(JSON.stringify(data1)); //! Ensuite on charge les familles de groupes let xhttp2 = new XMLHttpRequest(); xhttp2.open("POST", "/jxpost/load_familles_groupes", true); xhttp2.setRequestHeader("Content-Type", "application/json"); xhttp2.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { let retour = JSON.parse(this.responseText); let tblBody = document.getElementById("tblFamilles").getElementsByTagName("tbody")[0]; // on vide le body de cette table tblBody.innerHTML = ""; if (retour.length > 0) { // au moins une famille trouvée dans cette recherche let nbFamilles = retour.length; for (let key in retour) { if (retour.hasOwnProperty(key)) { // Récupération des valeurs de la ligne let val = retour[key]; // Insertion d'une nouvelle ligne et création de ses colonnes let newRow = tblBody.insertRow(-1); let celCode = newRow.insertCell(0); celCode.innerHTML = ''; let celGroupe = newRow.insertCell(1); celGroupe.innerHTML = ''; let celFamille = newRow.insertCell(2); //! on insère dans cette cellule le select des familles let selFamille = ''; celFamille.innerHTML = selFamille; let celActions = newRow.insertCell(3); celActions.className = "text-center"; celActions.innerHTML = ''; } } document.getElementById("modFamillesTitre").innerHTML = ' Liste des ' + nbFamilles + ' familles de produits trouvées'; } else { // Aucune famille trouvée dans cette recherche document.getElementById("modFamillesTitre").innerHTML = ' Liste des familles de produits'; let newRow = tblBody.insertRow(0); let celCode = newRow.insertCell(0); celCode.innerHTML = "Aucune famille trouvée"; celCode.setAttribute("colspan", "4"); } hideLoading(); showModal(document.getElementById("modalFamilles")); } } let data2 = {}; xhttp2.send(JSON.stringify(data2)); } let clickCancelFamilles = function () { hideModal(document.getElementById("modalFamilles")); } let clickSubmitFamilles = function () { hideModal(document.getElementById("modalFamilles")); showLoading(); let xhttp = new XMLHttpRequest(); xhttp.open("POST", "/jxpost/save_familles", true); xhttp.setRequestHeader("Content-Type", "application/json"); xhttp.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { let retour = JSON.parse(this.responseText); hideLoading(); if (retour["ret"] == "ok") { showNotification("Familles", retour["msg"], "success"); } else { showNotification("Familles", retour["msg"], "error"); } } } let data = {}; let elTblFamilles = document.getElementById("tblFamilles").getElementsByTagName("tbody")[0]; // on récupère les lignes du tableau let elLignes = elTblFamilles.getElementsByTagName("tr"); let nbLignes = elLignes.length; let elLigne = null; let dataLigne = {}; // on parcourt les lignes du tableau for (let i = 0; i < nbLignes; i++) { elLigne = elLignes[i]; // on récupère les cellules de la ligne let elCellules = elLigne.getElementsByTagName("td"); let nbCellules = elCellules.length; let elCellule = null; dataLigne = {}; // on parcourt les cellules de la ligne for (let j = 0; j < nbCellules; j++) { elCellule = elCellules[j]; // on récupère les inputs de la cellule let elInputs = elCellule.getElementsByTagName("input"); let nbInputs = elInputs.length; if (nbInputs == 1) { let elInput = elInputs[0]; // on récupère le début du nom de l'input jusqu'au _ let nameInput = elInput.getAttribute("name").split("_")[0]; // on récupère la valeur de l'input let valueInput = elInput.value; // on ajoute le couple nom/valeur dans le tableau data dataLigne[nameInput] = valueInput; } let elSel = elCellule.getElementsByTagName("select"); let nbSel = elSel.length; if (nbSel == 1) { let elS = elSel[0]; // on récupère le début du nom de l'input jusqu'au _ let nameInput = elS.getAttribute("name").split("_")[0]; // on récupère la valeur de l'input let valueInput = elS.value; // on ajoute le couple nom/valeur dans le tableau data dataLigne[nameInput] = valueInput; } } // on ajoute le tableau dataLigne dans le tableau data data[i] = dataLigne; } xhttp.send(JSON.stringify(data)); } let clickSuppFamille = function () { } let clickAddFamille = function () { // On incrémente l'id des nouvelles familles idNewFamille++; //! on charge d'abord la liste des x_familles let familles; let xhttp1 = new XMLHttpRequest(); xhttp1.open("POST", "/jxpost/load_familles", false); xhttp1.setRequestHeader("Content-Type", "application/json"); xhttp1.onreadystatechange = function () { if (this.readyState == XMLHttpRequest.DONE && this.status == 200) { familles = JSON.parse(this.responseText); } } let data1 = {}; xhttp1.send(JSON.stringify(data1)); let tblBody = document.getElementById("tblFamilles").getElementsByTagName("tbody")[0]; let newRow = tblBody.insertRow(0); let celCode = newRow.insertCell(0); celCode.innerHTML = ''; let celGroupe = newRow.insertCell(1); celGroupe.innerHTML = ''; let celFamille = newRow.insertCell(2); celFamille.innerHTML = ''; //! on insère dans cette cellule le select des familles let selFamille = ''; celFamille.innerHTML = selFamille; let celActions = newRow.insertCell(3); celActions.className = "text-center"; celActions.innerHTML = ''; //! on met le focus sur le nouveau champ groupe celGroupe.getElementsByTagName("input")[0].focus(); } //! Configuration des événements //! Sur chaque cellule du tableau des marchés ayant la classe celUsers, on affecte un événement click qui appelle la fonction clickLnUser() Array.from(elCelUsers).forEach(function (lnUser) { lnUser.addEventListener('click', clickLigUser); }); //! Sur chaque bouton de modification du tableau des marchés ayant la classe btnModUser, on affecte un événement click qui appelle la fonction clickModUser() Array.from(elBtnModUsers).forEach(function (modUser) { modUser.addEventListener('click', clickModUser); }); //! Sur chaque bouton de suppression du tableau des marchés ayant la classe btnSuppUser, on affecte un événement click qui appelle la fonction clickSuppUser() Array.from(elBtnSuppUsers).forEach(function (suppUser) { suppUser.addEventListener('click', clickSuppUser); }); elBtnCancelModUser.addEventListener('click', clickCancelModUser); elBtnSubmitModUser.addEventListener('click', clickSubmitModUser); elBtnCreateUser.addEventListener('click', clickCreateUser); elBtnMaintenance.addEventListener('click', clickMaintenance); });