190 lines
7.7 KiB
JavaScript
190 lines
7.7 KiB
JavaScript
// Suite Consultance - Script principal
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// Gestion du mode sombre
|
|
const darkModeSwitch = document.getElementById('darkModeSwitch');
|
|
if (darkModeSwitch) {
|
|
// Initialisation du mode sombre selon la préférence enregistrée
|
|
if (localStorage.getItem('darkMode') === 'enabled') {
|
|
document.body.classList.add('dark-mode');
|
|
darkModeSwitch.checked = true;
|
|
updateDarkModeIcon(true);
|
|
} else {
|
|
updateDarkModeIcon(false);
|
|
}
|
|
|
|
// Écouteur d'événement pour le changement de mode
|
|
darkModeSwitch.addEventListener('change', function() {
|
|
const isDarkMode = this.checked;
|
|
document.body.classList.toggle('dark-mode', isDarkMode);
|
|
localStorage.setItem('darkMode', isDarkMode ? 'enabled' : 'disabled');
|
|
updateDarkModeIcon(isDarkMode);
|
|
|
|
// Mettre à jour un attribut de données pour que d'autres scripts puissent détecter le mode
|
|
document.body.setAttribute('data-theme', isDarkMode ? 'dark' : 'light');
|
|
|
|
// Déclencher un événement personnalisé pour informer d'autres scripts du changement
|
|
const event = new CustomEvent('themeChanged', { detail: { darkMode: isDarkMode } });
|
|
document.dispatchEvent(event);
|
|
});
|
|
}
|
|
|
|
// Gestion des couleurs de modules
|
|
setModuleColors();
|
|
|
|
// Mise à jour de l'icône du mode sombre
|
|
function updateDarkModeIcon(isDarkMode) {
|
|
const darkModeLabel = document.querySelector('label[for="darkModeSwitch"]');
|
|
if (darkModeLabel) {
|
|
darkModeLabel.innerHTML = isDarkMode ?
|
|
'<i class="fas fa-moon"></i>' :
|
|
'<i class="fas fa-sun"></i>';
|
|
}
|
|
}
|
|
|
|
// Initialisation des tooltips Bootstrap
|
|
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
|
|
tooltipTriggerList.map(function (tooltipTriggerEl) {
|
|
return new bootstrap.Tooltip(tooltipTriggerEl);
|
|
});
|
|
|
|
// Initialisation des popovers Bootstrap
|
|
var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));
|
|
popoverTriggerList.map(function (popoverTriggerEl) {
|
|
return new bootstrap.Popover(popoverTriggerEl);
|
|
});
|
|
|
|
// Fermeture automatique des alertes après 5 secondes
|
|
setTimeout(function() {
|
|
var alerts = document.querySelectorAll('.alert');
|
|
alerts.forEach(function(alert) {
|
|
var bsAlert = new bootstrap.Alert(alert);
|
|
bsAlert.close();
|
|
});
|
|
}, 5000);
|
|
|
|
// Activation des onglets via URL hash
|
|
if (window.location.hash) {
|
|
const hash = window.location.hash.substring(1);
|
|
const tabEl = document.querySelector(`#${hash}-tab`);
|
|
if (tabEl) {
|
|
const tab = new bootstrap.Tab(tabEl);
|
|
tab.show();
|
|
}
|
|
}
|
|
|
|
// Navigation entre les onglets avec historique
|
|
document.querySelectorAll('[data-bs-toggle="tab"]').forEach(tabEl => {
|
|
tabEl.addEventListener('shown.bs.tab', function(event) {
|
|
const id = event.target.getAttribute('data-bs-target').substring(1).replace('-tab-pane', '');
|
|
history.replaceState(null, null, `#${id}`);
|
|
});
|
|
});
|
|
|
|
// Gestion de la recherche dynamique dans les tableaux
|
|
document.querySelectorAll('.search-input').forEach(input => {
|
|
input.addEventListener('keyup', function() {
|
|
const searchTerm = this.value.toLowerCase();
|
|
const tableId = this.getAttribute('data-table');
|
|
const table = document.getElementById(tableId);
|
|
|
|
if (table) {
|
|
const rows = table.querySelectorAll('tbody tr');
|
|
|
|
rows.forEach(row => {
|
|
const text = row.textContent.toLowerCase();
|
|
if (text.indexOf(searchTerm) > -1) {
|
|
row.style.display = "";
|
|
} else {
|
|
row.style.display = "none";
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
// Confirmation pour les actions de suppression
|
|
document.querySelectorAll('.delete-confirm').forEach(btn => {
|
|
btn.addEventListener('click', function(e) {
|
|
if (!confirm('Êtes-vous sûr de vouloir supprimer cet élément ? Cette action est irréversible.')) {
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Sélection automatique d'un client depuis l'URL
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
const clientId = urlParams.get('client_id');
|
|
if (clientId) {
|
|
const clientSelect = document.getElementById('client_select');
|
|
if (clientSelect) {
|
|
// Sélectionner le client dans la liste déroulante
|
|
Array.from(clientSelect.options).forEach(option => {
|
|
if (option.value === clientId) {
|
|
option.selected = true;
|
|
|
|
// Déclencher un événement change
|
|
const event = new Event('change');
|
|
clientSelect.dispatchEvent(event);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Fonction pour définir les couleurs des modules en fonction de la page active
|
|
function setModuleColors() {
|
|
const navbar = document.querySelector('.navbar');
|
|
const currentPath = window.location.pathname;
|
|
|
|
// Récupérer le module défini dans le HTML via l'attribut data-module
|
|
const moduleFromBody = document.body.getAttribute('data-module');
|
|
let activeModule = 'default';
|
|
|
|
// Si le module est défini dans le corps, l'utiliser
|
|
if (moduleFromBody && moduleFromBody !== 'default') {
|
|
activeModule = moduleFromBody;
|
|
}
|
|
// Sinon, l'inférer à partir du chemin
|
|
else if (currentPath.startsWith('/crm')) {
|
|
activeModule = 'crm';
|
|
} else if (currentPath.startsWith('/propositions')) {
|
|
activeModule = 'propositions';
|
|
} else if (currentPath.startsWith('/devis')) {
|
|
activeModule = 'devis';
|
|
}
|
|
|
|
// Mettre à jour l'attribut data-module si nécessaire
|
|
if (document.body.getAttribute('data-module') !== activeModule) {
|
|
document.body.setAttribute('data-module', activeModule);
|
|
}
|
|
|
|
// Réinitialiser toutes les classes de modules
|
|
navbar.classList.remove('navbar-module-crm', 'navbar-module-propositions', 'navbar-module-devis');
|
|
|
|
// Ajouter les classes en fonction du module actif
|
|
if (activeModule === 'crm') {
|
|
navbar.classList.add('navbar-module-crm');
|
|
updateButtonsForModule('crm');
|
|
} else if (activeModule === 'propositions') {
|
|
navbar.classList.add('navbar-module-propositions');
|
|
updateButtonsForModule('propositions');
|
|
} else if (activeModule === 'devis') {
|
|
navbar.classList.add('navbar-module-devis');
|
|
updateButtonsForModule('devis');
|
|
}
|
|
}
|
|
|
|
// Mise à jour des boutons pour le module actif
|
|
function updateButtonsForModule(moduleName) {
|
|
// Remplacer les classes des boutons primaires par les classes du module
|
|
document.querySelectorAll('.btn-primary').forEach(btn => {
|
|
btn.classList.remove('btn-primary');
|
|
btn.classList.add(`btn-${moduleName}`);
|
|
});
|
|
|
|
document.querySelectorAll('.btn-outline-primary').forEach(btn => {
|
|
btn.classList.remove('btn-outline-primary');
|
|
btn.classList.add(`btn-outline-${moduleName}`);
|
|
});
|
|
}
|
|
});
|