(data)
| 14522 | updatePwnToggleAvailability(isHeadless); |
| 14523 | |
| 14524 | } catch (error) { |
| 14525 | // If endpoint doesn't exist or fails, assume not headless (default behavior) |
| 14526 | console.log('[Headless] Detection failed, assuming display mode:', error.message); |
| 14527 | headlessMode = false; |
| 14528 | applyHeadlessVisibility(false); |
| 14529 | } |
| 14530 | } |
| 14531 | |
| 14532 | /** |
| 14533 | * Apply headless mode visibility settings to UI elements |
| 14534 | * @param {boolean} isHeadless - Whether the system is in headless mode |
| 14535 | */ |
| 14536 | function applyHeadlessVisibility(isHeadless) { |
| 14537 | // Find all elements that require a display |
| 14538 | const displayElements = document.querySelectorAll('.requires-display'); |
| 14539 | |
| 14540 | if (isHeadless) { |
| 14541 | // Hide all display-related elements |
| 14542 | displayElements.forEach(el => { |
| 14543 | el.style.display = 'none'; |
| 14544 | el.setAttribute('data-hidden-by-headless', 'true'); |
| 14545 | }); |
| 14546 | |
| 14547 | console.log(`[Headless] Hidden ${displayElements.length} Display UI elements`); |
| 14548 | |
| 14549 | // If user is currently on Display tab, redirect to dashboard |
| 14550 | if (currentTab === 'epaper') { |
| 14551 | console.log('[Headless] Redirecting from Display tab to dashboard'); |
| 14552 | showTab('dashboard'); |
| 14553 | } |
| 14554 | } else { |
| 14555 | // Show all display-related elements |
| 14556 | displayElements.forEach(el => { |
| 14557 | if (el.getAttribute('data-hidden-by-headless') === 'true') { |
| 14558 | el.style.display = ''; |
| 14559 | el.removeAttribute('data-hidden-by-headless'); |
| 14560 | } |
| 14561 | }); |
| 14562 | |
| 14563 | console.log(`[Headless] Restored ${displayElements.length} Display UI elements`); |
| 14564 | } |
| 14565 | if (window._updateNavMode) window._updateNavMode(); |
| 14566 | } |
| 14567 | |
| 14568 | // ============================================================================ |
| 14569 | // HARDWARE PROFILE MANAGEMENT FUNCTIONS |
| 14570 | // ============================================================================ |
| 14571 | |
| 14572 | async function loadHardwareProfiles() { |
| 14573 | try { |
| 14574 | const profiles = await fetchAPI('/api/config/hardware-profiles'); |
| 14575 | const select = document.getElementById('hardware-profile-select'); |
| 14576 | const applyBtn = document.getElementById('apply-profile-btn'); |
| 14577 | |
| 14578 | if (!select) return; |
| 14579 | |
| 14580 | // Clear existing options |
| 14581 | select.innerHTML = '<option value="">Select a hardware profile...</option>'; |
no outgoing calls
no test coverage detected