const logConsole = document.getElementById('log-console'); const mainToolbar = document.querySelector('.toolbar'); const toggleButton = document.getElementById('toggle-toolbar'); let fontSize = 16; // size for desktop const maxLines = 2000; // Number of lines to keep in the console const fileColors = new Map(); const levelClasses = { "DEBUG": "debug", "INFO": "info", "WARNING": "warning", "ERROR": "error", "CRITICAL": "critical", "SUCCESS": "success" }; // Adjust font size based on device type if (/Mobi|Android/i.test(navigator.userAgent)) { fontSize = 7; // size for mobile } logConsole.style.fontSize = fontSize + 'px'; function getRandomColor() { const letters = '89ABCDEF'; // Using only hex value for lighter colors let color = '#'; for (let i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * letters.length)]; } return color; } let logInterval; let isConsoleOn = false; function fetchLogs() { fetch('/get_logs') .then(response => response.text()) .then(data => { const lines = data.split('\n'); const newContent = []; lines.forEach(line => { let modifiedLine = line; const regexFile = /(\w+\.py)/g; let matchFile; while ((matchFile = regexFile.exec(line)) !== null) { const fileName = matchFile[1]; if (line.includes('==>') || line.includes('<==')) return; if (!fileColors.has(fileName)) { fileColors.set(fileName, getRandomColor()); } modifiedLine = modifiedLine.replace(fileName, `${fileName}`); } const regexLevel = /\b(DEBUG|INFO|WARNING|ERROR|CRITICAL|SUCCESS)\b/g; modifiedLine = modifiedLine.replace(regexLevel, (match) => { return `${match}`; }); const regexLineNumber = /^\d+/; modifiedLine = modifiedLine.replace(regexLineNumber, (match) => { return `${match}`; }); const regexNumbers = /\b\d+\b/g; modifiedLine = modifiedLine.replace(regexNumbers, (match) => { return `${match}`; }); newContent.push(modifiedLine); }); logConsole.innerHTML += newContent.join('
') + '
'; let allLines = logConsole.innerHTML.split('
'); if (allLines.length > maxLines) { allLines = allLines.slice(allLines.length - maxLines); logConsole.innerHTML = allLines.join('
'); } logConsole.scrollTop = logConsole.scrollHeight; }) .catch(error => console.error('Error fetching logs:', error)); } // setInterval(fetchLogs, 1500); / function startConsole() { // Start fetching logs every 1.5 seconds logInterval = setInterval(fetchLogs, 1500); // Fetch logs every 1.5 seconds } function stopConsole() { clearInterval(logInterval); } function toggleConsole() { const toggleImage = document.getElementById('toggle-console-image'); if (isConsoleOn) { stopConsole(); toggleImage.src = '/web/images/off.png'; } else { startConsole(); toggleImage.src = '/web/images/on.png'; } isConsoleOn = !isConsoleOn; } function adjustFontSize(change) { fontSize += change; logConsole.style.fontSize = fontSize + 'px'; } document.addEventListener('DOMContentLoaded', () => { const mainToolbar = document.getElementById('mainToolbar'); const toggleButton = document.getElementById('toggle-toolbar'); const toggleIcon = document.getElementById('toggle-icon'); toggleButton.addEventListener('click', toggleToolbar); function toggleToolbar() { const isOpen = toggleButton.getAttribute('data-open') === 'true'; if (isOpen) { mainToolbar.classList.add('hidden'); toggleIcon.src = '/web/images/reveal.png'; toggleButton.setAttribute('data-open', 'false'); } else { mainToolbar.classList.remove('hidden'); toggleIcon.src = '/web/images/hide.png'; toggleButton.setAttribute('data-open', 'true'); } toggleConsoleSize(); } function toggleConsoleSize() { //Function to adjust the size of the console based on the toolbar visibility } }); function loadDropdown() { const dropdownContent = ` `; document.getElementById('dropdown-container').innerHTML = dropdownContent; } function loadBjornDropdown() { const bjornDropdownContent = ` `; document.getElementById('bjorn-dropdown-container').innerHTML = bjornDropdownContent; startLiveview(); // Start live view when Bjorn dropdown is loaded } // Call the function to load the dropdowns when the DOM is loaded document.addEventListener('DOMContentLoaded', () => { loadDropdown(); loadBjornDropdown(); }); function clear_files() { fetch('/clear_files', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to clear files: ' + error.message)); } function clear_files_light() { fetch('/clear_files_light', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to clear files: ' + error.message)); } function reboot_system() { fetch('/reboot', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to reboot: ' + error.message)); } function shutdown_system() { fetch('/shutdown', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to shutdown: ' + error.message)); } function restart_bjorn_service() { fetch('/restart_bjorn_service', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to restart service: ' + error.message)); } function backup_data() { fetch('/backup', { method: 'POST' }) .then(response => response.json()) .then(data => { if (data.status === 'success') { const link = document.createElement('a'); link.href = data.url; link.download = data.filename; link.click(); alert('Backup completed successfully'); } else { alert('Backup failed: ' + data.message); } }) .catch(error => alert('Backup failed: ' + error.message)); } function restore_data() { const input = document.createElement('input'); input.type = 'file'; input.accept = '.zip'; input.onchange = () => { const file = input.files[0]; const formData = new FormData(); formData.append('file', file); fetch('/restore', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Restore failed: ' + error.message)); }; input.click(); } function stop_orchestrator() { fetch('/stop_orchestrator', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to stop orchestrator: ' + error.message)); } function start_orchestrator() { fetch('/start_orchestrator', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to start orchestrator: ' + error.message)); } function disconnect_wifi() { fetch('/disconnect_wifi', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to disconnect: ' + error.message)); } function initialize_csv() { fetch('/initialize_csv', { method: 'POST' }) .then(response => response.json()) .then(data => alert(data.message)) .catch(error => alert('Failed to initialize CSV: ' + error.message)); } // Dropdown toggle logic function toggleDropdown() { const dropdown = document.querySelector('.dropdown'); const button = document.querySelector('.action-button'); const isOpen = button.getAttribute('data-open') === 'true'; if (isOpen) { dropdown.classList.remove('show'); button.setAttribute('data-open', 'false'); } else { dropdown.classList.add('show'); button.setAttribute('data-open', 'true'); } } function closeDropdownIfOpen(event) { const dropdown = document.querySelector('.dropdown'); const button = document.querySelector('.action-button'); const isOpen = button.getAttribute('data-open') === 'true'; if (!event.target.closest('.dropdown') && isOpen) { dropdown.classList.remove('show'); button.setAttribute('data-open', 'false'); } } // actions.js let imageIntervalId; let intervalId; const delay = 2000 // Adjust this value to match your delay let lastUpdate = 0; function updateImage() { const now = Date.now(); if (now - lastUpdate >= delay) { lastUpdate = now; const image = document.getElementById("screenImage_Home"); const newImage = new Image(); newImage.onload = function() { image.src = newImage.src; // Update only if the new image loads successfully }; newImage.onerror = function() { console.warn("New image could not be loaded, keeping the previous image."); }; newImage.src = "screen.png?t=" + new Date().getTime(); // Prevent caching } } function startLiveview() { updateImage(); // Immediately update the image intervalId = setInterval(updateImage, delay); // Then update at the specified interval } function stopLiveview() { clearInterval(intervalId); } // Dropdown toggle logic for Bjorn function toggleBjornDropdown() { const dropdown = document.querySelector('.bjorn-dropdown'); const button = document.querySelector('.bjorn-button'); const isOpen = button.getAttribute('data-open') === 'true'; if (isOpen) { dropdown.classList.remove('show'); button.setAttribute('data-open', 'false'); stopLiveview(); // Stop image refresh when closing } else { dropdown.classList.add('show'); button.setAttribute('data-open', 'true'); startLiveview(); // Start image refresh when opening } } function closeBjornDropdownIfOpen(event) { const dropdown = document.querySelector('.bjorn-dropdown'); const button = document.querySelector('.bjorn-button'); const isOpen = button.getAttribute('data-open') === 'true'; if (!event.target.closest('.bjorn-dropdown') && isOpen) { dropdown.classList.remove('show'); button.setAttribute('data-open', 'false'); stopLiveview(); // Stop image refresh when closing } } document.addEventListener('click', closeBjornDropdownIfOpen); document.addEventListener('touchstart', closeBjornDropdownIfOpen); // Existing logic for Actions dropdown function toggleDropdown() { const dropdown = document.querySelector('.dropdown'); const button = document.querySelector('.action-button'); const isOpen = button.getAttribute('data-open') === 'true'; if (isOpen) { dropdown.classList.remove('show'); button.setAttribute('data-open', 'false'); } else { dropdown.classList.add('show'); button.setAttribute('data-open', 'true'); } } function closeDropdownIfOpen(event) { const dropdown = document.querySelector('.dropdown'); const button = document.querySelector('.action-button'); const isOpen = button.getAttribute('data-open') === 'true'; if (!event.target.closest('.dropdown') && isOpen) { dropdown.classList.remove('show'); button.setAttribute('data-open', 'false'); } }