Initial commit - Application CLEO de gestion de devis
- Architecture MVC avec framework maison d6 - Modules : devis, clients, marchés, SAP - Documentation initiale (README et TODO) - Configuration Composer avec dépendances 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
722
pub/res/js/jusers.js
Normal file
722
pub/res/js/jusers.js
Normal file
@@ -0,0 +1,722 @@
|
||||
//! 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 = '<input type="text" class="form-control" name="' + nameInputMotCle + '" placeholder="Mot clé du marché" maxlength="30" value="' + valInputMotCle + '" />';
|
||||
let celTermeAchat = newRow.insertCell(3);
|
||||
nameInputAchat = "motcleachat_" + val["rowid"];
|
||||
celTermeAchat.innerHTML = '<input type="text" class="form-control" name="' + nameInputAchat + '" placeholder="Mot clé pour achat" maxlength="30" value="' + valInputAchat + '" />';
|
||||
let celTermeVente = newRow.insertCell(4);
|
||||
nameInputVente = "motclevente_" + val["rowid"];
|
||||
celTermeVente.innerHTML = '<input type="text" class="form-control" name="' + nameInputVente + '" placeholder="Mot clé pour vente" maxlength="30" value="' + valInputVente + '" />';
|
||||
}
|
||||
}
|
||||
}
|
||||
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 = '<input type="text" class="form-control" name="id_' + val["rowid"] + '" maxlength="4" value="' + val["rowid"] + '" disabled />';
|
||||
let celGroupe = newRow.insertCell(1);
|
||||
celGroupe.innerHTML = '<input type="text" class="form-control" name="groupe_' + val["rowid"] + '" placeholder="Nom du groupe" maxlength="30" value="' + val["groupe"] + '" />';
|
||||
let celFamille = newRow.insertCell(2);
|
||||
//! on insère dans cette cellule le select des familles
|
||||
let selFamille = '<select class="form-control" name="famille_' + val["rowid"] + '">';
|
||||
for (let key2 in familles) {
|
||||
if (familles.hasOwnProperty(key2)) {
|
||||
// Récupération des valeurs de la ligne familles
|
||||
let val2 = familles[key2];
|
||||
if (val2["rowid"] == val["fk_famille"]) {
|
||||
selFamille += '<option value="' + val2["rowid"] + '" selected>' + val2["libelle"] + '</option>';
|
||||
} else {
|
||||
selFamille += '<option value="' + val2["rowid"] + '">' + val2["libelle"] + '</option>';
|
||||
}
|
||||
}
|
||||
}
|
||||
selFamille += '</select>';
|
||||
celFamille.innerHTML = selFamille;
|
||||
let celActions = newRow.insertCell(3);
|
||||
celActions.className = "text-center";
|
||||
celActions.innerHTML = '<button type="button" class="btn btn-danger btn-xs btnSuppFamille" data-rowid="' + val["rowid"] + '"><i class="fa fa-trash"></i></button>';
|
||||
}
|
||||
}
|
||||
document.getElementById("modFamillesTitre").innerHTML = '<i class="fa fa-stack-exchange fa-lg"></i> Liste des ' + nbFamilles + ' familles de produits trouvées';
|
||||
} else {
|
||||
// Aucune famille trouvée dans cette recherche
|
||||
document.getElementById("modFamillesTitre").innerHTML = '<i class="fa fa-stack-exchange fa-lg"></i> 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 = '<input type="text" class="form-control" name="id_' + idNewFamille + '" maxlength="4" value="' + idNewFamille + '" disabled />';
|
||||
let celGroupe = newRow.insertCell(1);
|
||||
celGroupe.innerHTML = '<input type="text" class="form-control" name="groupe_' + idNewFamille + '" placeholder="Nom du groupe" maxlength="30" value="" />';
|
||||
let celFamille = newRow.insertCell(2);
|
||||
celFamille.innerHTML = '<input type="text" class="form-control" name="famille_' + idNewFamille + '" placeholder="Nom de la famille" maxlength="30" value="" />';
|
||||
//! on insère dans cette cellule le select des familles
|
||||
let selFamille = '<select class="form-control" name="famille_' + idNewFamille + '">';
|
||||
selFamille += '<option value="0" selected>Sélectionner une famille</option>';
|
||||
for (let key in familles) {
|
||||
if (familles.hasOwnProperty(key)) {
|
||||
// Récupération des valeurs de la ligne
|
||||
let val = familles[key];
|
||||
selFamille += '<option value="' + val["rowid"] + '">' + val["libelle"] + '</option>';
|
||||
}
|
||||
}
|
||||
selFamille += '</select>';
|
||||
celFamille.innerHTML = selFamille;
|
||||
let celActions = newRow.insertCell(3);
|
||||
celActions.className = "text-center";
|
||||
celActions.innerHTML = '<button type="button" class="btn btn-danger btn-xs btnSuppFamille" data-rowid="' + idNewFamille + '"><i class="fa fa-trash"></i></button>';
|
||||
|
||||
//! 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);
|
||||
});
|
||||
Reference in New Issue
Block a user