Actualiser index.html
CI / PHP Syntax Check (push) Has been cancelled
CI / JavaScript Lint (push) Has been cancelled
CI / Docker Build Test (push) Has been cancelled
CI / Validate Translation Files (push) Has been cancelled
CI / Auto-merge develop → main (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled

This commit is contained in:
2026-06-17 16:52:13 +00:00
parent cabb8b28d4
commit 8d18362d83
+27 -16
View File
@@ -2013,51 +2013,57 @@
</body> </body>
<script> <script>
(function() { (function() {
console.log("=> Temporisateur de l'éditeur de produit activé (V2-Universelle)."); console.log("=> Temporisateur de l'éditeur de produit activé (V3-ID-Hunter).");
setInterval(() => { setInterval(() => {
// 1. On récupère absolument TOUS les boutons visibles de la page
const buttons = document.querySelectorAll('button, .btn, input[type="submit"]'); const buttons = document.querySelectorAll('button, .btn, input[type="submit"]');
buttons.forEach(btn => { buttons.forEach(btn => {
// On cible un bouton qui est affiché à l'écran ET qui n'est pas notre bouton bleu
if (btn.offsetWidth > 0 && btn.offsetHeight > 0 && !btn.classList.contains('btn-catalog-shortcut')) { if (btn.offsetWidth > 0 && btn.offsetHeight > 0 && !btn.classList.contains('btn-catalog-shortcut')) {
// EverShelf utilise généralement des classes comme btn-success, btn-primary, full-width ou mt-2 pour ses validations de modales
const classes = btn.className.toLowerCase(); const classes = btn.className.toLowerCase();
const text = btn.textContent.toLowerCase(); const text = btn.textContent.toLowerCase();
// Si le bouton contient une icône de disquette 💾 ou des mots-clés de validation/sauvegarde // On cible les boutons d'action de la modale (comme Modifier ou Recette) pour s'insérer à côté
if (classes.includes('success') || classes.includes('primary') || text.includes('salva') || text.includes('enregistrer') || text.includes('aggiungi') || text.includes('💾')) { if (text === 'modifier' || text.includes('modifier') || classes.includes('success') || text.includes('salva')) {
const container = btn.parentNode; const container = btn.parentNode;
// Si notre raccourci bleu n'est pas déjà injecté juste au-dessus
if (container && !container.querySelector('.btn-catalog-shortcut')) { if (container && !container.querySelector('.btn-catalog-shortcut')) {
const editBtn = document.createElement('button'); const editBtn = document.createElement('button');
editBtn.type = 'button'; editBtn.type = 'button';
editBtn.className = 'btn btn-large btn-catalog-shortcut'; editBtn.className = 'btn btn-large btn-catalog-shortcut';
editBtn.innerText = '✏️ Modifier la fiche produit (Catégorie)'; editBtn.innerText = '✏️ Modifier la fiche produit (Catégorie)';
// Style calqué sur l'application // Style bleu, parfaitement intégré à la ligne de boutons
editBtn.style.cssText = 'margin-bottom: 12px; background-color: #1976d2; color: white; width: 100%; border: none; border-radius: 8px; padding: 14px; font-size: 16px; font-weight: bold; cursor: pointer; display: block; text-align: center;'; editBtn.style.cssText = 'margin-bottom: 12px; background-color: #1976d2; color: white; width: 100%; border: none; border-radius: 8px; padding: 14px; font-size: 16px; font-weight: bold; cursor: pointer; display: block; text-align: center;';
// Action au clic
editBtn.onclick = function(e) { editBtn.onclick = function(e) {
e.preventDefault(); e.preventDefault();
let targetId = null; let targetId = null;
// 1. Scan massif des variables globales potentielles d'EverShelf
if (typeof currentProduct !== 'undefined' && currentProduct) targetId = currentProduct.id || currentProduct._id; if (typeof currentProduct !== 'undefined' && currentProduct) targetId = currentProduct.id || currentProduct._id;
if (typeof _currentProduct !== 'undefined' && _currentProduct) targetId = _currentProduct.id || _currentProduct._id; if (typeof _currentProduct !== 'undefined' && _currentProduct) targetId = _currentProduct.id || _currentProduct._id;
if (typeof currentItem !== 'undefined' && currentItem) targetId = currentItem.product_id || currentItem.productId; if (typeof currentItem !== 'undefined' && currentItem) targetId = currentItem.product_id || currentItem.productId || currentItem.id;
if (typeof currentInventoryItem !== 'undefined' && currentInventoryItem) targetId = currentInventoryItem.product_id || currentInventoryItem.productId || currentInventoryItem.product;
if (typeof selectedItem !== 'undefined' && selectedItem) targetId = selectedItem.product_id || selectedItem.productId || selectedId;
// 2. Plan B : Si l'ID est introuvable, on regarde si un attribut HTML sur la modale le contient
if (!targetId) {
const modal = btn.closest('.modal, .popup, [id*="modal"], [id*="popup"]');
if (modal) {
targetId = modal.getAttribute('data-product-id') || modal.getAttribute('data-id');
}
}
// 3. Si l'ID est enfin trouvé, on redirige en mode réconciliation
if (targetId) { if (targetId) {
// Fermer la modale actuelle
document.querySelectorAll('.page, .modal, .popup').forEach(el => { document.querySelectorAll('.page, .modal, .popup').forEach(el => {
el.classList.remove('active'); el.classList.remove('active');
el.style.display = 'none'; el.style.display = 'none';
}); });
// Ouvrir le catalogue sur le bon produit
if (typeof editProduct === 'function') { if (typeof editProduct === 'function') {
editProduct(targetId); editProduct(targetId);
} else { } else {
@@ -2068,13 +2074,18 @@
} }
} }
} else { } else {
alert("Raccourci : Impossible de lier l'identifiant du produit."); // Au pire du pire, si l'ID reste introuvable, on simule un clic sur le VRAI bouton "Modifier" vert d'EverShelf
// pour laisser l'application ouvrir sa propre page d'édition native !
if (typeof btn.click === 'function') {
btn.click();
} else {
alert("Raccourci : Impossible de lier l'identifiant du produit automatiquement.");
}
} }
}; };
// Insertion immédiate au-dessus du bouton vert détecté
container.insertBefore(editBtn, btn); container.insertBefore(editBtn, btn);
console.log("=> Bouton injecté avec succès au-dessus de :", btn.textContent.trim()); console.log("=> Raccourci injecté avec filet de sécurité.");
} }
} }
} }