Compare commits
No commits in common. "master" and "1.2-7.el8.sme" have entirely different histories.
master
...
1.2-7.el8.
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
*.rpm
|
||||
*.log
|
||||
*spec-20*
|
||||
*.tar.xz
|
||||
*.tar.gz
|
||||
|
@ -6,14 +6,7 @@ SMEServer Koozali developed git repo for smeserver-hwinfo smecontribs
|
||||
<br />https://wiki.koozali.org/
|
||||
|
||||
## Bugzilla
|
||||
Show list of outstanding bugs:
|
||||
[All](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=NEEDINFO&bug_status=IN_PROGRESS&bug_status=RESOLVED&bug_status=VERIFIED&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
[Confirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=CONFIRMED&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
[Unconfirmed](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=UNCONFIRMED&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
[Need Info](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=NEEDINFO&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
[In Progress](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=IN_PROGRESS&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
[Verified](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=VERIFIED&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
[Resolved](https://bugs.koozali.org/buglist.cgi?action=wrap&bug_status=RESOLVED&classification=Contribs&component=smeserver-hwinfo&list_id=105781&order=changeddate+DESC%2Ccomponent%2Cpriority%2Cbug_severity&product=SME+Contribs&query_format=advanced)
|
||||
Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-hwinfo&product=SME%20Contribs&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED)
|
||||
|
||||
## Description
|
||||
|
||||
|
@ -1,41 +0,0 @@
|
||||
package SrvMngr::Controller::Hwinfo;
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# heading : Investigation
|
||||
# description : Hardware Info
|
||||
# navigation : 4000 800
|
||||
#----------------------------------------------------------------------
|
||||
#----------------------------------------------------------------------
|
||||
# name : hwinfo, method : get, url : /hwinfo, ctlact : Hwinfo#main
|
||||
#
|
||||
# routes : end
|
||||
#----------------------------------------------------------------------
|
||||
use strict;
|
||||
use warnings;
|
||||
use Mojo::Base 'Mojolicious::Controller';
|
||||
use Locale::gettext;
|
||||
use SrvMngr::I18N;
|
||||
use SrvMngr qw(theme_list init_session);
|
||||
|
||||
#use SrvMngr::Model::Main;
|
||||
sub main {
|
||||
my $c = shift;
|
||||
$c->app->log->info($c->log_req);
|
||||
my $title = $c->l('hwinfo_panel');
|
||||
my $hwinfo_height = $c->param('height') || '600';
|
||||
my $hwinfo_full_html = qx(perl -T /etc/e-smith/web/functions/hwinfo);
|
||||
my ($hwinfo_html) = $hwinfo_full_html =~ m{<body[^>]*>(.*?)</body>}si;
|
||||
$hwinfo_html = '<head><link rel="stylesheet" href="css/hwinfo.css"></head>'.$hwinfo_html;
|
||||
$hwinfo_html =~ s/<div class="indented">|<\/div>//g;
|
||||
# Remove lines starting with the specified phrases
|
||||
$hwinfo_html =~ s/^( SME Server|<BR>Copyright \(c\)).*\n//gmi;
|
||||
|
||||
open(my $fh, '>', '/root/hwinfo.txt') or die $!;
|
||||
print $fh $hwinfo_html;
|
||||
close($fh);
|
||||
|
||||
$c->stash(title => $title, hwinfo => $hwinfo_html, height => $hwinfo_height);
|
||||
#die("$hwinfo_html");
|
||||
$c->render(template => 'hwinfo');
|
||||
} ## end sub main
|
||||
1;
|
@ -1,2 +0,0 @@
|
||||
'hwi_FUll_description' => 'Full description',
|
||||
'hwi_hwinfo' => 'Hardware Information'
|
@ -1,290 +0,0 @@
|
||||
/*
|
||||
* Koozali SME Server Table Styling
|
||||
*
|
||||
* This CSS makes both node and node-unclaimed tables look good with colors matching the Koozali SME Server interface.
|
||||
* Compatible with all modern browsers and IE9+.
|
||||
*/
|
||||
|
||||
/* Basic table styling for both node and node-unclaimed tables */
|
||||
table.node, table.node-unclaimed {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
margin: 20px 0;
|
||||
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
border: 1px solid #d5e5c0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;
|
||||
background-color: white;
|
||||
max-width: 700px;
|
||||
}
|
||||
|
||||
/* Table header styling */
|
||||
table.node thead, table.node-unclaimed thead {
|
||||
background-color: #e6f2d5;
|
||||
border-bottom: 1px solid #d5e5c0;
|
||||
}
|
||||
|
||||
/* Table header cells */
|
||||
table.node thead td, table.node-unclaimed thead td {
|
||||
padding: 12px 15px;
|
||||
font-weight: bold;
|
||||
color: #006600;
|
||||
}
|
||||
|
||||
/* Table data cells */
|
||||
table.node td, table.node-unclaimed td {
|
||||
padding: 10px 15px;
|
||||
border-bottom: 1px solid #e6f2d5;
|
||||
line-height: 1.4;
|
||||
word-wrap: break-word;
|
||||
-ms-word-break: break-word;
|
||||
word-break: break-word;
|
||||
-webkit-hyphens: auto;
|
||||
-ms-hyphens: auto;
|
||||
hyphens: auto;
|
||||
}
|
||||
|
||||
/* First column styling (labels) - Updated color as requested */
|
||||
table.node td.first, table.node-unclaimed td.first {
|
||||
width: 25%;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
background-color: #e8f3e1;
|
||||
}
|
||||
|
||||
/* Second column styling (values) */
|
||||
table.node td.second, table.node-unclaimed td.second {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
/* Zebra striping for better readability */
|
||||
table.node tbody tr:nth-child(even), table.node-unclaimed tbody tr:nth-child(even) {
|
||||
background-color: #fafdf7;
|
||||
}
|
||||
|
||||
/* Hover effect for rows */
|
||||
table.node tbody tr:hover, table.node-unclaimed tbody tr:hover {
|
||||
background-color: #edf5e2;
|
||||
}
|
||||
|
||||
/* Nested tables styling */
|
||||
table.node table, table.node-unclaimed table {
|
||||
width: 100%;
|
||||
border: none;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
table.node table td, table.node-unclaimed table td {
|
||||
padding: 4px 6px;
|
||||
border: none;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
/* ID styling */
|
||||
.id {
|
||||
font-family: monospace;
|
||||
background-color: #f5f9ef;
|
||||
padding: 2px 4px;
|
||||
border: 1px solid #d5e5c0;
|
||||
border-radius: 3px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Help styling for dfn elements */
|
||||
dfn {
|
||||
cursor: help;
|
||||
border-bottom: 1px dotted #006600;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Add some spacing between tables */
|
||||
table.node + table.node,
|
||||
table.node-unclaimed + table.node-unclaimed,
|
||||
table.node + table.node-unclaimed,
|
||||
table.node-unclaimed + table.node {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
/* Navigation container styling */
|
||||
.koozali-table-nav {
|
||||
position: -webkit-sticky;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
background-color: #e6f2d5;
|
||||
padding: 10px;
|
||||
margin-bottom: 20px;
|
||||
z-index: 100;
|
||||
border-bottom: 1px solid #d5e5c0;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-pack: justify;
|
||||
-ms-flex-pack: justify;
|
||||
justify-content: space-between;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
-webkit-box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
/* Dropdown styling */
|
||||
.koozali-table-select {
|
||||
padding: 8px;
|
||||
font-size: 16px;
|
||||
border: 1px solid #d5e5c0;
|
||||
border-radius: 4px;
|
||||
background-color: #f5f9ef;
|
||||
cursor: pointer;
|
||||
margin-right: 10px;
|
||||
color: #333;
|
||||
width: 70%;
|
||||
max-width: 500px;
|
||||
}
|
||||
|
||||
/* Button styling */
|
||||
.koozali-show-all-button {
|
||||
padding: 8px 12px;
|
||||
background-color: #006600;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.koozali-show-all-button:hover {
|
||||
background-color: #008800;
|
||||
}
|
||||
|
||||
/* Table visibility wrapper */
|
||||
.table-visibility-wrapper {
|
||||
margin-bottom: 30px;
|
||||
-webkit-transition: all 0.3s ease;
|
||||
-o-transition: all 0.3s ease;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
/* Hidden tables */
|
||||
.table-visibility-wrapper.hidden {
|
||||
display: none;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Visible tables */
|
||||
.table-visibility-wrapper.visible {
|
||||
display: block;
|
||||
height: auto;
|
||||
overflow: visible;
|
||||
-webkit-box-shadow: 0 0 10px rgba(0, 102, 0, 0.2);
|
||||
box-shadow: 0 0 10px rgba(0, 102, 0, 0.2);
|
||||
}
|
||||
|
||||
/* Fix for older browsers */
|
||||
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
|
||||
/* IE10+ specific styles */
|
||||
table.node td, table.node-unclaimed td {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
table.node td.first, table.node-unclaimed td.first {
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
.koozali-table-nav {
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure tables don't overflow on small screens */
|
||||
@media (max-width: 768px) {
|
||||
table.node, table.node-unclaimed {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
table.node td, table.node-unclaimed td {
|
||||
padding: 8px 10px;
|
||||
}
|
||||
|
||||
table.node td.first, table.node-unclaimed td.first {
|
||||
width: 35%;
|
||||
}
|
||||
|
||||
table.node td.second, table.node-unclaimed td.second {
|
||||
width: 65%;
|
||||
}
|
||||
|
||||
.koozali-table-select {
|
||||
width: 60%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Very small screens */
|
||||
@media (max-width: 480px) {
|
||||
table.node, table.node-unclaimed {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
table.node td, table.node-unclaimed td {
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
table.node td.first, table.node-unclaimed td.first {
|
||||
width: 40%;
|
||||
}
|
||||
|
||||
table.node td.second, table.node-unclaimed td.second {
|
||||
width: 60%;
|
||||
}
|
||||
|
||||
.koozali-table-nav {
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.koozali-table-select {
|
||||
width: 100%;
|
||||
margin-bottom: 10px;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Print styles */
|
||||
@media print {
|
||||
.koozali-table-nav {
|
||||
display: none;
|
||||
}
|
||||
|
||||
table.node, table.node-unclaimed {
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
border: 1px solid #999;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
table.node + table.node,
|
||||
table.node-unclaimed + table.node-unclaimed,
|
||||
table.node + table.node-unclaimed,
|
||||
table.node-unclaimed + table.node {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
table.node thead, table.node-unclaimed thead {
|
||||
background-color: #f5f9ef !important;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
|
||||
table.node td.first, table.node-unclaimed td.first {
|
||||
background-color: #e8f3e1 !important;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
}
|
@ -1,449 +0,0 @@
|
||||
/**
|
||||
* Koozali SME Server Table Fade Transitions
|
||||
*
|
||||
* This script creates smooth fade transitions between tables
|
||||
* with 1-2 second fade-in and fade-out effects.
|
||||
*
|
||||
* Works with the koozali_table_styles.css file.
|
||||
* Compatible with all modern browsers and IE9+.
|
||||
*
|
||||
* FIXED VERSION: Ensures table selector is always created at the top
|
||||
*/
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Find all tables with class 'node' or 'node-unclaimed'
|
||||
var tables = document.querySelectorAll('table.node, table.node-unclaimed');
|
||||
|
||||
if (!tables || tables.length === 0) {
|
||||
console.log('No tables found with class "node" or "node-unclaimed"');
|
||||
return;
|
||||
}
|
||||
|
||||
// Create container for the dropdown and controls
|
||||
var navContainer = document.createElement('div');
|
||||
navContainer.className = 'koozali-table-nav';
|
||||
|
||||
// Set styles with fallbacks for older browsers
|
||||
var navStyles = {
|
||||
'position': 'sticky',
|
||||
'top': '0',
|
||||
'background-color': '#e6f2d5',
|
||||
'padding': '10px',
|
||||
'margin-bottom': '20px',
|
||||
'z-index': '100',
|
||||
'border-bottom': '1px solid #d5e5c0',
|
||||
'display': 'flex',
|
||||
'justify-content': 'space-between',
|
||||
'align-items': 'center',
|
||||
'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
|
||||
'max-width': '680px'
|
||||
};
|
||||
|
||||
// Apply styles with vendor prefixes
|
||||
for (var prop in navStyles) {
|
||||
if (navStyles.hasOwnProperty(prop)) {
|
||||
navContainer.style.setProperty(prop, navStyles[prop]);
|
||||
|
||||
// Add vendor prefixes for key properties
|
||||
if (prop === 'position' && navStyles[prop] === 'sticky') {
|
||||
navContainer.style.setProperty('-webkit-position', 'sticky');
|
||||
navContainer.style.setProperty('-moz-position', 'sticky');
|
||||
navContainer.style.setProperty('-ms-position', 'sticky');
|
||||
}
|
||||
|
||||
if (prop === 'display' && navStyles[prop] === 'flex') {
|
||||
navContainer.style.setProperty('-webkit-display', 'flex');
|
||||
navContainer.style.setProperty('-moz-display', 'flex');
|
||||
navContainer.style.setProperty('-ms-display', 'flex');
|
||||
}
|
||||
|
||||
if (prop === 'justify-content') {
|
||||
navContainer.style.setProperty('-webkit-justify-content', navStyles[prop]);
|
||||
navContainer.style.setProperty('-moz-justify-content', navStyles[prop]);
|
||||
navContainer.style.setProperty('-ms-justify-content', navStyles[prop]);
|
||||
}
|
||||
|
||||
if (prop === 'align-items') {
|
||||
navContainer.style.setProperty('-webkit-align-items', navStyles[prop]);
|
||||
navContainer.style.setProperty('-moz-align-items', navStyles[prop]);
|
||||
navContainer.style.setProperty('-ms-align-items', navStyles[prop]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create the select element
|
||||
var select = document.createElement('select');
|
||||
select.className = 'koozali-table-select';
|
||||
|
||||
// Set select styles
|
||||
var selectStyles = {
|
||||
'padding': '8px',
|
||||
'font-size': '16px',
|
||||
'border': '1px solid #d5e5c0',
|
||||
'border-radius': '4px',
|
||||
'background-color': '#f5f9ef',
|
||||
'cursor': 'pointer',
|
||||
'margin-right': '10px',
|
||||
'color': '#333',
|
||||
'width': '500px',
|
||||
'max-width': '500px'
|
||||
};
|
||||
|
||||
// Apply select styles
|
||||
for (var prop in selectStyles) {
|
||||
if (selectStyles.hasOwnProperty(prop)) {
|
||||
select.style.setProperty(prop, selectStyles[prop]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add default option
|
||||
var defaultOption = document.createElement('option');
|
||||
defaultOption.value = '';
|
||||
defaultOption.textContent = '-- Select a table --';
|
||||
select.appendChild(defaultOption);
|
||||
|
||||
// Create "Show All" button
|
||||
var showAllButton = document.createElement('button');
|
||||
showAllButton.textContent = 'Show All Tables';
|
||||
showAllButton.className = 'koozali-show-all-button';
|
||||
|
||||
// Set button styles
|
||||
var buttonStyles = {
|
||||
'padding': '8px 12px',
|
||||
'background-color': '#006600',
|
||||
'color': 'white',
|
||||
'border': 'none',
|
||||
'border-radius': '4px',
|
||||
'cursor': 'pointer',
|
||||
'font-weight': 'bold',
|
||||
'box-shadow': '0 1px 3px rgba(0,0,0,0.1)'
|
||||
};
|
||||
|
||||
// Apply button styles
|
||||
for (var prop in buttonStyles) {
|
||||
if (buttonStyles.hasOwnProperty(prop)) {
|
||||
showAllButton.style.setProperty(prop, buttonStyles[prop]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add hover effect to button (with IE fallback)
|
||||
function setButtonHoverState(isHover) {
|
||||
showAllButton.style.backgroundColor = isHover ? '#008800' : '#006600';
|
||||
}
|
||||
|
||||
if (showAllButton.addEventListener) {
|
||||
showAllButton.addEventListener('mouseover', function() {
|
||||
setButtonHoverState(true);
|
||||
});
|
||||
showAllButton.addEventListener('mouseout', function() {
|
||||
setButtonHoverState(false);
|
||||
});
|
||||
} else if (showAllButton.attachEvent) {
|
||||
showAllButton.attachEvent('onmouseover', function() {
|
||||
setButtonHoverState(true);
|
||||
});
|
||||
showAllButton.attachEvent('onmouseout', function() {
|
||||
setButtonHoverState(false);
|
||||
});
|
||||
}
|
||||
|
||||
// Process each table and add to dropdown
|
||||
for (var i = 0; i < tables.length; i++) {
|
||||
var table = tables[i];
|
||||
|
||||
// Try to get table ID from the first row if it contains "id:"
|
||||
var tableId = 'table-' + i;
|
||||
var tableName = 'Table ' + (i + 1);
|
||||
|
||||
// Look for the ID in the table header
|
||||
var idCell = table.querySelector('thead td.first');
|
||||
var idValue = table.querySelector('thead td.second');
|
||||
|
||||
if (idCell && idValue && idCell.textContent.trim().toLowerCase() === 'id:') {
|
||||
// Get the ID value (might be in a div with class 'id')
|
||||
var idDiv = idValue.querySelector('.id');
|
||||
if (idDiv) {
|
||||
tableId = idDiv.textContent.trim();
|
||||
tableName = tableId;
|
||||
} else if (idValue.textContent.trim()) {
|
||||
tableId = idValue.textContent.trim();
|
||||
tableName = tableId;
|
||||
}
|
||||
}
|
||||
|
||||
// Try to get a better name from the description if available
|
||||
var descRows = table.querySelectorAll('tbody tr');
|
||||
for (var j = 0; j < descRows.length; j++) {
|
||||
var descRow = descRows[j];
|
||||
var descCell = descRow.querySelector('td.first');
|
||||
var descValue = descRow.querySelector('td.second');
|
||||
|
||||
if (descCell && descValue &&
|
||||
descCell.textContent.trim().toLowerCase().includes('description') &&
|
||||
descValue.textContent.trim()) {
|
||||
tableName = descValue.textContent.trim() + ' (' + tableName + ')';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Create a unique ID for the table if it doesn't have one
|
||||
if (!table.id) {
|
||||
// Clean the ID to make it valid for HTML
|
||||
var safeId = tableId.replace(/[^a-z0-9]/gi, '_').toLowerCase();
|
||||
table.id = safeId;
|
||||
}
|
||||
|
||||
// Add option to dropdown
|
||||
var option = document.createElement('option');
|
||||
option.value = table.id;
|
||||
option.textContent = tableName;
|
||||
select.appendChild(option);
|
||||
|
||||
// Add wrapper div around the table for visibility control
|
||||
var wrapper = document.createElement('div');
|
||||
wrapper.className = 'table-visibility-wrapper';
|
||||
wrapper.id = 'wrapper-' + table.id;
|
||||
|
||||
// Set transition duration for fade effects
|
||||
wrapper.style.transition = 'opacity 1.5s ease, height 1.5s ease';
|
||||
wrapper.style.WebkitTransition = 'opacity 1.5s ease, height 1.5s ease';
|
||||
wrapper.style.MozTransition = 'opacity 1.5s ease, height 1.5s ease';
|
||||
wrapper.style.OTransition = 'opacity 1.5s ease, height 1.5s ease';
|
||||
wrapper.style.msTransition = 'opacity 1.5s ease, height 1.5s ease';
|
||||
|
||||
// Move the table into the wrapper
|
||||
table.parentNode.insertBefore(wrapper, table);
|
||||
wrapper.appendChild(table);
|
||||
|
||||
// Set initial state - only first table visible
|
||||
if (i === 0) {
|
||||
// First table is visible
|
||||
wrapper.style.opacity = '1';
|
||||
wrapper.style.display = 'block';
|
||||
wrapper.style.height = 'auto';
|
||||
wrapper.style.overflow = 'visible';
|
||||
} else {
|
||||
// Other tables are hidden
|
||||
wrapper.style.opacity = '0';
|
||||
wrapper.style.display = 'none';
|
||||
wrapper.style.height = '0';
|
||||
wrapper.style.overflow = 'hidden';
|
||||
}
|
||||
}
|
||||
|
||||
// Add the select and button to the container
|
||||
navContainer.appendChild(select);
|
||||
navContainer.appendChild(showAllButton);
|
||||
|
||||
// Insert the container at the top of the body or after the first heading
|
||||
var heading = document.querySelector('h1, h2');
|
||||
if (heading && heading.parentNode) {
|
||||
heading.parentNode.insertBefore(navContainer, heading.nextSibling);
|
||||
} else {
|
||||
// If no heading found, insert at the beginning of the main content area or body
|
||||
var mainContent = document.querySelector('.main-content, main, #content, #main');
|
||||
if (mainContent) {
|
||||
if (mainContent.firstChild) {
|
||||
mainContent.insertBefore(navContainer, mainContent.firstChild);
|
||||
} else {
|
||||
mainContent.appendChild(navContainer);
|
||||
}
|
||||
} else {
|
||||
// Last resort: insert at the beginning of the body
|
||||
var body = document.body;
|
||||
if (body.firstChild) {
|
||||
body.insertBefore(navContainer, body.firstChild);
|
||||
} else {
|
||||
body.appendChild(navContainer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle dropdown change with fade transitions
|
||||
select.addEventListener('change', function() {
|
||||
var selectedId = this.value;
|
||||
|
||||
// First fade out all tables
|
||||
fadeOutAllTables(function() {
|
||||
// Then show only the selected table or all tables if none selected
|
||||
var wrappers = document.querySelectorAll('.table-visibility-wrapper');
|
||||
for (var i = 0; i < wrappers.length; i++) {
|
||||
var wrapper = wrappers[i];
|
||||
|
||||
if (!selectedId || wrapper.id === 'wrapper-' + selectedId) {
|
||||
// Show and fade in this table
|
||||
fadeInTable(wrapper);
|
||||
} else {
|
||||
// Keep this table hidden
|
||||
wrapper.style.opacity = '0';
|
||||
wrapper.style.display = 'none';
|
||||
wrapper.style.height = '0';
|
||||
wrapper.style.overflow = 'hidden';
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Handle show all button with fade transitions
|
||||
showAllButton.addEventListener('click', function() {
|
||||
// First fade out all tables
|
||||
fadeOutAllTables(function() {
|
||||
// Then fade in all tables
|
||||
var wrappers = document.querySelectorAll('.table-visibility-wrapper');
|
||||
for (var i = 0; i < wrappers.length; i++) {
|
||||
fadeInTable(wrappers[i]);
|
||||
}
|
||||
|
||||
// Reset the dropdown selection
|
||||
select.value = '';
|
||||
});
|
||||
});
|
||||
|
||||
// Function to fade out all tables and then execute a callback
|
||||
function fadeOutAllTables(callback) {
|
||||
var wrappers = document.querySelectorAll('.table-visibility-wrapper');
|
||||
var visibleTables = 0;
|
||||
var completedFades = 0;
|
||||
|
||||
// Count visible tables
|
||||
for (var i = 0; i < wrappers.length; i++) {
|
||||
if (getComputedStyle(wrappers[i]).display !== 'none') {
|
||||
visibleTables++;
|
||||
}
|
||||
}
|
||||
|
||||
// If no tables are visible, just run the callback
|
||||
if (visibleTables === 0) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
// Fade out each visible table
|
||||
for (var i = 0; i < wrappers.length; i++) {
|
||||
var wrapper = wrappers[i];
|
||||
|
||||
if (getComputedStyle(wrapper).display !== 'none') {
|
||||
// Start fade out
|
||||
wrapper.style.opacity = '0';
|
||||
|
||||
// Use a closure to capture the current wrapper
|
||||
(function(currentWrapper) {
|
||||
// Set a timeout for when the fade completes
|
||||
var fadeTimer = setTimeout(function() {
|
||||
currentWrapper.style.display = 'none';
|
||||
currentWrapper.style.height = '0';
|
||||
currentWrapper.style.overflow = 'hidden';
|
||||
|
||||
// Increment completed fades counter
|
||||
completedFades++;
|
||||
|
||||
// If all visible tables have faded out, run the callback
|
||||
if (completedFades >= visibleTables) {
|
||||
callback();
|
||||
}
|
||||
}, 1500); // Match the CSS transition duration
|
||||
|
||||
// Store the timer on the element to allow cancellation if needed
|
||||
currentWrapper._fadeTimer = fadeTimer;
|
||||
})(wrapper);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Function to fade in a table
|
||||
function fadeInTable(wrapper) {
|
||||
// Cancel any pending fade out timer
|
||||
if (wrapper._fadeTimer) {
|
||||
clearTimeout(wrapper._fadeTimer);
|
||||
wrapper._fadeTimer = null;
|
||||
}
|
||||
|
||||
// First make it visible but transparent
|
||||
wrapper.style.opacity = '0';
|
||||
wrapper.style.display = 'block';
|
||||
wrapper.style.height = 'auto';
|
||||
wrapper.style.overflow = 'visible';
|
||||
|
||||
// Force a reflow to ensure the browser registers the display change
|
||||
void wrapper.offsetWidth;
|
||||
|
||||
// Then fade it in
|
||||
setTimeout(function() {
|
||||
wrapper.style.opacity = '1';
|
||||
}, 50); // Small delay to ensure the browser has processed the display change
|
||||
}
|
||||
|
||||
// Handle browser compatibility for older browsers
|
||||
function isBrowserIE() {
|
||||
return navigator.userAgent.indexOf('MSIE') !== -1 ||
|
||||
navigator.userAgent.indexOf('Trident/') !== -1;
|
||||
}
|
||||
|
||||
// Apply special handling for IE
|
||||
if (isBrowserIE()) {
|
||||
// For IE, use a step-based fade
|
||||
fadeOutAllTables = function(callback) {
|
||||
var wrappers = document.querySelectorAll('.table-visibility-wrapper');
|
||||
var visibleTables = 0;
|
||||
var completedFades = 0;
|
||||
|
||||
// Count visible tables
|
||||
for (var i = 0; i < wrappers.length; i++) {
|
||||
if (wrappers[i].style.display !== 'none') {
|
||||
visibleTables++;
|
||||
}
|
||||
}
|
||||
|
||||
if (visibleTables === 0) {
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
// For IE, use a step-based fade
|
||||
for (var i = 0; i < wrappers.length; i++) {
|
||||
var wrapper = wrappers[i];
|
||||
|
||||
if (wrapper.style.display !== 'none') {
|
||||
(function(currentWrapper) {
|
||||
var opacity = 1;
|
||||
var fadeInterval = setInterval(function() {
|
||||
opacity -= 0.1;
|
||||
if (opacity <= 0) {
|
||||
clearInterval(fadeInterval);
|
||||
currentWrapper.style.opacity = '0';
|
||||
currentWrapper.style.display = 'none';
|
||||
currentWrapper.style.height = '0';
|
||||
currentWrapper.style.overflow = 'hidden';
|
||||
|
||||
completedFades++;
|
||||
if (completedFades >= visibleTables) {
|
||||
callback();
|
||||
}
|
||||
} else {
|
||||
currentWrapper.style.opacity = opacity.toString();
|
||||
}
|
||||
}, 150); // 10 steps over 1.5 seconds
|
||||
})(wrapper);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
fadeInTable = function(wrapper) {
|
||||
wrapper.style.opacity = '0';
|
||||
wrapper.style.display = 'block';
|
||||
wrapper.style.height = 'auto';
|
||||
wrapper.style.overflow = 'visible';
|
||||
|
||||
var opacity = 0;
|
||||
var fadeInterval = setInterval(function() {
|
||||
opacity += 0.1;
|
||||
if (opacity >= 1) {
|
||||
clearInterval(fadeInterval);
|
||||
wrapper.style.opacity = '1';
|
||||
} else {
|
||||
wrapper.style.opacity = opacity.toString();
|
||||
}
|
||||
}, 150); // 10 steps over 1.5 seconds
|
||||
};
|
||||
}
|
||||
});
|
@ -1,25 +0,0 @@
|
||||
% layout 'default', title => "Sme server 2 - Disk usage";
|
||||
|
||||
% content_for 'module' => begin
|
||||
|
||||
%= javascript 'js/hwinfo.js'
|
||||
|
||||
<div id='Hwinfo' class='module hwinfo-panel'>
|
||||
% if (config->{debug} == 1) {
|
||||
<pre>
|
||||
%= dumper $c->current_route
|
||||
%= dumper $c->stash('hwinfo')
|
||||
</pre>
|
||||
% }
|
||||
% if ( stash 'error' ) {
|
||||
<br><div class=sme-error>
|
||||
%= $c->render_to_string(inline => stash 'error')
|
||||
</div>
|
||||
%}
|
||||
<!--<h1>Legacy-<%#=l('hwi_hwinfo') %></h1><br>-->
|
||||
% my $height = $c->stash('height') | '600';
|
||||
% if ($height !~ /px$/) { $height = $height.'px';}
|
||||
%== $c->stash('hwinfo');
|
||||
</div>
|
||||
|
||||
%end
|
Binary file not shown.
@ -3,8 +3,8 @@
|
||||
# Name: Jean-Paul Leclère
|
||||
|
||||
%define name smeserver-hwinfo
|
||||
%define version 11.0.0
|
||||
%define release 3
|
||||
%define version 1.2
|
||||
%define release 7
|
||||
|
||||
Summary: Harware info panel for SME Server.
|
||||
Name: %{name}
|
||||
@ -25,15 +25,6 @@ AutoReqProv: no
|
||||
smeserver-hwinfo adds panel providing informations about server harware configuration
|
||||
|
||||
%changelog
|
||||
* Tue Apr 22 2025 Brian Read <brianr@koozali.org> 11.0.0-3.sme
|
||||
- Make the table navigation access a bit more interesting.
|
||||
|
||||
* Tue Apr 22 2025 Brian Read <brianr@koozali.org> 11.0.0-2.sme
|
||||
- Add some styling to the hardware information and quick navigation
|
||||
|
||||
* Tue Apr 22 2025 Brian Read <brianr@koozali.org> 11.0.0.0-1.sme
|
||||
- Add in SM2 code, calling the FM (SM1) code without conversion
|
||||
|
||||
* Sun Sep 08 2024 fix-e-smith-pkg.sh by Trevor Batley <trevor@batley.id.au> 1.2-7.sme
|
||||
- Fix e-smith references in smeserver-hwinfo [SME: 12732]
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user