327 lines
14 KiB
JavaScript
327 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));
|
|
|
|
//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));
|
|
});
|