Skip to content

Commit bfbe04e

Browse files
authored
Merge pull request #1679 from netalertx/next_release
Next release
2 parents 7b87814 + 6194134 commit bfbe04e

48 files changed

Lines changed: 1360 additions & 54 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

front/appEvents.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
<?php
22

3-
require 'php/templates/header.php';
4-
require 'php/templates/modals.php';
3+
require 'php/templates/header.php';
54
?>
65
<!-- ----------------------------------------------------------------------- -->
7-
6+
87

98
<!-- Page ------------------------------------------------------------------ -->
109
<div class="content-wrapper">
@@ -13,7 +12,7 @@
1312
require 'appEventsCore.php';
1413
?>
1514

16-
15+
1716
</div>
1817

1918
<?php

front/css/app.css

Lines changed: 186 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,7 @@ height: 50px;
10831083
.settingswrap
10841084
{
10851085
margin-bottom: 100px;
1086+
padding-top: 0px;
10861087
}
10871088

10881089
.settingswrap .metadata
@@ -1178,8 +1179,10 @@ height: 50px;
11781179
/* Settings */
11791180

11801181
#settingsPage .overview-setting-value{
1181-
display:unset;
1182-
1182+
display: block;
1183+
overflow: hidden;
1184+
text-overflow: ellipsis;
1185+
font-size: smaller;
11831186
}
11841187

11851188
.overview-setting-value-wrap
@@ -1228,7 +1231,7 @@ height: 50px;
12281231

12291232
}
12301233
#settingsPage .panel-heading:hover{
1231-
background-color: #272c30;
1234+
background-color: #e8e8e8;
12321235
}
12331236

12341237
.settings-expand-icon {
@@ -2256,7 +2259,7 @@ textarea[readonly],
22562259
----------------------------------------------------------------------------- */
22572260
#loadingSpinner {
22582261
position: fixed;
2259-
z-index: 1000;
2262+
z-index: 9999;
22602263
/* top: 0; */
22612264
/* left: 0; */
22622265
/* width: 100%; */
@@ -2265,7 +2268,6 @@ textarea[readonly],
22652268
transition: opacity 0.3s ease-in-out;
22662269
pointer-events: none;
22672270
display: block;
2268-
z-index: 800;
22692271
}
22702272

22712273
.fa-spinner
@@ -2587,4 +2589,182 @@ table.dataTable tbody > tr.selected
25872589
.input-group-addon.text-muted {
25882590
color: #8c8c8c;
25892591
background-color: rgba(140, 140, 140, 0.05);
2590-
}
2592+
}
2593+
2594+
/* ===== Loading Skeleton ===== */
2595+
2596+
/* Custom properties (overridden in dark-patch.css for Dark/System themes) */
2597+
:root {
2598+
--skel-base: #e2e2e2;
2599+
--skel-shine: #f0f0f0;
2600+
--skel-section: #d4d4d4;
2601+
--skel-panel-bg: #f5f5f5;
2602+
--skel-border: #ddd;
2603+
--skel-bg: #ecf0f5;
2604+
}
2605+
2606+
@keyframes settingsShimmer {
2607+
0% { background-position: -600px 0; }
2608+
100% { background-position: 600px 0; }
2609+
}
2610+
2611+
.skel-shimmer {
2612+
background: linear-gradient(
2613+
90deg,
2614+
var(--skel-base) 25%,
2615+
var(--skel-shine) 50%,
2616+
var(--skel-base) 75%
2617+
);
2618+
background-size: 600px 100%;
2619+
animation: settingsShimmer 1.5s infinite linear;
2620+
border-radius: 3px;
2621+
display: inline-block;
2622+
}
2623+
2624+
/* Positioning anchors */
2625+
#settingsPage, #devicesPage, #deviceDetailsPage,
2626+
#eventsPage, #presencePage, #reportPage, #notifications, #wf-content-wrapper, #pluginsPage,
2627+
#panDetails, #panSessions, #panPresence, #panEvents {
2628+
position: relative;
2629+
}
2630+
#panDetails, #panSessions, #panPresence, #panEvents { min-height: 420px; }
2631+
#tab_DBTools, #tab_BackupRestore, #tab_Logging, #tab_multiEdit { position: relative; min-height: 320px; }
2632+
2633+
/* Page-level overlay base */
2634+
#settings-skeleton, #devices-skeleton, #device-details-skeleton,
2635+
#events-skeleton, #presence-skeleton, #report-skeleton,
2636+
#notifications-skeleton, #workflows-skeleton, #plugins-skeleton, .skel-tab-pane {
2637+
position: absolute;
2638+
top: 0;
2639+
left: 0;
2640+
right: 0;
2641+
background-color: var(--skel-bg);
2642+
padding: 15px;
2643+
}
2644+
#settings-skeleton, #devices-skeleton, #device-details-skeleton,
2645+
#events-skeleton, #presence-skeleton, #report-skeleton,
2646+
#notifications-skeleton, #workflows-skeleton, #plugins-skeleton { z-index: 50; }
2647+
.skel-tab-pane { z-index: 10; min-height: 400px; }
2648+
#settings-skeleton { padding-top: 50px; padding-left: 20px; padding-right: 20px; min-height: 500px; }
2649+
#devices-skeleton { top: 50px; min-height: 500px; }
2650+
#device-details-skeleton { min-height: 600px; }
2651+
#events-skeleton { top: 50px; min-height: 500px; }
2652+
#presence-skeleton { top: 50px; min-height: 500px; }
2653+
#report-skeleton { min-height: 400px; }
2654+
#notifications-skeleton { min-height: 400px; }
2655+
#workflows-skeleton { top: 50px; width: 770px; margin: 0 auto; min-height: 300px; }
2656+
#plugins-skeleton { padding: 0; min-height: 400px; }
2657+
2658+
/* Bordered containers */
2659+
.skel-overview-panel, .skel-section, .skel-plugin-block,
2660+
.skel-chart-box, .skel-table-box,
2661+
.skel-detail-info-panel, .skel-detail-form, .skel-tabs-bar {
2662+
border: 1px solid var(--skel-border);
2663+
}
2664+
2665+
/* Clipped rounded containers */
2666+
.skel-overview-panel, .skel-section, .skel-plugin-block,
2667+
.skel-chart-box, .skel-table-box, .skel-tile {
2668+
border-radius: 4px;
2669+
overflow: hidden;
2670+
}
2671+
2672+
/* Section-toned backgrounds */
2673+
.skel-overview-heading, .skel-section-header, .skel-plugin-header,
2674+
.skel-box-header, .skel-table-header-row, .skel-tile, .skel-tabs-bar {
2675+
background: var(--skel-section);
2676+
}
2677+
2678+
/* Panel-toned backgrounds */
2679+
.skel-overview-body, .skel-overview-header, .skel-plugin-body,
2680+
.skel-detail-info-panel, .skel-detail-form {
2681+
background: var(--skel-panel-bg);
2682+
}
2683+
2684+
/* Flex rows with vertical centering */
2685+
.skel-overview-heading, .skel-overview-header, .skel-section-header, .skel-plugin-header,
2686+
.skel-box-header, .skel-table-header-row, .skel-setting-row, .skel-tr, .skel-form-row,
2687+
.skel-tile-icon-area {
2688+
display: flex;
2689+
align-items: center;
2690+
}
2691+
2692+
/* Standard header bar height + padding */
2693+
.skel-overview-heading, .skel-overview-header, .skel-section-header, .skel-box-header {
2694+
height: 44px;
2695+
padding: 0 15px;
2696+
}
2697+
2698+
/* Row separator borders */
2699+
.skel-setting-row, .skel-tr, .skel-form-row { border-bottom: 1px solid var(--skel-border); }
2700+
.skel-setting-row:last-child, .skel-tr:last-child, .skel-form-row:last-of-type { border-bottom: none; }
2701+
2702+
/* Standard data row spacing */
2703+
.skel-setting-row, .skel-tr { gap: 10px; padding: 11px 15px; }
2704+
2705+
/* Thin-line height (14px) */
2706+
.skel-line, .skel-cell-name, .skel-cell-desc, .skel-th, .skel-form-label { height: 14px; }
2707+
2708+
/* Non-growing primitives */
2709+
.skel-line, .skel-icon-block, .skel-cell-name, .skel-cell-desc, .skel-form-label { flex-shrink: 0; }
2710+
2711+
/* Filling cells (flex: 1) */
2712+
.skel-tile-inner, .skel-th, .skel-td, .skel-cell-input, .skel-form-input { flex: 1; }
2713+
2714+
/* ----- Settings --------------------------------------------------------- */
2715+
.skel-overview-panel { margin-bottom: 10px; }
2716+
.skel-overview-heading { gap: 12px; }
2717+
.skel-overview-body { padding: 12px; display: flex; gap: 12px; flex-wrap: wrap; }
2718+
.skel-overview-card { min-width: 100px; height: 76px; border-radius: 4px; }
2719+
.skel-section { margin-bottom: 8px; }
2720+
.skel-overview-header { gap: 14px; }
2721+
.skel-section-header { gap: 14px; }
2722+
.skel-plugin-block { margin: 8px; }
2723+
.skel-plugin-header { height: 48px; padding: 0 15px; gap: 14px; }
2724+
.skel-icon-block { width: 22px; height: 16px; }
2725+
.skel-cell-name { width: 20%; }
2726+
.skel-cell-desc { width: 36%; }
2727+
.skel-cell-input { height: 32px; }
2728+
2729+
/* ----- Devices ---------------------------------------------------------- */
2730+
.skel-tile { display: flex; height: 80px; }
2731+
.skel-tile-inner { display: flex; flex-direction: column; padding: 12px 15px; justify-content: center; gap: 10px; }
2732+
.skel-tile-num { height: 26px; width: 55%; }
2733+
.skel-tile-label { height: 13px; width: 75%; }
2734+
.skel-tile-icon-area { width: 70px; justify-content: center; background: var(--skel-base); opacity: 0.6; }
2735+
.skel-tile-icon-shape { width: 38px; height: 38px; border-radius: 50%; }
2736+
.skel-chart-box { margin-bottom: 12px; }
2737+
.skel-box-header { gap: 12px; border-bottom: 1px solid var(--skel-border); }
2738+
.skel-chart-body { height: 220px; border-radius: 0; display: block; width: 100%; }
2739+
.skel-table-header-row { gap: 10px; padding: 10px 15px; border-bottom: 2px solid var(--skel-border); }
2740+
.skel-td { height: 13px; }
2741+
2742+
/* ----- Device Details --------------------------------------------------- */
2743+
.skel-detail-header { margin-bottom: 15px; }
2744+
.skel-detail-title { height: 26px; width: 42%; margin-bottom: 14px; }
2745+
.skel-detail-info-panel { display: flex; gap: 0; padding: 14px; border-radius: 4px; margin-bottom: 15px; max-width: 400px; }
2746+
.skel-tabs-bar { display: flex; gap: 4px; padding: 8px 10px 0; border-radius: 4px 4px 0 0; border-bottom: none; }
2747+
.skel-tab { height: 34px; width: 100px; border-radius: 4px 4px 0 0; flex-shrink: 0; }
2748+
.skel-detail-form { border-top: none; border-radius: 0 0 4px 4px; padding: 20px 15px; }
2749+
.skel-form-row { gap: 15px; padding: 9px 0; }
2750+
.skel-form-label { width: 18%; min-width: 100px; }
2751+
.skel-form-input { height: 32px; }
2752+
.skel-form-footer { display: flex; justify-content: flex-end; gap: 10px; padding-top: 15px; }
2753+
.skel-form-btn { height: 34px; width: 100px; }
2754+
2755+
/* ----- Workflows -------------------------------------------------------- */
2756+
.skel-workflow-card { border: 1px solid var(--skel-border); border-radius: 4px; margin-bottom: 8px; overflow: hidden; }
2757+
.skel-workflow-header { display: flex; align-items: center; height: 48px; padding: 0 15px; background: var(--skel-section); }
2758+
2759+
/* ----- Plugins ---------------------------------------------------------- */
2760+
.skel-plugins-wrap { display: flex; gap: 0; min-height: 400px; }
2761+
.skel-plugins-nav { width: 165px; flex-shrink: 0; border-right: 1px solid var(--skel-border); padding: 8px 0; }
2762+
.skel-plugins-nav-item { display: flex; align-items: center; padding: 9px 15px; border-bottom: 1px solid var(--skel-border); }
2763+
.skel-plugins-nav-item:last-child { border-bottom: none; }
2764+
.skel-plugins-body { flex: 1; padding: 0; }
2765+
2766+
/* ----- Systeminfo tabs -------------------------------------------------- */
2767+
.skel-info-tab { padding: 15px; min-height: 360px; }
2768+
2769+
/* ===== /Loading Skeleton ===== */
2770+

front/css/dark-patch.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,9 @@ textarea[readonly],
516516
border: 1px solid #353c42;
517517
color: #bec5cb;
518518
}
519+
#settingsPage .panel-heading:hover {
520+
background-color: #272c30;
521+
}
519522
.box.box-solid.box-info,
520523
.box.box-solid.box-info > .box-header {
521524
color: #bec5cb;
@@ -754,4 +757,14 @@ table.dataTable tbody tr.selected, table.dataTable tbody tr .selected
754757
font-family: 'Courier New', monospace;
755758
font-size: .85em;
756759
cursor: pointer;
760+
}
761+
762+
/* Settings skeleton - dark theme */
763+
:root {
764+
--skel-base: #2e3540;
765+
--skel-shine: #3d4555;
766+
--skel-section: #252c38;
767+
--skel-panel-bg: #1e242e;
768+
--skel-border: #2a323e;
769+
--skel-bg: #353c42;
757770
}

front/css/system-dark-patch.css

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,9 @@
512512
border: 1px solid #353c42;
513513
color: #bec5cb;
514514
}
515+
#settingsPage .panel-heading:hover {
516+
background-color: #272c30;
517+
}
515518
.box.box-solid.box-info,
516519
.box.box-solid.box-info > .box-header {
517520
color: #bec5cb;
@@ -731,4 +734,14 @@
731734
font-family: 'Courier New', monospace;
732735
font-size: .85em;
733736
cursor: pointer;
734-
}
737+
}
738+
739+
/* Settings skeleton - dark theme */
740+
:root {
741+
--skel-base: #2e3540;
742+
--skel-shine: #3d4555;
743+
--skel-section: #252c38;
744+
--skel-panel-bg: #1e242e;
745+
--skel-border: #2a323e;
746+
--skel-bg: #353c42;
747+
}

front/deviceDetails.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121
</script>
2222

2323
<!-- Page ------------------------------------------------------------------ -->
24-
<div class="content-wrapper">
24+
<div class="content-wrapper" id="deviceDetailsPage">
25+
26+
<?php require 'php/templates/skel_device_details.php'; ?>
2527

2628
<!-- Content header--------------------------------------------------------- -->
2729
<section class="content-header">
28-
<?php require 'php/templates/modals.php'; ?>
2930

3031
<h1 id="pageTitle">
3132
&nbsp<small>Quering device info...</small>
@@ -597,7 +598,22 @@ function applyDevicePageTitle(mac, name, owner) {
597598
updateChevrons(mac);
598599
await renderSmallBoxes();
599600
main();
601+
hideDeviceDetailsSkeleton();
600602
});
603+
604+
// -----------------------------------------------------------------------------
605+
function hideDeviceDetailsSkeleton() {
606+
$('#device-details-skeleton').fadeOut(250, function() { $(this).remove(); });
607+
}
608+
609+
// Fallback: remove main skeleton and all tab pane skeletons if init stalls
610+
setTimeout(function() {
611+
hideDeviceDetailsSkeleton();
612+
if (typeof hideDetailsTabSkeleton === 'function') hideDetailsTabSkeleton();
613+
if (typeof hideSessionsTabSkeleton === 'function') hideSessionsTabSkeleton();
614+
if (typeof hidePresenceTabSkeleton === 'function') hidePresenceTabSkeleton();
615+
if (typeof hideEventsTabSkeleton === 'function') hideEventsTabSkeleton();
616+
}, 15000);
601617
}
602618

603619
</script>

front/deviceDetailsEdit.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// check if authenticated
44
require_once $_SERVER["DOCUMENT_ROOT"] . "/php/templates/security.php"; ?>
55

6+
<?php require $_SERVER['DOCUMENT_ROOT'] . '/php/templates/skel_tab_details.php'; ?>
67

78
<div class="row" id="deviceDetailsEdit">
89
<div class="box-body form-horizontal">
@@ -375,6 +376,7 @@ class="fa fa-circle-info pointer helpIconSmallTopRight"
375376
initHoverNodeInfo();
376377

377378
hideSpinner();
379+
hideDetailsTabSkeleton();
378380

379381
}}); // $.get callback
380382
}, 100); // setTimeout
@@ -665,4 +667,9 @@ function toggleFieldLock(mac, fieldName) {
665667
});
666668
}
667669

670+
// -----------------------------------------------------------------------------
671+
function hideDetailsTabSkeleton() {
672+
$('#skel-tab-details').fadeOut(250, function() { $(this).remove(); });
673+
}
674+
668675
</script>

0 commit comments

Comments
 (0)