Skip to content
Snippets Groups Projects
dashboard.js 8.11 KiB
Newer Older
TEST's avatar
TEST committed
// GLOBAL JS FUNCTIONS
Tony Bonnin's avatar
Tony Bonnin committed
$(function() {
	$(":input:not(input[type=button],input[type=submit],button):enabled:not([readonly]):visible:first").focus();
// Add tablesorter-ice class to .tablesorter objects
	$(".tablesorter").addClass("tablesorter-ice");
	});			
// Toggle functions
function toggleMenu() {
    const isActive = $("#nav").hasClass("active");
    $("#nav, #toggle, #toggle-menu").toggleClass("active not_active"); 
    if (isActive) {
        $("#nav").hide();
        $("#content, #subnav").css("width", "100%");
    } else {
        $("#nav").slideDown(900);
        $("#content, #subnav").css("width", "80%");
    }
    window.localStorage.setItem('nav', isActive ? 'not_active' : 'active');
}
function toggleDegree() {
    const isCelsius = window.localStorage.getItem('toggle-degree') === 'celsius';
    const temps = isCelsius ? ["122°<sup>F</sup>", "167°<sup>F</sup>"] : ["50°<sup>C</sup>", "75°<sup>C</sup>"];
    $("#temp-cap-normal, #temp-cap-medium").html(temps[0]);
    $("#temp-cap-hot").html(temps[1]);
    window.localStorage.setItem('toggle-degree', isCelsius ? 'fahrenheit' : 'celsius');
}
function toggleTheme() {
    const isLightTheme = $("html").toggleClass("light-theme dark-theme").hasClass("light-theme");
    window.localStorage.setItem('html', isLightTheme ? 'light-theme' : 'dark-theme');
}
// Show Password Toggle Functionality
Tony Bonnin's avatar
Tony Bonnin committed
	if (location.href.includes("logon/logon")) {
		const setAttrs = (el, ph) => el.attr({
		required: true,
		placeholder: ph,
		style: "font-family: system-ui, 'Font Awesome 6 Free'; font-weight: 600"
		});
		setAttrs($('#userid input'), '\uf007    User ID');
		setAttrs($('#password input'), '\uf023    Password').attr('autocomplete', 'current-password');
		$('#login').attr('autocomplete', 'on');
		$('.hidden').attr('hidden', true);
		$("#password .right").append("<button id='showPass' type='button'><i class='fa-regular fa-eye-slash'></i></button>");
		$("#showPass").on('click', function() {
		const field = $('#password input');
		const isPassword = field.attr('type') === 'password';
		field.attr('type', isPassword ? 'text' : 'password');
		$(this).toggleClass('corporate');
		$("#showPass i").toggleClass('fa-eye fa-eye-slash');
	})};		
Tony Bonnin's avatar
Tony Bonnin committed
//Wait DOM
Tony Bonnin's avatar
Tony Bonnin committed
$(document).ready(function() {	
Tony Bonnin's avatar
Tony Bonnin committed
// Inactivity Logoff & Warning
Tony Bonnin's avatar
Tony Bonnin committed
$(function() {
Tony Bonnin's avatar
Tony Bonnin committed
    if (!window.location.href.includes("logon")) {
        let logoutTimer, warningTimer;
        const events = 'load mousemove mousedown touchstart click keydown scroll';
        function resetTimer() {
            clearTimeout(logoutTimer);
            clearTimeout(warningTimer);
            $('#warningToast').remove();
            warningTimer = setTimeout(showWarning, 300000); // 5 minutes
            logoutTimer = setTimeout(logout, 600000);  // 10 minutes
        }
        function logout() {
            window.location.href = `//${window.location.hostname}/cgi-bin/acf/acf-util/logon/logoff`;
Tony Bonnin's avatar
Tony Bonnin committed
        function showWarning() {
Tony Bonnin's avatar
Tony Bonnin committed
            $('body').append(`<div id="warningToast">⚠️ &nbsp;&nbsp;Log out in 5 minutes due to your inactivity!</div>`);
Tony Bonnin's avatar
Tony Bonnin committed
        }
        $(document).on(events, resetTimer);
        resetTimer();
Tony Bonnin's avatar
Tony Bonnin committed
});
Tony Bonnin's avatar
Tony Bonnin committed
// Assign Toggles
$(function() {
    function setClassAndProp(selector, className, prop, value) {
Tony Bonnin's avatar
Tony Bonnin committed
		$(selector).toggleClass(className);
		if (prop !== null) $(selector).prop(prop, value);
Tony Bonnin's avatar
Tony Bonnin committed
    }
    let menuState = window.localStorage.getItem('nav') || 'active';
    setClassAndProp("#nav", menuState, null, null);
    setClassAndProp("#toggle-menu", menuState, null, null);
    const menuWidth = menuState === 'active' ? '80%' : '100%';
    $("#nav").css('display', menuState === 'active' ? 'block' : 'none');
    $("#content, #subnav").css('width', menuWidth);
    let themeState = window.localStorage.getItem('html') || 'light-theme';
    $("html").toggleClass(themeState);
    const isLightTheme = themeState === 'light-theme';
    $("#toggle-theme").prop("checked", !isLightTheme);
    let degreeState = window.localStorage.getItem('toggle-degree') || 'celsius';
    const isCelsius = degreeState === 'celsius';
    $("#toggle-degree").prop("checked", !isCelsius);
    const degreeLabels = isCelsius ? ["50°<sup>C</sup>", "75°<sup>C</sup>"] : ["122°<sup>F</sup>", "167°<sup>F</sup>"];
    $("#temp-cap-normal, #temp-cap-medium").html(degreeLabels[0]);
    $("#temp-cap-hot").html(degreeLabels[1]);
    // Save states if not set initially
    if (!window.localStorage.getItem('nav')) {
        window.localStorage.setItem('nav', menuState);
    }
    if (!window.localStorage.getItem('html')) {
        window.localStorage.setItem('html', themeState);
    }
    if (!window.localStorage.getItem('toggle-degree')) {
        window.localStorage.setItem('toggle-degree', degreeState);
    }
});
// ChartJS API		
Tony Bonnin's avatar
Tony Bonnin committed
	if(window.location.href.indexOf("/acf/acf-util/welcome/read") > -1){			
Tony Bonnin's avatar
Tony Bonnin committed
	$(function() {async function api() {
		const url = `${document.location.hostname}/alpine-baselayout/health/api?viewtype=json`;
		const obj = await (await fetch(url)).json();
		const $cpuTemp = $("#cpuTemp");
		const toggleDegree = localStorage.getItem('toggle-degree');
		const boardTempC = Math.ceil(obj.value.boardTemp.value / 1000);
		const cpuTempC = Math.floor(obj.value.cpuTemp.value / 1000);
		const tempClass = cpuTempC < 50 ? 'normal' : cpuTempC >= 75 ? 'hot' : 'medium';
		const boardTemp = toggleDegree === 'fahrenheit' ? Math.ceil(boardTempC * 9 / 5 + 32) : boardTempC;
		const cpuTemp = toggleDegree === 'fahrenheit' ? Math.floor(cpuTempC * 9 / 5 + 32) : cpuTempC;
		const unit = toggleDegree === 'fahrenheit' ? '°F' : '°C';
		$cpuTemp.html(`${boardTemp} ${unit}  &nbsp; | <span class='${tempClass}'>${cpuTemp} ${unit}</span>`);
		localStorage.setItem('CTemp', cpuTempC);
		localStorage.setItem('MemoryUse', obj.value.memUsed);
		localStorage.setItem('MemoryTotal', obj.value.memTotal);
	}
Tony Bonnin's avatar
Tony Bonnin committed
// Common chart setup
Tony Bonnin's avatar
Tony Bonnin committed
  function createChart(elementId, label, borderColor, backgroundColor, dataKey, yMinDelta, yMax, yStepSize) {
Tony Bonnin's avatar
Tony Bonnin committed
    const data = {
Tony Bonnin's avatar
Tony Bonnin committed
    labels: [],
    datasets: [{
	label: label,
	borderColor: borderColor,
	backgroundColor: backgroundColor,
	data: [],
	tension: 0.25,
	fill: true,
	pointRadius: 0
Tony Bonnin's avatar
Tony Bonnin committed
      }],
    };
    const config = {
      type: 'line',
      data,
      options: {
        scales: {
          x: {
            type: 'realtime',
            realtime: {
              duration: 30000,
              refresh: 1000,
              delay: 0,
              onRefresh: chart => {
                const newValue = Number(localStorage.getItem(dataKey));
                chart.data.datasets.forEach(dataset => {
                  dataset.data.push({
                    x: Date.now(),
                    y: newValue
                  });
                });
Tony Bonnin's avatar
Tony Bonnin committed
                // For CPU, adjust suggested min/max based on current value
                if (dataKey === 'CTemp') {
                  chart.options.scales.y.suggestedMin = newValue - yMinDelta;
                  chart.options.scales.y.suggestedMax = newValue + yMinDelta;
                }
Tony Bonnin's avatar
Tony Bonnin committed
              }
            }
          },
          y: {
Tony Bonnin's avatar
Tony Bonnin committed
            suggestedMin: 0,
            suggestedMax: yMax, // Correctly setting suggested max for memory
Tony Bonnin's avatar
Tony Bonnin committed
            ticks: {
Tony Bonnin's avatar
Tony Bonnin committed
              stepSize: yStepSize // Ensure this is set appropriately
Tony Bonnin's avatar
Tony Bonnin committed
            }
          }
        },
        plugins: {
          legend: {
            display: false
          }
        }
      }
    };
    new Chart(document.getElementById(elementId), config);
  }
Tony Bonnin's avatar
Tony Bonnin committed
  // Create CPU Temperature Chart
Tony Bonnin's avatar
Tony Bonnin committed
  createChart(
    'chartCpuTemp',
    'CPU Temp',
    'rgba(255, 105, 180)',
    'rgba(255, 105, 180, 0.5)',
    'CTemp',
Tony Bonnin's avatar
Tony Bonnin committed
    1,  // Min delta for CPU temperature
    null, // CPU chart does not use a fixed max
    1   // Step Size
Tony Bonnin's avatar
Tony Bonnin committed
  );
Tony Bonnin's avatar
Tony Bonnin committed

  // Create Memory Usage Chart
  const memoryTotal = Math.floor(Number(localStorage.getItem('MemoryTotal')));
  const memoryStepSize = Math.max(1, Math.ceil(memoryTotal / 4)); // Ensure at least 1 and is an integer
Tony Bonnin's avatar
Tony Bonnin committed
  createChart(
    'chartMemUsed',
    'Memory Usage',
    'rgba(255, 120, 0)',
    'rgba(255, 120, 0, 0.5)',
    'MemoryUse',
Tony Bonnin's avatar
Tony Bonnin committed
    0,  // Min delta (not used for memory)
    memoryTotal, // Use memory total from localStorage
    memoryStepSize // Integer Step Size
Tony Bonnin's avatar
Tony Bonnin committed
  );
refresh = setInterval(api, 1000);
Tony Bonnin's avatar
Tony Bonnin committed
		});
	};
});