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

348 lines
15 KiB
JavaScript

document.addEventListener('DOMContentLoaded', function() {
var inputChanged = false
let assetVersion = null;
function getAssetVersion() {
if (assetVersion) return assetVersion;
assetVersion = String(Date.now());
return assetVersion;
}
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 = String(parcours?.["@expand"]?.contrat?.produit || '').toLowerCase();
const produitObj = contrat?.["@expand"]?.enCours || null;
// RC utilise tarifRC/projetRC, les autres produits utilisent tarif/projet
let tarif, projet;
if (produit === "rc") {
tarif = produitObj?.["@expand"]?.tarifRC || null;
projet = produitObj?.["@expand"]?.projetRC || null;
} else {
tarif = produitObj?.["@expand"]?.tarif || null;
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/${produit}/projet-form-${produit}.js`;
} else if (submenu === "tarif") {
fetchUrl = `/navParcours/${submenu}${produit}?numParcours=${numParcours}`;
scriptSrc = `/js/${produit}/tarif-form-${produit}.js`;
} else {
fetchUrl = `/navParcours/${submenu}?numParcours=${numParcours}`;
scriptSrc = `/js/${submenu}-form.js`;
}
// RC utilise tarifRC/projetRC, les autres produits utilisent tarif/projet
let tarifId, projetId;
if (produit === "rc") {
tarifId = contrat?.["@expand"]?.enCours?.["@expand"]?.tarifRC?.id || null;
projetId = contrat?.["@expand"]?.enCours?.["@expand"]?.projetRC?.id || null;
} else {
tarifId = contrat?.["@expand"]?.enCours?.["@expand"]?.tarif?.id || null;
projetId = contrat?.["@expand"]?.enCours?.["@expand"]?.projet?.id || null;
}
const etapes = {
"client": contrat?.client || null,
"intermediaire": contrat?.intermediaire || null,
"tarif": tarifId,
"projet": projetId,
"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')
}
}
// 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}?v=${encodeURIComponent(getAssetVersion())}`;
script.className = 'dynamic-script';
script.onload = async function() {
if (submenu === "tarif" || submenu == "projet") {
try {
// Recharger les donnees avant d'initialiser le script du formulaire.
await loadParcours(numParcours);
const latestParcours = JSON.parse(sessionStorage.getItem('parcours'));
const contratId = latestParcours?.["@expand"]?.contrat?.id || null;
if (contratId) {
await loadContrat(contratId);
}
} catch (error) {
console.error('Erreur lors du rafraichissement parcours/contrat:', error);
}
}
if (typeof window.initSubmenuForm === 'function') {
window.initSubmenuForm();
}
};
document.body.appendChild(script);
document.querySelectorAll('input').forEach((input) => {
input.addEventListener('input', function () {
inputChanged = true
})
})
})
.catch(error => console.error('Error:', error));
// Gestion des boutons de génération pour tous les produits
const hasClient = parcours["@expand"]?.contrat?.client != '';
const hasIntermediaire = parcours["@expand"]?.contrat?.intermediaire != '';
const hasProduit = produitObj != undefined;
// Bouton génération déclinaison tarifaire
if (hasClient && hasIntermediaire && hasProduit && tarif != null) {
document.getElementById('generateDeclinaison').disabled = false;
} else {
document.getElementById('generateDeclinaison').disabled = true;
}
// Bouton génération projet
if (hasClient && hasIntermediaire && hasProduit && projet != null) {
document.getElementById('generateProject').disabled = false;
} else {
document.getElementById('generateProject').disabled = true;
}
}
// 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
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();
})
.catch(error => console.error('Error downloading file:', error));
});
// Fonction de génération de projet
document.getElementById('generateProject').addEventListener('click', async function() {
const numParcours = getNumParcoursFromURL();
let filename;
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
let produit = parcours["@expand"].contrat.produit
// Sauvegarder les données du projet avant de générer le document (si RC)
if (produit.toLowerCase() === 'rc' && typeof window.saveProjetRC === 'function') {
console.log('Sauvegarde des données projet RC avant génération...');
const saveResult = await window.saveProjetRC();
if (!saveResult || !saveResult.valid) {
console.error('Échec de la sauvegarde du projet RC');
M.toast({html: 'Erreur lors de la sauvegarde du projet. Veuillez réessayer.'});
return;
}
}
// 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
})
.catch(error => console.error('Erreur lors de la génération du projet:', error));
});
document.getElementById('generateDeclinaison').addEventListener('click', async function() {
const numParcours = getNumParcoursFromURL();
let filename;
const parcours = JSON.parse(sessionStorage.getItem('parcours'));
let produit = parcours["@expand"].contrat.produit
// Envoi de la requête POST au serveur pour générer la déclinaison tarifaire
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
})
.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));
});