personnal/etv2/public/js/nav-parcours.js

333 lines
14 KiB
JavaScript

document.addEventListener('DOMContentLoaded', function() {
var inputChanged = false
function openModalUpdate(selectedSubmenu, numParcours) {
const elem = document.getElementById('modalUpdate');
const instance = M.Modal.getInstance(elem);
document.getElementById('update-OK').addEventListener("click", function () {
instance.close()
loadForm(selectedSubmenu, numParcours);
inputChanged = false
})
instance.open();
}
// Fonction pour charger le contenu du formulaire
function loadForm(submenu, numParcours) {
const navLinks = document.querySelectorAll('#navParcoursSelect li a');
const formContainer = document.querySelector('#formContainer');
// Supprimer la classe 'active' de tous les liens
navLinks.forEach(navLink => navLink.parentNode.classList.remove('active'));
// Ajouter la classe 'active' au lien sélectionné
const activeLink = document.querySelector(`#navParcoursSelect li a[href="${submenu}"]`);
if (activeLink) {
activeLink.parentNode.classList.add('active');
}
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
const contrat = JSON.parse(sessionStorage.getItem('contrat'));
let produit = parcours["@expand"].contrat.produit
const produitObj = contrat?.["@expand"]?.enCours || null;
const tarif = produitObj?.["@expand"]?.tarif || null;
const projet = produitObj?.["@expand"]?.projet || null;
let scriptSrc;
// let newScriptModuloSrc;
// Mettre à jour l'URL sans recharger la page
const newUrl = `/navParcours?numParcours=${numParcours}&submenu=${submenu}`;
history.pushState({numParcours: numParcours, submenu: submenu}, '', newUrl);
if (submenu === "projet") {
fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`;
scriptSrc = `/js/projet-form-${produit}.js`;
} else if (submenu === "tarif") {
fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`;
scriptSrc = `/js/tarif-form-${produit}.js`;
} else {
fetchUrl = `/navParcours/${submenu}?numParcours=${numParcours}`;
scriptSrc = `/js/${submenu}-form.js`;
}
const etapes = {
"client": contrat?.client || null,
"intermediaire": contrat?.intermediaire || null,
"tarif": contrat?.["@expand"]?.enCours?.["@expand"]?.tarif?.id || null,
"projet": contrat?.["@expand"]?.enCours?.["@expand"]?.projet?.id || null,
"contrat": null
}
for (const [key, value] of Object.entries(etapes)) {
document.getElementById('step-' + key).classList = (value) ? 'stepper-item line' : 'stepper-item'
if(key == submenu){
document.getElementById('step-' + key).classList.add('active')
} else {
if (value){
document.getElementById('step-' + key).classList.add('completed')
} else if (key == "client" || key == "intermediaire") {
document.getElementById('step-' + key).classList.add('empty')
}
}
if (key == "tarif" && etapes['projet']){
document.getElementById('step-' + key).classList.add('line')
}
}
showLoader();
// Charger le formulaire associé
fetch(fetchUrl)
.then(response => response.text())
.then(html => {
formContainer.innerHTML = html;
// Suppression de tout script précédemment chargé
const oldScript = document.querySelector('script.dynamic-script');
if (oldScript) {
oldScript.remove();
}
// Création et ajout du nouveau script correspondant au sous-menu
const script = document.createElement('script');
script.src = scriptSrc
script.className = 'dynamic-script';
document.body.appendChild(script);
if (submenu === "tarif" || submenu == "projet") {
//RELOAD PARCOURS & CONTRAT
loadParcours(numParcours);
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
if (parcours) {
const contratId = parcours?.["@expand"]?.contrat?.id || null;
loadContrat(contratId);
}
}
script.onload = function() {
if (typeof window.initSubmenuForm === 'function') {
window.initSubmenuForm();
}
};
document.querySelectorAll('input').forEach((input) => {
input.addEventListener('input', function () {
inputChanged = true
})
})
hideLoader();
})
.catch(error => {
console.error('Error:', error);
hideLoader();
if (typeof window.showError === 'function') {
window.showError("Erreur lors du chargement du formulaire. Vérifiez votre connexion.");
}
});
//A MODIFIER UNE FOIS QUE RC SERA ADAPTé AU PARCOURS
if (produit == "RC") {
if (Object.keys(contrat?.["@expand"]?.enCours).length > 1) {
document.getElementById('generateProject').disabled = false;
}
} else {
// Enable / disable bouton generate project
if (parcours["@expand"].contrat.client != '' && parcours["@expand"].contrat.intermediaire != '' && produitObj != undefined && projet != null) {
document.getElementById('generateProject').disabled = false;
}
// Enable / disable bouton generate déclinaison
if (parcours["@expand"].contrat.client != '' && parcours["@expand"].contrat.intermediaire != '' && produitObj != undefined && tarif != null) {
document.getElementById('generateDeclinaison').disabled = false;
}
}
}
// Gestionnaire d'événements 'popstate'
window.addEventListener('popstate', function (event) {
const numParcours = event.state?.numParcours || getNumParcoursFromURL();
const submenu = event.state?.submenu || getSubmenuFromURL();
if (numParcours && submenu) {
loadForm(submenu, numParcours);
}
});
document.getElementById('recueilClauses').addEventListener('click', function() {
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
var produit = parcours["@expand"].contrat.produit
const btn = this // bouton "générer projet"
btn.disabled = true; // le desactiver le temps du téléchargement
var fileName
switch (produit.toLowerCase()) {
case 'fac':
fileName = "CLAUSES_RECUEIL_FAC_VALIDE_AU_22_11_2022.docx";
break;
case 'rc' :
fileName = 'CLAUSES_RECUEIL_RC_TRANSPORT_VALIDE_AU_02_04_2025.docx';
break;
case 'tppc':
fileName = "CLAUSES_RECUEIL_TPPC_VALIDE_AU_01_2022.docx";
break;
}
const url = `/download/${fileName}`;
fetch(url)
.then(response => response.blob())
.then(blob => {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = fileName;
link.click();
})
.finally(() => {
btn.disabled = false; // réactiver le bouton a la fin du téléchargement
})
.catch(error => console.error('Error downloading file:', error));
});
// Fonction de génération de projet
document.getElementById('generateProject').addEventListener('click', function() {
const numParcours = getNumParcoursFromURL();
let filename;
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
let produit = parcours["@expand"].contrat.produit
const btn = this // bouton "générer projet"
btn.disabled = true; // le desactiver le temps du téléchargement
// Envoi de la requête POST au serveur pour générer le projet
fetch(`/generate/${produit}/projet/${numParcours}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
})
.then(response => {
if (!response.ok) {
throw new Error('Erreur réseau ou serveur');
}
const disposition = response.headers.get('content-disposition');
filename = disposition.split(';')[1].trim().split('=')[1];
return response.blob(); // On attend une réponse sous forme de blob pour un fichier
})
.then(blob => {
// Crée un URL pour le blob
const url = window.URL.createObjectURL(blob);
// Crée un élément a temporaire pour simuler un clic pour téléchargement
const a = document.createElement('a');
a.href = url;
a.download = filename; // Nomme le fichier téléchargé
document.body.appendChild(a); // Ajoute l'élément au document
a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
window.URL.revokeObjectURL(url); // Nettoie l'URL objet
a.remove(); // Supprime l'élément a du document
})
.finally(() => {
btn.disabled = false; // réactiver le bouton a la fin du téléchargement
})
.catch(error => console.error('Erreur lors de la génération du projet:', error));
});
document.getElementById('generateDeclinaison').addEventListener('click', function() {
const numParcours = getNumParcoursFromURL();
let filename;
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
let produit = parcours["@expand"].contrat.produit
const btn = this // bouton "générer déclinaison tarifaire"
btn.disabled = true; // le desactiver le temps du téléchargement
// Envoi de la requête POST au serveur pour générer le projet
fetch(`/generate/${produit}/tarif/${numParcours}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
})
.then(response => {
if (!response.ok) {
throw new Error('Erreur réseau ou serveur');
}
const disposition = response.headers.get('content-disposition');
filename = disposition.split(';')[1].trim().split('=')[1];
return response.blob(); // On attend une réponse sous forme de blob pour un fichier
})
.then(blob => {
// Crée un URL pour le blob
const url = window.URL.createObjectURL(blob);
// Crée un élément a temporaire pour simuler un clic pour téléchargement
const a = document.createElement('a');
a.href = url;
a.download = filename; // Nomme le fichier téléchargé
document.body.appendChild(a); // Ajoute l'élément au document
a.click(); // Simule un clic sur l'élément pour déclencher le téléchargement
window.URL.revokeObjectURL(url); // Nettoie l'URL objet
a.remove(); // Supprime l'élément a du document
})
.finally(() => {
btn.disabled = false; // réactiver le bouton a la fin du téléchargement
})
.catch(error => console.error('Erreur lors de la génération du projet:', error));
});
// Fonction d'initialisation
async function init() {
const numParcours = getNumParcoursFromURL();
const submenu = getSubmenuFromURL();
await loadParcours(numParcours);
// Accéder aux informations stockées du parcours
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
if (parcours) {
// Mise à jour de l'interface avec les informations du parcours
document.getElementById("displayedNumParcours").innerText = parcours.numParcours;
await loadContrat(parcours["@expand"].contrat.id);
// Accéder aux informations stockées du contrat
const contrat = JSON.parse(sessionStorage.getItem('contrat'));
const client = contrat?.["@expand"]?.client || null;
document.getElementById("displayedClient").innerText = client?.nom ?? "Information non disponible";
// Attacher les écouteurs de clic aux liens de sous-menu
document.querySelectorAll('#navParcoursSelect li a').forEach(link => {
link.addEventListener('click', function(event) {
event.preventDefault();
const selectedSubmenu = this.getAttribute('href');
if (inputChanged) {
openModalUpdate(selectedSubmenu, numParcours)
} else {
loadForm(selectedSubmenu, numParcours);
}
});
});
// Charger le sous-menu spécifié dans l'URL s'il existe
if (submenu) {
loadForm(submenu, numParcours);
}
}
}
// Exécutez init et gérez les erreurs potentielles
init().catch(error => console.error('Error initializing the form:', error));
});