Merge pull request #1684 from netalertx/next_release

Next release
This commit is contained in:
Jokob @NetAlertX
2026-06-21 10:56:54 +10:00
committed by GitHub
16 changed files with 230 additions and 77 deletions

View File

@@ -14,9 +14,9 @@ If a device is missing from the **My Devices** list, work through these checks.
The most common cause is that a filter is hiding the device.
![Image](https://docs.netalertx.com/img/ADVISORIES/filters.png)
![Active device filters example](./img/ADVISORIES/filters.png)
![Image](https://docs.netalertx.com/img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png)
![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png)
Review any active:
@@ -32,6 +32,8 @@ Clear filters first, then reload the page and check again.
You can select devices of what statuses should be displayed in the My Devices view. This can be adjusted in the _Settings_ section - search for the `UI_MY_DEVICES` setting and verify that the statuses you want to show are selected.
![Global filter display settings](./img/DEVICE_MANAGEMENT/device_filter_settings.png)
---
### Check Whether the Device Is Hidden

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

View File

@@ -2647,13 +2647,13 @@ table.dataTable tbody > tr.selected
.skel-tab-pane { z-index: 10; min-height: 400px; }
#settings-skeleton { padding-top: 50px; padding-left: 20px; padding-right: 20px; min-height: 500px; }
#devices-skeleton { top: 50px; min-height: 500px; }
#device-details-skeleton { min-height: 600px; }
#device-details-skeleton { top: 45px; min-height: 100px; }
#events-skeleton { top: 50px; min-height: 500px; }
#presence-skeleton { top: 50px; min-height: 500px; }
#report-skeleton { min-height: 400px; }
#notifications-skeleton { min-height: 400px; }
#notifications-skeleton { top: 50px; min-height: 400px; }
#workflows-skeleton { top: 50px; width: 770px; margin: 0 auto; min-height: 300px; }
#plugins-skeleton { padding: 0; min-height: 400px; }
#plugins-skeleton { top: 50px; padding: 0; min-height: 400px; }
/* Bordered containers */
.skel-overview-panel, .skel-section, .skel-plugin-block,
@@ -2728,6 +2728,7 @@ table.dataTable tbody > tr.selected
/* ----- Devices ---------------------------------------------------------- */
.skel-tile { display: flex; height: 80px; }
#device-details-skeleton .skel-tile { display: flex; height: 45px; }
.skel-tile-inner { display: flex; flex-direction: column; padding: 12px 15px; justify-content: center; gap: 10px; }
.skel-tile-num { height: 26px; width: 55%; }
.skel-tile-label { height: 13px; width: 75%; }
@@ -2740,8 +2741,8 @@ table.dataTable tbody > tr.selected
.skel-td { height: 13px; }
/* ----- Device Details --------------------------------------------------- */
.skel-detail-header { margin-bottom: 15px; }
.skel-detail-title { height: 26px; width: 42%; margin-bottom: 14px; }
.skel-detail-header { margin-bottom: 0px; }
.skel-detail-title { height: 26px; width: 42%; margin-bottom: 0px; }
.skel-detail-info-panel { display: flex; gap: 0; padding: 14px; border-radius: 4px; margin-bottom: 15px; max-width: 400px; }
.skel-tabs-bar { display: flex; gap: 4px; padding: 8px 10px 0; border-radius: 4px 4px 0 0; border-bottom: none; }
.skel-tab { height: 34px; width: 100px; border-radius: 4px 4px 0 0; flex-shrink: 0; }
@@ -2758,7 +2759,7 @@ table.dataTable tbody > tr.selected
/* ----- Plugins ---------------------------------------------------------- */
.skel-plugins-wrap { display: flex; gap: 0; min-height: 400px; }
.skel-plugins-nav { width: 165px; flex-shrink: 0; border-right: 1px solid var(--skel-border); padding: 8px 0; }
.skel-plugins-nav { flex-shrink: 0; border-right: 1px solid var(--skel-border); padding: 8px 0; }
.skel-plugins-nav-item { display: flex; align-items: center; padding: 9px 15px; border-bottom: 1px solid var(--skel-border); }
.skel-plugins-nav-item:last-child { border-bottom: none; }
.skel-plugins-body { flex: 1; padding: 0; }

View File

@@ -766,5 +766,5 @@ table.dataTable tbody tr.selected, table.dataTable tbody tr .selected
--skel-section: #252c38;
--skel-panel-bg: #1e242e;
--skel-border: #2a323e;
--skel-bg: #353c42;
--skel-bg: #292e33;
}

View File

@@ -743,5 +743,5 @@
--skel-section: #252c38;
--skel-panel-bg: #1e242e;
--skel-border: #2a323e;
--skel-bg: #353c42;
--skel-bg: #292e33;
}

View File

@@ -4,56 +4,43 @@
<!-- Content header area -------------------------------------------------- -->
<div class="skel-detail-header">
<div class="skel-detail-title skel-shimmer"></div>
<div class="skel-detail-info-panel">
<div class="skel-shimmer" style="width:76px; height:76px; border-radius:4px; flex-shrink:0;"></div>
<div style="flex:1; display:flex; flex-direction:column; gap:9px; padding:10px 0 10px 10px;">
<span class="skel-line skel-shimmer" style="width:55%"></span>
<span class="skel-line skel-shimmer" style="width:38%"></span>
<span class="skel-line skel-shimmer" style="width:45%"></span>
</div>
</div>
</div>
<!-- Top stat tiles -------------------------------------------------------- -->
<div class="row">
<div class="col-lg-3 col-sm-6 col-xs-6 padding-5px">
<div class="col-lg-3 col-sm-6 col-xs-6 ">
<div class="skel-tile">
<div class="skel-tile-inner">
<div class="skel-tile-num skel-shimmer"></div>
<div class="skel-tile-label skel-shimmer"></div>
</div>
<div class="skel-tile-icon-area">
<div class="skel-tile-icon-shape skel-shimmer"></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6 col-xs-6 padding-5px">
<div class="col-lg-3 col-sm-6 col-xs-6 ">
<div class="skel-tile">
<div class="skel-tile-inner">
<div class="skel-tile-num skel-shimmer"></div>
<div class="skel-tile-label skel-shimmer"></div>
</div>
<div class="skel-tile-icon-area">
<div class="skel-tile-icon-shape skel-shimmer"></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6 col-xs-6 padding-5px">
<div class="col-lg-3 col-sm-6 col-xs-6 ">
<div class="skel-tile">
<div class="skel-tile-inner">
<div class="skel-tile-num skel-shimmer"></div>
<div class="skel-tile-label skel-shimmer"></div>
</div>
<div class="skel-tile-icon-area">
<div class="skel-tile-icon-shape skel-shimmer"></div>
</div>
</div>
</div>
<div class="col-lg-3 col-sm-6 col-xs-6 padding-5px">
<div class="col-lg-3 col-sm-6 col-xs-6 ">
<div class="skel-tile">
<div class="skel-tile-inner">
<div class="skel-tile-num skel-shimmer"></div>
<div class="skel-tile-label skel-shimmer"></div>
</div>
<div class="skel-tile-icon-area">
<div class="skel-tile-icon-shape skel-shimmer"></div>

View File

@@ -30,7 +30,7 @@
<span class="skel-th skel-shimmer"></span>
<?php endfor; ?>
</div>
<?php for ($i = 0; $i < 8; $i++): ?>
<?php for ($i = 0; $i < 20; $i++): ?>
<div class="skel-tr">
<?php for ($j = 0; $j < 6; $j++): ?>
<span class="skel-td skel-shimmer"></span>

View File

@@ -8,7 +8,7 @@
<span class="skel-th skel-shimmer"></span>
<?php endfor; ?>
</div>
<?php for ($i = 0; $i < 8; $i++): ?>
<?php for ($i = 0; $i < 25; $i++): ?>
<div class="skel-tr">
<?php for ($j = 0; $j < 4; $j++): ?>
<span class="skel-td skel-shimmer"></span>
@@ -16,4 +16,8 @@
</div>
<?php endfor; ?>
</div>
<div class="skel-form-footer">
<span class="skel-form-btn skel-shimmer"></span>
<span class="skel-form-btn skel-shimmer"></span>
</div>
</div>

View File

@@ -1,8 +1,8 @@
<div id="plugins-skeleton">
<div class="skel-plugins-wrap">
<div class="skel-plugins-wrap col-sm-12">
<!-- Left nav sidebar -->
<div class="skel-plugins-nav">
<div class="skel-plugins-nav col-sm-2">
<?php
$widths = [72, 60, 80, 55, 68, 75];
for ($i = 0; $i < 6; $i++):
@@ -14,7 +14,7 @@
</div>
<!-- Right content area -->
<div class="skel-plugins-body">
<div class="skel-plugins-body col-sm-10">
<!-- Sub-tab bar -->
<div class="skel-tabs-bar" style="border-radius: 0 4px 0 0; margin-bottom: 0;">
<span class="skel-tab skel-shimmer"></span>
@@ -28,7 +28,7 @@
<span class="skel-th skel-shimmer"></span>
<?php endfor; ?>
</div>
<?php for ($i = 0; $i < 8; $i++): ?>
<?php for ($i = 0; $i < 25; $i++): ?>
<div class="skel-tr">
<?php for ($j = 0; $j < 5; $j++): ?>
<span class="skel-td skel-shimmer"></span>
@@ -37,6 +37,9 @@
<?php endfor; ?>
</div>
</div>
</div>
<div class="skel-form-footer col-sm-12 padding-5px">
<span class="skel-form-btn skel-shimmer"></span>
<span class="skel-form-btn skel-shimmer"></span>
</div>
</div>

View File

@@ -1,37 +1,155 @@
<!-- Details Tab Skeleton ================================================== -->
<div id="skel-tab-details" class="skel-tab-pane">
<div class="skel-detail-form">
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:340px"></span>
<div class="skel-detail-form col-lg-12 col-sm-12 col-xs-12">
<div class="col-lg-4 col-sm-6 col-xs-12">
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:340px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:260px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:400px;height:50px"></span>
</div>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:260px"></span>
<div class="col-lg-4 col-sm-6 col-xs-12">
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:340px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:260px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:400px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:300px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:220px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span>
</div>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:400px"></span>
<div class="col-lg-4 col-sm-6 col-xs-12">
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:340px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:260px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:400px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:300px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:220px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:220px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:300px"></span>
<div class="col-lg-6 col-sm-12 col-xs-12">
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:340px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span><span class="skel-form-input skel-shimmer" style="max-width:40px"></span>
</div>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:220px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:380px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:280px"></span>
</div>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:320px"></span>
<div class="col-lg-6 col-sm-12 col-xs-12">
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer" style="max-width:340px"></span>
</div>
</div>
<div class="skel-form-footer">
<span class="skel-form-btn skel-shimmer"></span>

View File

@@ -0,0 +1,22 @@
<!-- Plugins Sub-Tab Table Skeleton (shared: Objects / Events / History) === -->
<div class="skel-table-box">
<div class="skel-table-header-row">
<?php for ($j = 0; $j < 5; $j++): ?>
<span class="skel-th skel-shimmer"></span>
<?php endfor; ?>
</div>
<?php
$rowWidths = array_fill(0, 20, [15, 14, 18, 12, 20]);
foreach ($rowWidths as $widths):
?>
<div class="skel-tr">
<?php foreach ($widths as $w): ?>
<span class="skel-td skel-shimmer" style="flex:1; max-width:<?= $w ?>%"></span>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
</div>
<div class="skel-form-footer" style="padding:8px 0;">
<span class="skel-form-btn skel-shimmer"></span>
<span class="skel-form-btn skel-shimmer"></span>
</div>

View File

@@ -1,5 +1,5 @@
<div class="skel-info-tab">
<?php for ($i = 0; $i < 10; $i++): ?>
<?php for ($i = 0; $i < 20; $i++): ?>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer"></span>

View File

@@ -1,5 +1,5 @@
<div class="skel-info-tab">
<?php for ($i = 0; $i < 14; $i++): ?>
<?php for ($i = 0; $i < 20; $i++): ?>
<div class="skel-form-row">
<span class="skel-form-label skel-shimmer"></span>
<span class="skel-form-input skel-shimmer"></span>

View File

@@ -4,7 +4,7 @@
<span class="skel-th skel-shimmer"></span>
<?php endfor; ?>
</div>
<?php for ($i = 0; $i < 6; $i++): ?>
<?php for ($i = 0; $i < 25; $i++): ?>
<div class="skel-tr">
<?php for ($j = 0; $j < 5; $j++): ?>
<span class="skel-td skel-shimmer"></span>

View File

@@ -2,6 +2,9 @@
//------------------------------------------------------------------------------
// check if authenticated
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
// Capture shared sub-tab skeleton template for JS injection
ob_start(); require $_SERVER['DOCUMENT_ROOT'] . '/php/templates/skel_tab_plugins_table.php'; $skelPluginsTable = ob_get_clean();
?>
<!-- Main content ---------------------------------------------------------- -->
@@ -27,6 +30,9 @@
<script>
// Sub-tab skeleton HTML (server-rendered, shared across Objects / Events / History panes)
const skelPluginsTable = <?= json_encode($skelPluginsTable) ?>;
// Global variable to track the last MAC we initialized with
let lastMac = null;
let keepUpdating = true;
@@ -620,8 +626,11 @@ function generateDataTable(prefix, tableType, colDefinitions) {
// Generate HTML for a DataTable and associated buttons for a given table type
const headersHtml = colDefinitions.map(colDef => `<th class="${colDef.css_classes}">${getString(`${prefix}_${colDef.column}_name`)}</th>`).join('');
const skelHtml = skelPluginsTable;
return `
<div id="${tableType.toLowerCase()}Target_${prefix}" class="tab-pane ${tableType == "Objects" ? "active":""}">
<div id="${tableType.toLowerCase()}Target_${prefix}" class="tab-pane ${tableType == "Objects" ? "active":""}" style="position:relative;">
<div id="skel-${tableType.toLowerCase()}Target_${prefix}" class="skel-plugins-tab-pane" style="position:absolute;top:0;left:0;right:0;z-index:1;background:inherit;">${skelHtml}</div>
<table id="${tableType.toLowerCase()}Table_${prefix}" class="display table table-striped table-stretched" data-my-dbtable="Plugins_${tableType}">
<thead><tr>${headersHtml}</tr></thead>
</table>
@@ -647,6 +656,7 @@ function initializeDataTables(prefix, colDefinitions, pluginObj) {
if ($.fn.DataTable.isDataTable(`#${tableId}`)) {
return; // already initialized
}
const skelId = `#skel-${tableId.replace('Table_', 'Target_')}`;
$(`#${tableId}`).DataTable({
processing: true,
serverSide: true,
@@ -655,6 +665,11 @@ function initializeDataTables(prefix, colDefinitions, pluginObj) {
ordering: false,
pageLength: 25,
lengthMenu: [[10, 25, 50, 100], [10, 25, 50, 100]],
// Fade out the skeleton only after the first draw so there is no gap
// between the skeleton disappearing and the table rows appearing.
initComplete: function() {
$(skelId).fadeOut(250, function() { $(this).remove(); });
},
createdRow: function(row, data) {
$(row).attr('data-my-index', data.index);
},

View File

@@ -335,6 +335,18 @@ function loadInterfaces() {
</tr>
`);
});
if ($.fn.DataTable.isDataTable('#networkTable')) {
$('#networkTable').DataTable().destroy();
}
$('#networkTable').DataTable({
searching: true,
order: [[0, "desc"]],
initComplete: function() {
hideSpinner();
}
});
},
error: function(xhr) {
const tbody = $("#networkTable tbody");
@@ -355,17 +367,6 @@ $(document).ready(function() {
});
loadInterfaces();
setTimeout(() => {
// Available IPs datatable
$('#networkTable').DataTable({
searching: true,
order: [[0, "desc"]],
initComplete: function(settings, json) {
hideSpinner(); // Called after the DataTable is fully initialized
}
});
}, 200);
});
</script>