\ No newline at end of file
From 6cd67144f9c6cc805350e1c0c234f3eea678042e Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Mon, 5 Jan 2026 22:34:06 +0100
Subject: [PATCH 56/84] Update info.json
---
plugin_info/info.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugin_info/info.json b/plugin_info/info.json
index cea69b69..f68d7c2d 100644
--- a/plugin_info/info.json
+++ b/plugin_info/info.json
@@ -1,7 +1,7 @@
{
"id": "Monitoring",
"name": "Monitoring",
- "pluginVersion": "3.4.1",
+ "pluginVersion": "3.4.2",
"description": {
"fr_FR": "Plugin permettant le monitoring des équipements locaux et distants (via SSH). Le plugin affichera les informations systèmes d'équipements sous Linux ou Synology (Distribution, CPU, Mémoire, Disques, Swap).",
"en_US": "Plugin to monitor local and remote equipments (through SSH). The plugin will display system informations from Linux or Synology (Distribution, CPU, Memory, Disks, Swap).",
From 32de8bc2b3796509127ae1b042b3d2a5a8ba30f4 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Mon, 5 Jan 2026 22:47:55 +0100
Subject: [PATCH 57/84] update templates
---
core/template/dashboard/AsusWRT.html | 31 +++++++++------
core/template/dashboard/Monitoring.html | 51 +++++++++++++++----------
2 files changed, 51 insertions(+), 31 deletions(-)
diff --git a/core/template/dashboard/AsusWRT.html b/core/template/dashboard/AsusWRT.html
index 331847a0..5c9d25a4 100644
--- a/core/template/dashboard/AsusWRT.html
+++ b/core/template/dashboard/AsusWRT.html
@@ -1,4 +1,7 @@
-
\ No newline at end of file
From 7f443beb7f7c7270d0c8fc9d1fcba7f8228e62cb Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 09:38:14 +0100
Subject: [PATCH 70/84] Update mobile templates
---
core/template/mobile/AsusWRT.html | 953 ++++++++++++++------------
core/template/mobile/Monitoring.html | 954 +++++++++++++--------------
core/template/mobile/Synology.html | 687 +++++++++++++++++++
3 files changed, 1664 insertions(+), 930 deletions(-)
create mode 100644 core/template/mobile/Synology.html
diff --git a/core/template/mobile/AsusWRT.html b/core/template/mobile/AsusWRT.html
index 1a89e011..7c87de37 100644
--- a/core/template/mobile/AsusWRT.html
+++ b/core/template/mobile/AsusWRT.html
@@ -1,4 +1,6 @@
-
+
\ No newline at end of file
From 21318566c1b40483d72d4c41b8324f1a9d23db79 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 10:01:10 +0100
Subject: [PATCH 71/84] update templates
---
core/template/dashboard/AsusWRT.html | 30 ++++++++++++++----------
core/template/dashboard/Monitoring.html | 26 +++++++++++----------
core/template/dashboard/Synology.html | 31 +++++++++++++------------
core/template/mobile/AsusWRT.html | 28 +++++++++++-----------
core/template/mobile/Monitoring.html | 28 +++++++++++-----------
core/template/mobile/Synology.html | 12 +++++-----
6 files changed, 82 insertions(+), 73 deletions(-)
diff --git a/core/template/dashboard/AsusWRT.html b/core/template/dashboard/AsusWRT.html
index da435c5c..39ad65ab 100644
--- a/core/template/dashboard/AsusWRT.html
+++ b/core/template/dashboard/AsusWRT.html
@@ -433,7 +433,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const uptimeEl = widgetRoot.querySelector('#uptime#id#')
- if (uptimeEl) uptimeEl.innerHTML = '
#uptime#'
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initUptime:', e)
}
@@ -447,7 +448,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
- if (networkInfosEl) networkInfosEl.innerHTML = '
#network_infos#'
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initNetworkInfos:', e)
}
@@ -461,7 +463,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkEl = widgetRoot.querySelector('#network#id#')
- if (networkEl) networkEl.innerHTML = '
#network#'
+ if (!networkEl) return
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initNetwork:', e)
}
@@ -475,7 +478,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const el = widgetRoot.querySelector('#asus_clients#id#')
- if (el) el.innerHTML = '
#asus_clients#'
+ if (!el) return
+ el.innerHTML = '
#asus_clients#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initAsusClients:', e)
}
@@ -489,7 +493,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const el = widgetRoot.querySelector('#asus_wan0_ip#id#')
- if (el) el.innerHTML = '
IP (WAN) : #asus_wan0_ip#'
+ if (!el) return
+ el.innerHTML = '
IP (WAN) : #asus_wan0_ip#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initAsusWan0IP:', e)
}
@@ -503,7 +508,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const el = widgetRoot.querySelector('#asus_wifi_temp#id#')
- if (el) el.innerHTML = '
#asus_wifi_temp#'
+ if (!el) return
+ el.innerHTML = '
#asus_wifi_temp#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initAsusWifiTemp:', e)
}
@@ -523,37 +529,37 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html = buildThresholdHTML(
+ const html1mn = buildThresholdHTML(
'#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#',
'Charge Système (1min)', '#load_avg_1mn_id#',
{ min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' },
'#load_avg_1mn_tendance#'
)
- loadAvg1mn.innerHTML = html === '
' ? html : `1 min : ${html}`
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
}
// Load avg 5mn
const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
if (loadAvg5mn) {
- const html = buildThresholdHTML(
+ const html5mn = buildThresholdHTML(
'#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#',
'Charge Système (5min)', '#load_avg_5mn_id#',
{ min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' },
'#load_avg_5mn_tendance#'
)
- loadAvg5mn.innerHTML = html === '
' ? html : ` - 5 min : ${html}`
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
}
// Load avg 15mn
const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
if (loadAvg15mn) {
- const html = buildThresholdHTML(
+ const html15mn = buildThresholdHTML(
'#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#',
'Charge Système (15min)', '#load_avg_15mn_id#',
{ min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' },
'#load_avg_15mn_tendance#'
)
- loadAvg15mn.innerHTML = html === '
' ? html : ` - 15 min : ${html}`
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initLoadAverage:', e)
diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html
index ecc06866..94ccc2d7 100644
--- a/core/template/dashboard/Monitoring.html
+++ b/core/template/dashboard/Monitoring.html
@@ -430,7 +430,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const uptimeEl = widgetRoot.querySelector('#uptime#id#')
- if (uptimeEl) uptimeEl.innerHTML = '
#uptime#'
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring] Error in initUptime:', e)
}
@@ -444,7 +445,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
- if (networkInfosEl) networkInfosEl.innerHTML = '
#network_infos#'
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring] Error in initNetworkInfos:', e)
}
@@ -458,10 +460,10 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkEl = widgetRoot.querySelector('#network#id#')
- if (networkEl) {
- const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' }
- networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false)
- }
+ if (!networkEl) return
+
+ const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' }
+ networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false)
} catch (e) {
console.error('[Monitoring] Error in initNetwork:', e)
}
@@ -481,37 +483,37 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html = buildThresholdHTML(
+ const html1mn = buildThresholdHTML(
'#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#',
'Charge Système (1min)', '#load_avg_1mn_id#',
{ min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' },
'#load_avg_1mn_tendance#'
)
- loadAvg1mn.innerHTML = html === '
' ? html : `1 min : ${html}`
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
}
// Load avg 5mn
const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
if (loadAvg5mn) {
- const html = buildThresholdHTML(
+ const html5mn = buildThresholdHTML(
'#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#',
'Charge Système (5min)', '#load_avg_5mn_id#',
{ min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' },
'#load_avg_5mn_tendance#'
)
- loadAvg5mn.innerHTML = html === '
' ? html : ` - 5 min : ${html}`
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
}
// Load avg 15mn
const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
if (loadAvg15mn) {
- const html = buildThresholdHTML(
+ const html15mn = buildThresholdHTML(
'#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#',
'Charge Système (15min)', '#load_avg_15mn_id#',
{ min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' },
'#load_avg_15mn_tendance#'
)
- loadAvg15mn.innerHTML = html === '
' ? html : ` - 15 min : ${html}`
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring] Error in initLoadAverage:', e)
diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html
index 43a3c70a..739936f6 100644
--- a/core/template/dashboard/Synology.html
+++ b/core/template/dashboard/Synology.html
@@ -491,7 +491,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const uptimeEl = widgetRoot.querySelector('#uptime#id#')
- if (uptimeEl) uptimeEl.innerHTML = '
#uptime#'
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring] Error in initUptime:', e)
}
@@ -505,7 +506,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
- if (networkInfosEl) networkInfosEl.innerHTML = '
#network_infos#'
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring] Error in initNetworkInfos:', e)
}
@@ -519,10 +521,10 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkEl = widgetRoot.querySelector('#network#id#')
- if (networkEl) {
- const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' }
- networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false)
- }
+ if (!networkEl) return
+
+ const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' }
+ networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false)
} catch (e) {
console.error('[Monitoring] Error in initNetwork:', e)
}
@@ -542,37 +544,37 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html = buildThresholdHTML(
+ const html1mn = buildThresholdHTML(
'#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#',
'Charge Système (1min)', '#load_avg_1mn_id#',
{ min: '#load_avg_1mn_minHistory#', avg: '#load_avg_1mn_averageHistory#', max: '#load_avg_1mn_maxHistory#' },
'#load_avg_1mn_tendance#'
)
- loadAvg1mn.innerHTML = html === '
' ? html : `1 min : ${html}`
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
}
// Load avg 5mn
const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
if (loadAvg5mn) {
- const html = buildThresholdHTML(
+ const html5mn = buildThresholdHTML(
'#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#',
'Charge Système (5min)', '#load_avg_5mn_id#',
{ min: '#load_avg_5mn_minHistory#', avg: '#load_avg_5mn_averageHistory#', max: '#load_avg_5mn_maxHistory#' },
'#load_avg_5mn_tendance#'
)
- loadAvg5mn.innerHTML = html === '
' ? html : ` - 5 min : ${html}`
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
}
// Load avg 15mn
const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
if (loadAvg15mn) {
- const html = buildThresholdHTML(
+ const html15mn = buildThresholdHTML(
'#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#',
'Charge Système (15min)', '#load_avg_15mn_id#',
{ min: '#load_avg_15mn_minHistory#', avg: '#load_avg_15mn_averageHistory#', max: '#load_avg_15mn_maxHistory#' },
'#load_avg_15mn_tendance#'
)
- loadAvg15mn.innerHTML = html === '
' ? html : ` - 15 min : ${html}`
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring] Error in initLoadAverage:', e)
@@ -697,9 +699,8 @@
// Ajouter le pourcentage dans le deuxième span
const percentSpan = volumeEl.querySelector('.syno-percent')
- if (percentSpan) {
- percentSpan.innerHTML = percentageHTML
- }
+ if (!percentSpan) return
+ percentSpan.innerHTML = percentageHTML
} catch (e) {
console.error('[Monitoring] Error in initSynoVolume for', volumeEl.dataset?.synoId || 'unknown', ':', e)
}
diff --git a/core/template/mobile/AsusWRT.html b/core/template/mobile/AsusWRT.html
index 7c87de37..ce4b47a0 100644
--- a/core/template/mobile/AsusWRT.html
+++ b/core/template/mobile/AsusWRT.html
@@ -473,22 +473,22 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
- loadAvg1mn.innerHTML = html
- }
+ const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
+ }
- // Load avg 5mn
- const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
- if (loadAvg5mn) {
- const html = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
- loadAvg5mn.innerHTML = html
- }
+ // Load avg 5mn
+ const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
+ if (loadAvg5mn) {
+ const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
+ }
- // Load avg 15mn
- const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
- if (loadAvg15mn) {
- const html = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
- loadAvg15mn.innerHTML = html
+ // Load avg 15mn
+ const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
+ if (loadAvg15mn) {
+ const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initLoadAverage:', e)
diff --git a/core/template/mobile/Monitoring.html b/core/template/mobile/Monitoring.html
index 0787ed63..2fd2b786 100644
--- a/core/template/mobile/Monitoring.html
+++ b/core/template/mobile/Monitoring.html
@@ -416,22 +416,22 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
- loadAvg1mn.innerHTML = html
- }
+ const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
+ }
- // Load avg 5mn
- const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
- if (loadAvg5mn) {
- const html = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
- loadAvg5mn.innerHTML = html
- }
+ // Load avg 5mn
+ const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
+ if (loadAvg5mn) {
+ const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
+ }
- // Load avg 15mn
- const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
- if (loadAvg15mn) {
- const html = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
- loadAvg15mn.innerHTML = html
+ // Load avg 15mn
+ const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
+ if (loadAvg15mn) {
+ const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring] Error in initLoadAverage:', e)
diff --git a/core/template/mobile/Synology.html b/core/template/mobile/Synology.html
index d655db08..32cbc321 100644
--- a/core/template/mobile/Synology.html
+++ b/core/template/mobile/Synology.html
@@ -458,22 +458,22 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
- loadAvg1mn.innerHTML = html
+ const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
}
// Load avg 5mn
const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
if (loadAvg5mn) {
- const html = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
- loadAvg5mn.innerHTML = html
+ const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
}
// Load avg 15mn
const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
if (loadAvg15mn) {
- const html = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
- loadAvg15mn.innerHTML = html
+ const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring Syno] Error in initLoadAverage:', e)
From d2ddcfa2e43ec21ea267498e69da29936a72b01f Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 10:08:44 +0100
Subject: [PATCH 72/84] update templates
---
core/template/dashboard/Monitoring.html | 5 ++---
core/template/dashboard/Synology.html | 3 +--
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html
index 94ccc2d7..e25a0c04 100644
--- a/core/template/dashboard/Monitoring.html
+++ b/core/template/dashboard/Monitoring.html
@@ -460,10 +460,9 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkEl = widgetRoot.querySelector('#network#id#')
- if (!networkEl) return
+ if (!networkEl) return
- const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' }
- networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false)
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring] Error in initNetwork:', e)
}
diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html
index 739936f6..a38cf0f7 100644
--- a/core/template/dashboard/Synology.html
+++ b/core/template/dashboard/Synology.html
@@ -523,8 +523,7 @@
const networkEl = widgetRoot.querySelector('#network#id#')
if (!networkEl) return
- const history = { min: '#network_minHistory#', avg: '#network_averageHistory#', max: '#network_maxHistory#' }
- networkEl.innerHTML = buildThresholdHTML('#network#', '#network_colorlow#', '#network_colorhigh#', 'Vitesse du réseau', '#network_id#', history, '#network_tendance#', false)
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring] Error in initNetwork:', e)
}
From 9df2979d04edbd546388063223de839f8af3f521 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 12:16:52 +0100
Subject: [PATCH 73/84] Update Monitoring.class.php
---
core/class/Monitoring.class.php | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/core/class/Monitoring.class.php b/core/class/Monitoring.class.php
index ddd10f75..8d86f89b 100644
--- a/core/class/Monitoring.class.php
+++ b/core/class/Monitoring.class.php
@@ -241,12 +241,14 @@ public static function pullCustom($_options) {
$mem_stats = config::byKey('configStatsMemCustom', 'Monitoring', '0') == '1' ? true : false;
if ($mem_stats) {
$mem_start_usage = memory_get_usage();
- log::add('Monitoring', 'info', '[PULLCUSTOM] Memory Usage Start :: ' . round($mem_start_usage / 1024, 2) . ' Ko');
}
/** @var Monitoring $Monitoring */
$Monitoring = Monitoring::byId($_options['Monitoring_Id']);
if (is_object($Monitoring)) {
+ if ($mem_stats) {
+ log::add('Monitoring', 'info', '[' . $Monitoring->getName() .'][PULLCUSTOM] Memory Usage Start :: ' . round($mem_start_usage / 1024, 2) . ' Ko');
+ }
$cronState = $Monitoring->getCmd(null, 'cron_status');
if (is_object($cronState) && $cronState->execCmd() === 0) {
log::add('Monitoring', 'debug', '[' . $Monitoring->getName() .'][PULLCUSTOM] Pull (Custom) :: En Pause');
@@ -270,10 +272,10 @@ public static function pullCustom($_options) {
}
$Monitoring->refreshWidget();
}
- }
- if ($mem_stats) {
- $mem_end_usage = memory_get_usage();
- log::add('Monitoring', 'info', '[PULLCUSTOM] Memory Usage End :: ' . round($mem_end_usage / 1024, 2) . ' Ko | Conso :: ' . round(($mem_end_usage - $mem_start_usage) / 1024, 2) . ' Ko');
+ if ($mem_stats) {
+ $mem_end_usage = memory_get_usage();
+ log::add('Monitoring', 'info', '[' . $Monitoring->getName() .'][PULLCUSTOM] Memory Usage End :: ' . round($mem_end_usage / 1024, 2) . ' Ko | Conso :: ' . round(($mem_end_usage - $mem_start_usage) / 1024, 2) . ' Ko');
+ }
}
}
From fa63fecd6a9676bbe19ebe3a81a3bf78cae3ab27 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 12:37:26 +0100
Subject: [PATCH 74/84] Update Monitoring class
---
core/class/Monitoring.class.php | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/core/class/Monitoring.class.php b/core/class/Monitoring.class.php
index 8d86f89b..9909f35e 100644
--- a/core/class/Monitoring.class.php
+++ b/core/class/Monitoring.class.php
@@ -279,13 +279,13 @@ public static function pullCustom($_options) {
}
}
- public static function postConfig_configPullLocal($value) {
- log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration PullLocal :: '. $value);
- }
-
+ public static function postConfig_configPullLocal($value) {
+ log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration PullLocal :: ' . $value);
+ }
+
public static function postConfig_configPull($value) {
- log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration Pull :: '. $value);
- }
+ log::add('Monitoring', 'debug', '[CONFIG-SAVE] Configuration Pull :: ' . $value);
+ }
// Fonction exécutée automatiquement avant la suppression de l'équipement
public function preRemove() {
@@ -2118,10 +2118,10 @@ public function postSave() {
$cron->save();
} else {
$cron = cron::byClassAndFunction('Monitoring', 'pullCustom', array('Monitoring_Id' => intval($this->getId())));
- if (is_object($cron)) {
- log::add('Monitoring', 'debug', '['. $this->getName() .'][POSTSAVE] Remove CustomPull');
- $cron->remove();
- }
+ if (is_object($cron)) {
+ log::add('Monitoring', 'debug', '[' . $this->getName() . '][POSTSAVE] Remove CustomPull');
+ $cron->remove();
+ }
}
$this->getInformations();
From 8e4b044e1eb0324540ccf08ce190766b98fda6c6 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 12:37:36 +0100
Subject: [PATCH 75/84] Update templates
---
core/template/dashboard/Monitoring.html | 10 +++---
core/template/mobile/Monitoring.html | 42 ++++++++++++-------------
2 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/core/template/dashboard/Monitoring.html b/core/template/dashboard/Monitoring.html
index e25a0c04..0a974be4 100644
--- a/core/template/dashboard/Monitoring.html
+++ b/core/template/dashboard/Monitoring.html
@@ -430,8 +430,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const uptimeEl = widgetRoot.querySelector('#uptime#id#')
- if (!uptimeEl) return
- uptimeEl.innerHTML = '
#uptime#'
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring] Error in initUptime:', e)
}
@@ -445,8 +445,8 @@
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
- if (!networkInfosEl) return
- networkInfosEl.innerHTML = '
#network_infos#'
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring] Error in initNetworkInfos:', e)
}
@@ -462,7 +462,7 @@
const networkEl = widgetRoot.querySelector('#network#id#')
if (!networkEl) return
- networkEl.innerHTML = '
#network#'
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring] Error in initNetwork:', e)
}
diff --git a/core/template/mobile/Monitoring.html b/core/template/mobile/Monitoring.html
index 2fd2b786..ef70d3b4 100644
--- a/core/template/mobile/Monitoring.html
+++ b/core/template/mobile/Monitoring.html
@@ -259,13 +259,13 @@
*/
const initIconSSH = () => {
try {
- const el = widgetRoot.querySelector('#iconSSH#id#')
- if (!el) return
+ const iconSSH = widgetRoot.querySelector('#iconSSH#id#')
+ if (!iconSSH) return
if ('#cnx_ssh#' === 'OK') {
- el.innerHTML = '
'
+ iconSSH.innerHTML = '
'
} else if ('#cnx_ssh#' === 'KO') {
- el.innerHTML = '
'
+ iconSSH.innerHTML = '
'
}
} catch (e) {
console.error('[Monitoring] Error in initIconSSH:', e)
@@ -277,8 +277,8 @@
*/
const initIconCron = () => {
try {
- const el = widgetRoot.querySelector('#iconCron#id#')
- if (!el) return
+ const iconCron = widgetRoot.querySelector('#iconCron#id#')
+ if (!iconCron) return
const isOn = '#cron_status#' === '1'
const isCustom = '#cron_status_custom#' === '1'
@@ -289,7 +289,7 @@
const customLabel = isCustom ? ' (Custom)' : ' (Default)'
const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color')
- el.innerHTML = '
'
+ iconCron.innerHTML = '
'
} catch (e) {
console.error('[Monitoring] Error in initIconCron:', e)
}
@@ -416,22 +416,22 @@
// Load avg 1mn
const loadAvg1mn = widgetRoot.querySelector('#load_avg_1mn#id#')
if (loadAvg1mn) {
- const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
- loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
- }
+ const html1mn = buildThresholdHTML('#load_avg_1mn#', '#load_avg_1mn_colorlow#', '#load_avg_1mn_colorhigh#', '1 min : ')
+ loadAvg1mn.innerHTML = html1mn === '
' ? html1mn : `1 min : ${html1mn}`
+ }
- // Load avg 5mn
- const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
- if (loadAvg5mn) {
- const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
- loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
- }
+ // Load avg 5mn
+ const loadAvg5mn = widgetRoot.querySelector('#load_avg_5mn#id#')
+ if (loadAvg5mn) {
+ const html5mn = buildThresholdHTML('#load_avg_5mn#', '#load_avg_5mn_colorlow#', '#load_avg_5mn_colorhigh#', ' - 5 min : ')
+ loadAvg5mn.innerHTML = html5mn === '
' ? html5mn : ` - 5 min : ${html5mn}`
+ }
- // Load avg 15mn
- const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
- if (loadAvg15mn) {
- const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
- loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
+ // Load avg 15mn
+ const loadAvg15mn = widgetRoot.querySelector('#load_avg_15mn#id#')
+ if (loadAvg15mn) {
+ const html15mn = buildThresholdHTML('#load_avg_15mn#', '#load_avg_15mn_colorlow#', '#load_avg_15mn_colorhigh#', ' - 15 min : ')
+ loadAvg15mn.innerHTML = html15mn === '
' ? html15mn : ` - 15 min : ${html15mn}`
}
} catch (e) {
console.error('[Monitoring] Error in initLoadAverage:', e)
From afb4366442600ba65c095d26d31341d96e335fe6 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 12:54:45 +0100
Subject: [PATCH 76/84] Update templates
---
core/template/mobile/AsusWRT.html | 106 +++++++++++++--------------
core/template/mobile/Monitoring.html | 72 +++++++++---------
core/template/mobile/Synology.html | 92 +++++++++++------------
3 files changed, 135 insertions(+), 135 deletions(-)
diff --git a/core/template/mobile/AsusWRT.html b/core/template/mobile/AsusWRT.html
index ce4b47a0..4c3b425c 100644
--- a/core/template/mobile/AsusWRT.html
+++ b/core/template/mobile/AsusWRT.html
@@ -271,13 +271,13 @@
*/
const initIconSSH = () => {
try {
- const el = widgetRoot.querySelector('#iconSSH#id#')
- if (!el) return
+ const iconSSH = widgetRoot.querySelector('#iconSSH#id#')
+ if (!iconSSH) return
if ('#cnx_ssh#' === 'OK') {
- el.innerHTML = '
'
+ iconSSH.innerHTML = '
'
} else if ('#cnx_ssh#' === 'KO') {
- el.innerHTML = '
'
+ iconSSH.innerHTML = '
'
}
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initIconSSH:', e)
@@ -289,8 +289,8 @@
*/
const initIconCron = () => {
try {
- const el = widgetRoot.querySelector('#iconCron#id#')
- if (!el) return
+ const iconCron = widgetRoot.querySelector('#iconCron#id#')
+ if (!iconCron) return
const isOn = '#cron_status#' === '1'
const isCustom = '#cron_status_custom#' === '1'
@@ -301,7 +301,7 @@
const customLabel = isCustom ? ' (Custom)' : ' (Default)'
const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color')
- el.innerHTML = '
'
+ iconCron.innerHTML = '
'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initIconCron:', e)
}
@@ -312,13 +312,13 @@
*/
const initIconCheckFirmware = () => {
try {
- const el = widgetRoot.querySelector('#iconCheckFirmware#id#')
- if (!el) return
+ const iconCheckFirmware = widgetRoot.querySelector('#iconCheckFirmware#id#')
+ if (!iconCheckFirmware) return
if ('#asus_fw_check#' === '1') {
- el.innerHTML = '
'
+ iconCheckFirmware.innerHTML = '
'
} else if ('#asus_fw_check#' === '0') {
- el.innerHTML = '
'
+ iconCheckFirmware.innerHTML = '
'
}
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initIconCheckFirmware:', e)
@@ -334,10 +334,10 @@
*/
const initRebootButton = () => {
try {
- const btn = widgetRoot.querySelector('.reboot')
- if (!btn) return
+ const rebootBtn = widgetRoot.querySelector('.reboot')
+ if (!rebootBtn) return
- btn.addEventListener('click', () => {
+ rebootBtn.addEventListener('click', () => {
if (confirm("Etes-vous sûr de vouloir redémarrer l'équipement #name# ?")) {
jeedom.cmd.execute({ id: '#cmd_reboot_id#' })
}
@@ -352,13 +352,13 @@
*/
const initRefreshButton = () => {
try {
- const btn = widgetRoot.querySelector('.eqLogic[data-eqLogic_uid="#uid#"] .refresh')
- if (!btn) return
+ const refreshBtn = widgetRoot.querySelector('.eqLogic[data-eqLogic_uid="#uid#"] .refresh')
+ if (!refreshBtn) return
if ('#refresh_id#' !== '') {
- btn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' }))
+ refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' }))
} else {
- btn.remove()
+ refreshBtn.remove()
}
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initRefreshButton:', e)
@@ -376,9 +376,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#uptime#id#')
- if (!el) return
- el.innerHTML = '
#uptime#'
+ const uptimeEl = widgetRoot.querySelector('#uptime#id#')
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initUptime:', e)
}
@@ -391,9 +391,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#network_infos#id#')
- if (!el) return
- el.innerHTML = '
#network_infos#'
+ const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initNetworkInfos:', e)
}
@@ -406,9 +406,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#network#id#')
- if (!el) return
- el.innerHTML = '
#network#'
+ const networkEl = widgetRoot.querySelector('#network#id#')
+ if (!networkEl) return
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initNetwork:', e)
}
@@ -421,9 +421,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#asus_clients#id#')
- if (!el) return
- el.innerHTML = '
#asus_clients#'
+ const asusClientsEl = widgetRoot.querySelector('#asus_clients#id#')
+ if (!asusClientsEl) return
+ asusClientsEl.innerHTML = '
#asus_clients#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initAsusClients:', e)
}
@@ -436,9 +436,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#asus_wan0_ip#id#')
- if (!el) return
- el.innerHTML = '
#asus_wan0_ip#'
+ const asusWanIpEl = widgetRoot.querySelector('#asus_wan0_ip#id#')
+ if (!asusWanIpEl) return
+ asusWanIpEl.innerHTML = '
#asus_wan0_ip#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initAsusWanIP:', e)
}
@@ -451,9 +451,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#asus_wifi_temp#id#')
- if (!el) return
- el.innerHTML = '
#asus_wifi_temp#'
+ const asusWiFiTempEl = widgetRoot.querySelector('#asus_wifi_temp#id#')
+ if (!asusWiFiTempEl) return
+ asusWiFiTempEl.innerHTML = '
#asus_wifi_temp#'
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initAsusWiFiTemp:', e)
}
@@ -502,16 +502,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#memory_available_percent#id#')
- if (!el) return
+ const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#')
+ if (!memoryEl) return
const value = '#memory_available_percent#'
if (value === '') {
- el.innerHTML = '
#memory#'
+ memoryEl.innerHTML = '
#memory#'
return
}
- el.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true)
+ memoryEl.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true)
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initMemory:', e)
}
@@ -524,16 +524,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#swap_free_percent#id#')
- if (!el) return
+ const swapEl = widgetRoot.querySelector('#swap_free_percent#id#')
+ if (!swapEl) return
const value = '#swap_free_percent#'
if (value === '') {
- el.innerHTML = '
#swap#'
+ swapEl.innerHTML = '
#swap#'
return
}
- el.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true)
+ swapEl.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true)
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initSwap:', e)
}
@@ -546,16 +546,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#hdd#id#')
- if (!el) return
+ const hddEl = widgetRoot.querySelector('#hdd#id#')
+ if (!hddEl) return
const value = '#hdd_free_percent#'
if (value === '') {
- el.innerHTML = '
'
+ hddEl.innerHTML = '
'
return
}
- el.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true)
+ hddEl.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true)
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initHDD:', e)
}
@@ -600,12 +600,12 @@
const dataset = container.dataset
const persoId = dataset.persoId
- const el = widgetRoot.querySelector('#' + persoId + '_unite#id#')
- if (!el) return
+ const persoEl = widgetRoot.querySelector('#' + persoId + '_unite#id#')
+ if (!persoEl) return
const value = dataset.persoValue
if (value === '') {
- el.innerHTML = '
'
+ persoEl.innerHTML = '
'
return
}
@@ -615,9 +615,9 @@
const color = getColorStyle(val, low, high, false)
if (color) {
- el.innerHTML = '
' + value + '' + dataset.persoUnite + ''
+ persoEl.innerHTML = '
' + value + '' + dataset.persoUnite + ''
} else {
- el.innerHTML = '
' + value + '' + dataset.persoUnite + ''
+ persoEl.innerHTML = '
' + value + '' + dataset.persoUnite + ''
}
} catch (e) {
console.error('[Monitoring AsusWRT] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e)
diff --git a/core/template/mobile/Monitoring.html b/core/template/mobile/Monitoring.html
index ef70d3b4..9880a585 100644
--- a/core/template/mobile/Monitoring.html
+++ b/core/template/mobile/Monitoring.html
@@ -304,10 +304,10 @@
*/
const initRebootButton = () => {
try {
- const btn = widgetRoot.querySelector('.reboot')
- if (!btn) return
+ const rebootBtn = widgetRoot.querySelector('.reboot')
+ if (!rebootBtn) return
- btn.addEventListener('click', () => {
+ rebootBtn.addEventListener('click', () => {
if (confirm("Etes-vous sûr de vouloir redémarrer l'équipement #name# ?")) {
jeedom.cmd.execute({ id: '#cmd_reboot_id#' })
}
@@ -322,10 +322,10 @@
*/
const initPoweroffButton = () => {
try {
- const btn = widgetRoot.querySelector('.poweroff')
- if (!btn) return
+ const poweroffBtn = widgetRoot.querySelector('.poweroff')
+ if (!poweroffBtn) return
- btn.addEventListener('click', () => {
+ poweroffBtn.addEventListener('click', () => {
if (confirm("Etes-vous sûr de vouloir éteindre l'équipement #name# ?")) {
jeedom.cmd.execute({ id: '#cmd_poweroff_id#' })
}
@@ -340,13 +340,13 @@
*/
const initRefreshButton = () => {
try {
- const btn = widgetRoot.querySelector('.refresh')
- if (!btn) return
+ const refreshBtn = widgetRoot.querySelector('.refresh')
+ if (!refreshBtn) return
if ('#refresh_id#' !== '') {
- btn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' }))
+ refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' }))
} else {
- btn.remove()
+ refreshBtn.remove()
}
} catch (e) {
console.error('[Monitoring] Error in initRefreshButton:', e)
@@ -364,9 +364,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#uptime#id#')
- if (!el) return
- el.innerHTML = '
#uptime#'
+ const uptimeEl = widgetRoot.querySelector('#uptime#id#')
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring] Error in initUptime:', e)
}
@@ -379,9 +379,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#network_infos#id#')
- if (!el) return
- el.innerHTML = '
#network_infos#'
+ const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring] Error in initNetworkInfos:', e)
}
@@ -394,9 +394,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#network#id#')
- if (!el) return
- el.innerHTML = '
#network#'
+ const networkEl = widgetRoot.querySelector('#network#id#')
+ if (!networkEl) return
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring] Error in initNetwork:', e)
}
@@ -445,16 +445,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#memory_available_percent#id#')
- if (!el) return
+ const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#')
+ if (!memoryEl) return
const value = '#memory_available_percent#'
if (value === '') {
- el.innerHTML = '
#memory#'
+ memoryEl.innerHTML = '
#memory#'
return
}
- el.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true)
+ memoryEl.innerHTML = buildPercentageHTML(value, '#memory_available_percent_colorlow#', '#memory_available_percent_colorhigh#', '#memory# (', '%', true)
} catch (e) {
console.error('[Monitoring] Error in initMemory:', e)
}
@@ -467,16 +467,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#swap_free_percent#id#')
- if (!el) return
+ const swapEl = widgetRoot.querySelector('#swap_free_percent#id#')
+ if (!swapEl) return
const value = '#swap_free_percent#'
if (value === '') {
- el.innerHTML = '
#swap#'
+ swapEl.innerHTML = '
#swap#'
return
}
- el.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true)
+ swapEl.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true)
} catch (e) {
console.error('[Monitoring] Error in initSwap:', e)
}
@@ -489,16 +489,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#hdd#id#')
- if (!el) return
+ const hddEl = widgetRoot.querySelector('#hdd#id#')
+ if (!hddEl) return
const value = '#hdd_free_percent#'
if (value === '') {
- el.innerHTML = '
'
+ hddEl.innerHTML = '
'
return
}
- el.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true)
+ hddEl.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true)
} catch (e) {
console.error('[Monitoring] Error in initHDD:', e)
}
@@ -543,12 +543,12 @@
const dataset = container.dataset
const persoId = dataset.persoId
- const el = widgetRoot.querySelector('#' + persoId + '_unite#id#')
- if (!el) return
+ const persoEl = widgetRoot.querySelector('#' + persoId + '_unite#id#')
+ if (!persoEl) return
const value = dataset.persoValue
if (value === '') {
- el.innerHTML = '
'
+ persoEl.innerHTML = '
'
return
}
@@ -558,9 +558,9 @@
const color = getColorStyle(val, low, high, false)
if (color) {
- el.innerHTML = '
' + value + '' + dataset.persoUnite + ''
+ persoEl.innerHTML = '
' + value + '' + dataset.persoUnite + ''
} else {
- el.innerHTML = '
' + value + '' + dataset.persoUnite + ''
+ persoEl.innerHTML = '
' + value + '' + dataset.persoUnite + ''
}
} catch (e) {
console.error('[Monitoring] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e)
diff --git a/core/template/mobile/Synology.html b/core/template/mobile/Synology.html
index 32cbc321..53f76b98 100644
--- a/core/template/mobile/Synology.html
+++ b/core/template/mobile/Synology.html
@@ -301,13 +301,13 @@
*/
const initIconSSH = () => {
try {
- const el = widgetRoot.querySelector('#iconSSH#id#')
- if (!el) return
+ const iconSSH = widgetRoot.querySelector('#iconSSH#id#')
+ if (!iconSSH) return
if ('#cnx_ssh#' === 'OK') {
- el.innerHTML = '
'
+ iconSSH.innerHTML = '
'
} else if ('#cnx_ssh#' === 'KO') {
- el.innerHTML = '
'
+ iconSSH.innerHTML = '
'
}
} catch (e) {
console.error('[Monitoring Syno] Error in initIconSSH:', e)
@@ -319,8 +319,8 @@
*/
const initIconCron = () => {
try {
- const el = widgetRoot.querySelector('#iconCron#id#')
- if (!el) return
+ const iconCron = widgetRoot.querySelector('#iconCron#id#')
+ if (!iconCron) return
const isOn = '#cron_status#' === '1'
const isCustom = '#cron_status_custom#' === '1'
@@ -331,7 +331,7 @@
const customLabel = isCustom ? ' (Custom)' : ' (Default)'
const color = isCustom ? '--al-warning-color' : (isOn ? '--al-success-color' : '--al-danger-color')
- el.innerHTML = '
'
+ iconCron.innerHTML = '
'
} catch (e) {
console.error('[Monitoring Syno] Error in initIconCron:', e)
}
@@ -346,10 +346,10 @@
*/
const initRebootButton = () => {
try {
- const btn = widgetRoot.querySelector('.reboot')
- if (!btn) return
+ const rebootBtn = widgetRoot.querySelector('.reboot')
+ if (!rebootBtn) return
- btn.addEventListener('click', () => {
+ rebootBtn.addEventListener('click', () => {
if (confirm("Etes-vous sûr de vouloir redémarrer l'équipement #name# ?")) {
jeedom.cmd.execute({ id: '#cmd_reboot_id#' })
}
@@ -364,10 +364,10 @@
*/
const initPoweroffButton = () => {
try {
- const btn = widgetRoot.querySelector('.poweroff')
- if (!btn) return
+ const poweroffBtn = widgetRoot.querySelector('.poweroff')
+ if (!poweroffBtn) return
- btn.addEventListener('click', () => {
+ poweroffBtn.addEventListener('click', () => {
if (confirm("Etes-vous sûr de vouloir éteindre l'équipement #name# ?")) {
jeedom.cmd.execute({ id: '#cmd_poweroff_id#' })
}
@@ -382,13 +382,13 @@
*/
const initRefreshButton = () => {
try {
- const btn = widgetRoot.querySelector('.refresh')
- if (!btn) return
+ const refreshBtn = widgetRoot.querySelector('.refresh')
+ if (!refreshBtn) return
if ('#refresh_id#' !== '') {
- btn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' }))
+ refreshBtn.addEventListener('click', () => jeedom.cmd.execute({ id: '#refresh_id#' }))
} else {
- btn.remove()
+ refreshBtn.remove()
}
} catch (e) {
console.error('[Monitoring Syno] Error in initRefreshButton:', e)
@@ -406,9 +406,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#uptime#id#')
- if (!el) return
- el.innerHTML = '
#uptime#'
+ const uptimeEl = widgetRoot.querySelector('#uptime#id#')
+ if (!uptimeEl) return
+ uptimeEl.innerHTML = '
#uptime#'
} catch (e) {
console.error('[Monitoring Syno] Error in initUptime:', e)
}
@@ -421,9 +421,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#network_infos#id#')
- if (!el) return
- el.innerHTML = '
#network_infos#'
+ const networkInfosEl = widgetRoot.querySelector('#network_infos#id#')
+ if (!networkInfosEl) return
+ networkInfosEl.innerHTML = '
#network_infos#'
} catch (e) {
console.error('[Monitoring Syno] Error in initNetworkInfos:', e)
}
@@ -436,9 +436,9 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#network#id#')
- if (!el) return
- el.innerHTML = '
#network#'
+ const networkEl = widgetRoot.querySelector('#network#id#')
+ if (!networkEl) return
+ networkEl.innerHTML = '
#network#'
} catch (e) {
console.error('[Monitoring Syno] Error in initNetwork:', e)
}
@@ -487,12 +487,12 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#memory_available_percent#id#')
- if (!el) return
+ const memoryEl = widgetRoot.querySelector('#memory_available_percent#id#')
+ if (!memoryEl) return
const value = '#memory_available_percent#'
if (value === '') {
- el.innerHTML = '
#memory#'
+ memoryEl.innerHTML = '
#memory#'
return
}
@@ -509,16 +509,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#swap_free_percent#id#')
- if (!el) return
+ const swapEl = widgetRoot.querySelector('#swap_free_percent#id#')
+ if (!swapEl) return
const value = '#swap_free_percent#'
if (value === '') {
- el.innerHTML = '
#swap#'
+ swapEl.innerHTML = '
#swap#'
return
}
- el.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true)
+ swapEl.innerHTML = buildPercentageHTML(value, '#swap_free_percent_colorlow#', '#swap_free_percent_colorhigh#', '#swap# (', '%', true)
} catch (e) {
console.error('[Monitoring Syno] Error in initSwap:', e)
}
@@ -531,16 +531,16 @@
try {
if ('#cnx_ssh#' !== 'OK' && '#cnx_ssh#' !== 'No') return
- const el = widgetRoot.querySelector('#hdd#id#')
- if (!el) return
+ const hddEl = widgetRoot.querySelector('#hdd#id#')
+ if (!hddEl) return
const value = '#hdd_free_percent#'
if (value === '') {
- el.innerHTML = '
'
+ hddEl.innerHTML = '
'
return
}
- el.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true)
+ hddEl.innerHTML = buildPercentageHTML(value, '#hdd_free_percent_colorlow#', '#hdd_free_percent_colorhigh#', '#hdd# (', '%', true)
} catch (e) {
console.error('[Monitoring Syno] Error in initHDD:', e)
}
@@ -585,8 +585,8 @@
const dataset = container.dataset
const synoId = dataset.synoId
- const el = widgetRoot.querySelector('#' + synoId + '_unit#id#')
- if (!el) return
+ const synoVolumeEl = widgetRoot.querySelector('#' + synoId + '_unit#id#')
+ if (!synoVolumeEl) return
const value = dataset.synoValue
const valuePercent = dataset.synoValuePercent
@@ -598,7 +598,7 @@
}
if (!valuePercent || valuePercent === '' || valuePercent.startsWith('#')) {
- el.innerHTML = '
' + value + ''
+ synoVolumeEl.innerHTML = '
' + value + ''
return
}
@@ -607,7 +607,7 @@
const high = parseFloat(dataset.synoHigh)
const color = getColorStyle(val, low, high, true)
- el.innerHTML = value + ' (
' + valuePercent + '%)'
+ synoVolumeEl.innerHTML = value + ' (
' + valuePercent + '%)'
} catch (e) {
console.error('[Monitoring Syno] Error in initSynoVolume for', container.dataset?.synoId || 'unknown', ':', e)
}
@@ -623,12 +623,12 @@
const dataset = container.dataset
const persoId = dataset.persoId
- const el = widgetRoot.querySelector('#' + persoId + '_unite#id#')
- if (!el) return
+ const persoEl = widgetRoot.querySelector('#' + persoId + '_unite#id#')
+ if (!persoEl) return
const value = dataset.persoValue
if (value === '') {
- el.innerHTML = '
'
+ persoEl.innerHTML = '
'
return
}
@@ -638,9 +638,9 @@
const color = getColorStyle(val, low, high, false)
if (color) {
- el.innerHTML = '
' + value + '' + dataset.persoUnite + ''
+ persoEl.innerHTML = '
' + value + '' + dataset.persoUnite + ''
} else {
- el.innerHTML = '
' + value + '' + dataset.persoUnite + ''
+ persoEl.innerHTML = '
' + value + '' + dataset.persoUnite + ''
}
} catch (e) {
console.error('[Monitoring Syno] Error in initPerso for', container.dataset?.persoId || 'unknown', ':', e)
From a6ce8e58fbb908a1bc29a17eb7f3b6f6c79a487e Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Tue, 6 Jan 2026 12:57:23 +0100
Subject: [PATCH 77/84] update Syno templates
---
core/template/dashboard/Synology.html | 1602 ++++++++++++-------------
core/template/mobile/Synology.html | 1370 ++++++++++-----------
2 files changed, 1486 insertions(+), 1486 deletions(-)
diff --git a/core/template/dashboard/Synology.html b/core/template/dashboard/Synology.html
index a38cf0f7..d2b6bfb9 100644
--- a/core/template/dashboard/Synology.html
+++ b/core/template/dashboard/Synology.html
@@ -1,803 +1,803 @@
-
-
-
-
- #distri_name_icon#
- #distri_name#
-
-
- #uptime_icon#
-
-
-
- #load_avg_icon#
-
-
-
- #memory_icon#
-
-
-
- #swap_icon#
-
-
-
- #network_infos_icon#
-
-
-
- #network_icon#
-
-
-
- #multi_network_cards#
-
- #hdd_icon#
-
-
-
- #syno_hddv2_icon#
-
-
-
- #syno_hddv3_icon#
-
-
-
- #syno_hddv4_icon#
-
-
-
- #syno_hddusb_icon#
-
-
-
- #syno_hddesata_icon#
-
-
-
- #cpu_icon#
-
-
-
- #perso1_icon#
-
-
-
- #perso2_icon#
-
-
-
- #perso3_icon#
-
-
-
- #perso4_icon#
-
-
-
- #divGraphInfo#
-
+ data-eqType="#eqType#" data-eqLogic_id="#id#" data-eqLogic_uid="#uid#" data-version="#version#"
+ data-translate-category="#translate_category#" data-category="#category#" data-tags="#tags#"
+ style="width: #width#;height: #height#;#style#;">
+
+
+
+
+ #distri_name_icon#
+ #distri_name#
+
+
+ #uptime_icon#
+
+
+
+ #load_avg_icon#
+
+
+
+ #memory_icon#
+
+
+
+ #swap_icon#
+
+
+
+ #network_infos_icon#
+
+
+
+ #network_icon#
+
+
+
+ #multi_network_cards#
+
+ #hdd_icon#
+
+
+
+ #syno_hddv2_icon#
+
+
+
+ #syno_hddv3_icon#
+
+
+
+ #syno_hddv4_icon#
+
+
+
+ #syno_hddusb_icon#
+
+
+
+ #syno_hddesata_icon#
+
+
+
+ #cpu_icon#
+
+
+
+ #perso1_icon#
+
+
+
+ #perso2_icon#
+
+
+
+ #perso3_icon#
+
+
+
+ #perso4_icon#
+
+
+
+ #divGraphInfo#
+
\ No newline at end of file
diff --git a/core/template/mobile/Synology.html b/core/template/mobile/Synology.html
index 53f76b98..8e9cc980 100644
--- a/core/template/mobile/Synology.html
+++ b/core/template/mobile/Synology.html
@@ -1,687 +1,687 @@
\ No newline at end of file
From 7019bb0241b7ba30eb32aa0b188140a2113eeb52 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 20:23:50 +0100
Subject: [PATCH 78/84] Fix SSH host select initialization timing
Updated the SSH host select initialization in Monitoring.js to ensure event listeners are attached only after options are loaded asynchronously. Bumped plugin version to 3.4.3.
---
desktop/js/Monitoring.js | 19 +++++++++++--------
plugin_info/info.json | 2 +-
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/desktop/js/Monitoring.js b/desktop/js/Monitoring.js
index 88b4f41b..46d0186f 100644
--- a/desktop/js/Monitoring.js
+++ b/desktop/js/Monitoring.js
@@ -396,14 +396,17 @@ function printEqLogic(_eqLogic) {
}
}
- buildSelectHost(_eqLogic.configuration.SSHHostId)
-
- // Toggle add/edit button based on SSH host selection
- const sshHostSelect = document.querySelector('.sshmanagerHelper[data-helper="list"]')
- if (sshHostSelect) {
- sshHostSelect.addEventListener('change', toggleSSHButtons)
- // Initialize button display
- toggleSSHButtons({ currentTarget: sshHostSelect })
+ // Build SSH host select and attach listener after options are loaded
+ const buildPromise = buildSelectHost(_eqLogic.configuration.SSHHostId)
+ if (buildPromise && buildPromise.then) {
+ buildPromise.then(() => {
+ const sshHostSelect = document.querySelector('.sshmanagerHelper[data-helper="list"]')
+ if (sshHostSelect) {
+ sshHostSelect.addEventListener('change', toggleSSHButtons)
+ // Initialize button display
+ toggleSSHButtons({ currentTarget: sshHostSelect })
+ }
+ })
}
}
diff --git a/plugin_info/info.json b/plugin_info/info.json
index f68d7c2d..202af5de 100644
--- a/plugin_info/info.json
+++ b/plugin_info/info.json
@@ -1,7 +1,7 @@
{
"id": "Monitoring",
"name": "Monitoring",
- "pluginVersion": "3.4.2",
+ "pluginVersion": "3.4.3",
"description": {
"fr_FR": "Plugin permettant le monitoring des équipements locaux et distants (via SSH). Le plugin affichera les informations systèmes d'équipements sous Linux ou Synology (Distribution, CPU, Mémoire, Disques, Swap).",
"en_US": "Plugin to monitor local and remote equipments (through SSH). The plugin will display system informations from Linux or Synology (Distribution, CPU, Memory, Disks, Swap).",
From e271727114fe5c6de54acec99df9a769bfcec6e8 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 20:29:20 +0100
Subject: [PATCH 79/84] Refactor SSH host select event handling in
Monitoring.js
Improved the logic for attaching the change event listener to the SSH host select element by ensuring any existing listener is removed before adding a new one. Also, ensured the toggleSSHButtons function is called after the select is populated, handling both promise and non-promise cases from buildSelectHost.
---
desktop/js/Monitoring.js | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/desktop/js/Monitoring.js b/desktop/js/Monitoring.js
index 46d0186f..354fb74c 100644
--- a/desktop/js/Monitoring.js
+++ b/desktop/js/Monitoring.js
@@ -396,17 +396,26 @@ function printEqLogic(_eqLogic) {
}
}
- // Build SSH host select and attach listener after options are loaded
+ // Build SSH host select
const buildPromise = buildSelectHost(_eqLogic.configuration.SSHHostId)
- if (buildPromise && buildPromise.then) {
- buildPromise.then(() => {
- const sshHostSelect = document.querySelector('.sshmanagerHelper[data-helper="list"]')
- if (sshHostSelect) {
- sshHostSelect.addEventListener('change', toggleSSHButtons)
- // Initialize button display
+
+ // Toggle add/edit button based on SSH host selection
+ const sshHostSelect = document.querySelector('.sshmanagerHelper[data-helper="list"]')
+ if (sshHostSelect) {
+ // Remove existing listener to avoid duplicates
+ sshHostSelect.removeEventListener('change', toggleSSHButtons)
+ // Attach listener
+ sshHostSelect.addEventListener('change', toggleSSHButtons)
+
+ // Initialize button display after select is populated
+ if (buildPromise && buildPromise.then) {
+ buildPromise.then(() => {
toggleSSHButtons({ currentTarget: sshHostSelect })
- }
- })
+ })
+ } else {
+ // Fallback if buildSelectHost didn't return a promise
+ toggleSSHButtons({ currentTarget: sshHostSelect })
+ }
}
}
From 607fe51a23db03e0cec3194ceac9384f6a2607e5 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 20:35:36 +0100
Subject: [PATCH 80/84] Replace unseen/seen with style.display for SSH buttons
Refactored toggleSSHButtons to use direct style.display assignments instead of unseen/seen methods for showing and hiding the add and edit buttons.
---
desktop/js/Monitoring.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/desktop/js/Monitoring.js b/desktop/js/Monitoring.js
index 354fb74c..e137312f 100644
--- a/desktop/js/Monitoring.js
+++ b/desktop/js/Monitoring.js
@@ -429,12 +429,12 @@ function toggleSSHButtons(event) {
if (selectedValue && selectedValue !== '') {
// Host selected → show edit, hide add
- addBtn?.unseen()
- editBtn?.seen()
+ if (addBtn) addBtn.style.display = 'none'
+ if (editBtn) editBtn.style.display = 'block'
} else {
// No host selected → show add, hide edit
- addBtn?.seen()
- editBtn?.unseen()
+ if (addBtn) addBtn.style.display = 'block'
+ if (editBtn) editBtn.style.display = 'none'
}
}
From a0f1035354d82200605447fda761706100fa16ec Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 20:38:11 +0100
Subject: [PATCH 81/84] Improve robustness of toggleSSHButtons event handling
Updated the toggleSSHButtons function to more reliably extract the selected value from the event object, improving compatibility with different event sources.
---
desktop/js/Monitoring.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/desktop/js/Monitoring.js b/desktop/js/Monitoring.js
index e137312f..fa605892 100644
--- a/desktop/js/Monitoring.js
+++ b/desktop/js/Monitoring.js
@@ -423,7 +423,7 @@ function printEqLogic(_eqLogic) {
* Toggle between add and edit SSH buttons based on selection
*/
function toggleSSHButtons(event) {
- const selectedValue = event.currentTarget.value
+ const selectedValue = event.target?.value ?? event.currentTarget?.value ?? event.value
const addBtn = document.querySelector('.sshmanagerHelper[data-helper="add"]')
const editBtn = document.querySelector('.sshmanagerHelper[data-helper="edit"]')
From 94bf678b1ea487b70417abf1afc5989efa970e80 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 20:55:22 +0100
Subject: [PATCH 82/84] Improve SSH button toggle logic in Monitoring.js
Refactored the toggleSSHButtons function to accept either an event or a direct SSHHostId value, improving initialization and event handling. This ensures correct button display when the SSH host select is populated asynchronously or synchronously.
---
desktop/js/Monitoring.js | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/desktop/js/Monitoring.js b/desktop/js/Monitoring.js
index fa605892..0e64252e 100644
--- a/desktop/js/Monitoring.js
+++ b/desktop/js/Monitoring.js
@@ -407,23 +407,39 @@ function printEqLogic(_eqLogic) {
// Attach listener
sshHostSelect.addEventListener('change', toggleSSHButtons)
- // Initialize button display after select is populated
+ // Initialize button display - pass the value directly instead of waiting
if (buildPromise && buildPromise.then) {
buildPromise.then(() => {
- toggleSSHButtons({ currentTarget: sshHostSelect })
+ toggleSSHButtons(_eqLogic.configuration.SSHHostId)
})
} else {
// Fallback if buildSelectHost didn't return a promise
- toggleSSHButtons({ currentTarget: sshHostSelect })
+ toggleSSHButtons(_eqLogic.configuration.SSHHostId)
}
}
}
/**
* Toggle between add and edit SSH buttons based on selection
+ * @param {Event|string|number} eventOrValue - Either a change event or a direct value (SSHHostId)
*/
-function toggleSSHButtons(event) {
- const selectedValue = event.target?.value ?? event.currentTarget?.value ?? event.value
+function toggleSSHButtons(eventOrValue) {
+ let selectedValue
+
+ // Check if it's a direct value (string/number) or an event object
+ if (typeof eventOrValue === 'string' || typeof eventOrValue === 'number') {
+ selectedValue = eventOrValue
+ } else if (eventOrValue?.target || eventOrValue?.currentTarget) {
+ // It's an event, extract value from it
+ selectedValue = eventOrValue.target?.value ?? eventOrValue.currentTarget?.value ?? eventOrValue.value
+ }
+
+ // If still no value, read directly from the select element as fallback
+ if (!selectedValue) {
+ const sshHostSelect = document.querySelector('.sshmanagerHelper[data-helper="list"]')
+ selectedValue = sshHostSelect?.value
+ }
+
const addBtn = document.querySelector('.sshmanagerHelper[data-helper="add"]')
const editBtn = document.querySelector('.sshmanagerHelper[data-helper="edit"]')
From 3c1bc7d9ff0c0525a2d83f5c2ba63c6cc2b7f017 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 22:15:23 +0100
Subject: [PATCH 83/84] Use single quotes in tendance icon HTML output
Replaces double quotes with single quotes in the HTML string for the tendance icon to ensure consistency and avoid potential conflicts in attribute quoting.
---
core/class/Monitoring.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/class/Monitoring.class.php b/core/class/Monitoring.class.php
index 9909f35e..9eadd93a 100644
--- a/core/class/Monitoring.class.php
+++ b/core/class/Monitoring.class.php
@@ -2627,7 +2627,7 @@ public function getCmdReplace(string $cmdName, array $cmdOptions, &$replace) {
$replace[$cmdNamePrefix . '_averageHistory#'] = $isCmdObject ? $cmd->getConfiguration($cmdName . '_averageHistory') : '-';
$replace[$cmdNamePrefix . '_minHistory#'] = $isCmdObject ? $cmd->getConfiguration($cmdName . '_minHistory') : '-';
$replace[$cmdNamePrefix . '_maxHistory#'] = $isCmdObject ? $cmd->getConfiguration($cmdName . '_maxHistory') : '-';
- $replace[$cmdNamePrefix . '_tendance#'] = ($isCmdObject && $cmd->getConfiguration($cmdName . '_tendance', '') !== '') ? '
' : '';
+ $replace[$cmdNamePrefix . '_tendance#'] = ($isCmdObject && $cmd->getConfiguration($cmdName . '_tendance', '') !== '') ? '
getConfiguration($cmdName . '_tendance') . '\'>' : '';
}
];
From 822b538d73b2e2492af6644dab5320c3592d0e64 Mon Sep 17 00:00:00 2001
From: Olivier <16240457+TiTidom-RC@users.noreply.github.com>
Date: Thu, 8 Jan 2026 22:29:44 +0100
Subject: [PATCH 84/84] Escape HTML attributes in tendance icon output
Updated the tendance icon HTML generation to use escaped double quotes for attribute values, preventing conflicts with surrounding quotes and improving HTML safety.
---
core/class/Monitoring.class.php | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/core/class/Monitoring.class.php b/core/class/Monitoring.class.php
index 9eadd93a..3d3f2ef7 100644
--- a/core/class/Monitoring.class.php
+++ b/core/class/Monitoring.class.php
@@ -2627,7 +2627,11 @@ public function getCmdReplace(string $cmdName, array $cmdOptions, &$replace) {
$replace[$cmdNamePrefix . '_averageHistory#'] = $isCmdObject ? $cmd->getConfiguration($cmdName . '_averageHistory') : '-';
$replace[$cmdNamePrefix . '_minHistory#'] = $isCmdObject ? $cmd->getConfiguration($cmdName . '_minHistory') : '-';
$replace[$cmdNamePrefix . '_maxHistory#'] = $isCmdObject ? $cmd->getConfiguration($cmdName . '_maxHistory') : '-';
- $replace[$cmdNamePrefix . '_tendance#'] = ($isCmdObject && $cmd->getConfiguration($cmdName . '_tendance', '') !== '') ? '
getConfiguration($cmdName . '_tendance') . '\'>' : '';
+ // Utiliser htmlspecialchars pour échapper les attributs HTML afin d'éviter les conflits avec les guillemets
+ $tendanceIcon = ($isCmdObject && $cmd->getConfiguration($cmdName . '_tendance', '') !== '')
+ ? '
getConfiguration($cmdName . '_tendance') . '">'
+ : '';
+ $replace[$cmdNamePrefix . '_tendance#'] = $tendanceIcon;
}
];