network tree filter counts

This commit is contained in:
jokob-sk
2025-07-21 09:38:28 +10:00
parent 0444e338ec
commit 752322bbad
+54 -52
View File
@@ -22,6 +22,9 @@
<input type="checkbox" name="showOffline" checked> <input type="checkbox" name="showOffline" checked>
<div style="margin-left: 10px; display: inline-block; vertical-align: top;"> <div style="margin-left: 10px; display: inline-block; vertical-align: top;">
<?= lang('Network_ShowOffline');?> <?= lang('Network_ShowOffline');?>
<span id="showOfflineNumber">
<!-- placeholder -->
</span>
</div> </div>
</label> </label>
</div> </div>
@@ -30,6 +33,9 @@
<input type="checkbox" name="showArchived"> <input type="checkbox" name="showArchived">
<div style="margin-left: 10px; display: inline-block; vertical-align: top;"> <div style="margin-left: 10px; display: inline-block; vertical-align: top;">
<?= lang('Network_ShowArchived');?> <?= lang('Network_ShowArchived');?>
<span id="showArchivedNumber">
<!-- placeholder -->
</span>
</div> </div>
</label> </label>
</div> </div>
@@ -368,102 +374,98 @@
// ----------------------------------------------------------- // -----------------------------------------------------------
const networkDeviceTypes = getSetting("NETWORK_DEVICE_TYPES").replace("[", "").replace("]", ""); const networkDeviceTypes = getSetting("NETWORK_DEVICE_TYPES").replace("[", "").replace("]", "");
const showArchived = getCache('showArchived') == "true"; const showArchived = getCache('showArchived') === "true";
const showOffline = getCache('showOffline') == "true"; const showOffline = getCache('showOffline') === "true";
console.log('showArchived:', showArchived); console.log('showArchived:', showArchived);
console.log('showOffline:', showOffline); console.log('showOffline:', showOffline);
// Build WHERE conditions dynamically // Always get all devices
let filters = [];
if (!showArchived) {
filters.push(`a.devIsArchived = 0`);
}
if (!showOffline) {
filters.push(`a.devPresentLastScan != 0`);
}
// Assemble WHERE clause only if filters exist
const whereClause = filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : '';
console.log(whereClause);
const rawSql = ` const rawSql = `
SELECT *, SELECT *,
CASE CASE
WHEN devAlertDown != 0 AND devPresentLastScan = 0 THEN "Down" WHEN devAlertDown != 0 AND devPresentLastScan = 0 THEN "Down"
WHEN devPresentLastScan = 1 THEN "On-line" WHEN devPresentLastScan = 1 THEN "On-line"
ELSE "Off-line" ELSE "Off-line"
END as devStatus, END AS devStatus,
CASE CASE
WHEN devType IN (${networkDeviceTypes}) WHEN devType IN (${networkDeviceTypes}) THEN 1
THEN 1
ELSE 0 ELSE 0
END as devIsNetworkNodeDynamic END AS devIsNetworkNodeDynamic
FROM Devices a FROM Devices a
${whereClause}
`; `;
const apiUrl = `php/server/dbHelper.php?action=read&rawSql=${btoa(encodeURIComponent(rawSql))}`; const apiUrl = `php/server/dbHelper.php?action=read&rawSql=${btoa(encodeURIComponent(rawSql))}`;
$.get(apiUrl, function (data) { $.get(apiUrl, function (data) {
rawData = JSON.parse (data) console.log(data);
console.log(rawData); const parsed = JSON.parse(data);
const allDevices = parsed;
if(rawData["data"] == "") console.log(allDevices);
{
showModalOK (getString('Gen_Warning'), getString('Network_NoDevices'))
if (!allDevices || allDevices.length === 0) {
showModalOK(getString('Gen_Warning'), getString('Network_NoDevices'));
return; return;
} }
orderTopologyBy = createArray(getSetting("UI_TOPOLOGY_ORDER")) // Count totals for UI
let archivedCount = 0;
let offlineCount = 0;
devicesListnew = rawData.sort((a, b) => { allDevices.forEach(device => {
// Helper to safely parse port into an integer; invalid ports become Infinity for sorting if (parseInt(device.devIsArchived) === 1) archivedCount++;
const parsePort = (devParentPort) => { if (parseInt(device.devPresentLastScan) === 0 && parseInt(device.devIsArchived) === 0) offlineCount++;
const parsed = parseInt(devParentPort, 10); });
if(archivedCount > 0)
{
$('#showArchivedNumber').text(`(${archivedCount})`);
}
if(offlineCount > 0)
{
$('#showOfflineNumber').text(`(${offlineCount})`);
}
// Now apply UI filter based on toggles
const filteredDevices = allDevices.filter(device => {
if (!showArchived && parseInt(device.devIsArchived) === 1) return false;
if (!showOffline && parseInt(device.devPresentLastScan) === 0) return false;
return true;
});
// Sort filtered devices
const orderTopologyBy = createArray(getSetting("UI_TOPOLOGY_ORDER"));
const devicesSorted = filteredDevices.sort((a, b) => {
const parsePort = (port) => {
const parsed = parseInt(port, 10);
return isNaN(parsed) ? Infinity : parsed; return isNaN(parsed) ? Infinity : parsed;
}; };
switch (orderTopologyBy[0]) { switch (orderTopologyBy[0]) {
case "Name": case "Name":
// First sort by name alphabetically
const nameCompare = a.devName.localeCompare(b.devName); const nameCompare = a.devName.localeCompare(b.devName);
if (nameCompare !== 0) { return nameCompare !== 0 ? nameCompare : parsePort(a.devParentPort) - parsePort(b.devParentPort);
return nameCompare;
}
// If names are the same, sort by port numerically
return parsePort(a.devParentPort) - parsePort(b.devParentPort);
case "Port": case "Port":
// Sort by port numerically
return parsePort(a.devParentPort) - parsePort(b.devParentPort); return parsePort(a.devParentPort) - parsePort(b.devParentPort);
default: default:
// Default: Sort by rowid (as a fallback)
return a.rowid - b.rowid; return a.rowid - b.rowid;
} }
}); });
setCache('devicesListNew', JSON.stringify(devicesListnew)); setCache('devicesListNew', JSON.stringify(devicesSorted));
deviceListGlobal = devicesSorted;
// Init global variable // Render filtered result
deviceListGlobal = devicesListnew;
// create tree
initTree(getHierarchy()); initTree(getHierarchy());
// bottom tables
loadNetworkNodes(); loadNetworkNodes();
// attach on-click events
attachTreeEvents(); attachTreeEvents();
}); });
</script> </script>