fix: guard URL-based per attivare le feature solo sulle pagine target

Aggiunto helper getPageMode(iDoc) che legge il parametro "mode" dall'URL
senza toccare il DOM. Accordion badges ora si attiva solo su mode=edit_host
(guard in tryInitAccordionCounts, init e MutationObserver), evitando
operazioni inutili e potenziali errori in console sulle altre pagine.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Luigi D'Acunto 2026-06-16 17:43:33 +02:00
parent 09fcac4f48
commit 953cad326c

View file

@ -1,7 +1,7 @@
// ==UserScript== // ==UserScript==
// @name Checkmk SwissKnife // @name Checkmk SwissKnife
// @namespace https://luigidacunto.com/ // @namespace https://luigidacunto.com/
// @version 2.2 // @version 2.3
// @description Raccolta di miglioramenti all'interfaccia di Checkmk WATO. Ogni fix o enhancement viene aggiunto qui come feature indipendente. // @description Raccolta di miglioramenti all'interfaccia di Checkmk WATO. Ogni fix o enhancement viene aggiunto qui come feature indipendente.
// @author Luigi D'Acunto // @author Luigi D'Acunto
// @homepageURL https://git.luigidacunto.com/tools/checkmk-swissknife // @homepageURL https://git.luigidacunto.com/tools/checkmk-swissknife
@ -37,6 +37,12 @@
return null; return null;
} }
// Legge il parametro "mode" dall'URL del documento target senza accedere al DOM
function getPageMode(iDoc) {
try { return new URLSearchParams(iDoc.location.search).get('mode') || ''; }
catch (e) { return ''; }
}
// Inietta CSS nel documento target (una sola volta, deduplica per id) // Inietta CSS nel documento target (una sola volta, deduplica per id)
function injectStyles(iDoc, id, css) { function injectStyles(iDoc, id, css) {
if (iDoc.getElementById(id)) return; if (iDoc.getElementById(id)) return;
@ -551,18 +557,26 @@
if (++attemptsAcc < MAX_ATTEMPTS) setTimeout(tryInitAccordionCounts, POLL_INTERVAL_MS); if (++attemptsAcc < MAX_ATTEMPTS) setTimeout(tryInitAccordionCounts, POLL_INTERVAL_MS);
return; return;
} }
if (!iDoc.getElementById('form_edit_host')) return; // Guard URL: attiva solo sulla pagina edit_host
if (getPageMode(iDoc) !== 'edit_host') return;
if (!initAccordionCheckedCounts(iDoc)) { if (!initAccordionCheckedCounts(iDoc)) {
if (++attemptsAcc < MAX_ATTEMPTS) setTimeout(tryInitAccordionCounts, POLL_INTERVAL_MS); if (++attemptsAcc < MAX_ATTEMPTS) setTimeout(tryInitAccordionCounts, POLL_INTERVAL_MS);
} }
} }
function init() { function init() {
const iDoc = getWatoDoc(FOLDER_SELECT_ID);
const mode = getPageMode(iDoc);
attemptsFolder = 0; attemptsFolder = 0;
attemptsAcc = 0; attemptsAcc = 0;
// Folder select: si auto-ferma se non trova l'elemento, schedula sempre.
setTimeout(tryEnhanceFolderSelect, 800); setTimeout(tryEnhanceFolderSelect, 800);
// Accordion: solo su edit_host. Se mode è vuoto (iframe non ancora caricato)
// si schedula comunque: tryInitAccordionCounts farà il guard URL.
if (!mode || mode === 'edit_host') {
setTimeout(tryInitAccordionCounts, 800); setTimeout(tryInitAccordionCounts, 800);
} }
}
if (document.readyState === 'complete') { if (document.readyState === 'complete') {
init(); init();
@ -574,16 +588,19 @@
new MutationObserver(() => { new MutationObserver(() => {
const iDoc = getWatoDoc(FOLDER_SELECT_ID); const iDoc = getWatoDoc(FOLDER_SELECT_ID);
if (!iDoc) return; if (!iDoc) return;
const mode = getPageMode(iDoc);
const sel = iDoc.getElementById(FOLDER_SELECT_ID); const sel = iDoc.getElementById(FOLDER_SELECT_ID);
if (sel && sel.classList.contains('select2-hidden-accessible') && !sel.dataset.cmkEnhanced) { if (sel && sel.classList.contains('select2-hidden-accessible') && !sel.dataset.cmkEnhanced) {
attemptsFolder = 0; attemptsFolder = 0;
setTimeout(tryEnhanceFolderSelect, 300); setTimeout(tryEnhanceFolderSelect, 300);
} }
if (mode === 'edit_host') {
const form = iDoc.getElementById('form_edit_host'); const form = iDoc.getElementById('form_edit_host');
if (form && !form.dataset.cmkAccBadge) { if (form && !form.dataset.cmkAccBadge) {
attemptsAcc = 0; attemptsAcc = 0;
setTimeout(tryInitAccordionCounts, 300); setTimeout(tryInitAccordionCounts, 300);
} }
}
}).observe(document.body, { childList: true, subtree: true }); }).observe(document.body, { childList: true, subtree: true });
// Riavvia al caricamento dell'iframe (layout con sidebar) // Riavvia al caricamento dell'iframe (layout con sidebar)