//! 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);
});