/** * Disk Checker - Main JavaScript * Handles HTMX events and dynamic content rendering */ // Global state let selectedDrive = null; // Render drives after HTMX loads them function renderDrives(data) { const container = document.getElementById('drives-content'); if (!container) return; container.innerHTML = ''; if (!data.drives || data.drives.length === 0) { container.innerHTML = '

No drives found.

'; return; } data.drives.forEach(drive => { const col = document.createElement('div'); col.className = 'col-md-4 mb-3'; const card = document.createElement('div'); card.className = `drive-card ${drive.mounted ? 'disabled' : 'available'}`; card.innerHTML = `
${drive.name}

Size: ${drive.size}
Model: ${drive.model || 'Unknown'}
${drive.serial ? `Serial: ${drive.serial}
` : ''} ${drive.mount_point ? `Mounted at: ${drive.mount_point}
` : ''}

${drive.mounted ? 'Mounted - Unavailable' : 'Available for Benchmark' }
`; col.appendChild(card); container.appendChild(col); }); } // Render drive selector for benchmark tab (available drives only) function renderDriveSelector(data) { const container = document.getElementById('drive-cards'); if (!container) return; container.innerHTML = ''; if (!data.drives || data.drives.length === 0) { container.innerHTML = '

No drives found.

'; return; } // Filter to show only available drives const availableDrives = data.drives.filter(drive => !drive.mounted); if (availableDrives.length === 0) { container.innerHTML = '
No available drives. All drives are mounted.
'; return; } availableDrives.forEach(drive => { const col = document.createElement('div'); col.className = 'col-md-4 mb-3'; const cardWrapper = document.createElement('div'); cardWrapper.className = 'drive-selector-card'; cardWrapper.dataset.drivePath = drive.path; // Radio input (hidden) const radio = document.createElement('input'); radio.type = 'radio'; radio.name = 'selected_drive'; radio.value = drive.path; radio.id = `drive-${drive.name}`; radio.className = 'btn-check'; radio.setAttribute('autocomplete', 'off'); // Label as card const label = document.createElement('label'); label.htmlFor = `drive-${drive.name}`; label.className = 'btn btn-outline-primary w-100 text-start'; label.innerHTML = `
${drive.name}
${drive.size} ${drive.model || ''}
Available
${drive.serial ? `SN: ${drive.serial}` : ''} `; cardWrapper.appendChild(radio); cardWrapper.appendChild(label); col.appendChild(cardWrapper); container.appendChild(col); // Add click handler to show selected drive info radio.addEventListener('change', function() { if (this.checked) { selectDrive(drive); } }); }); } // Handle drive selection function selectDrive(drive) { selectedDrive = drive; console.log('Selected drive:', drive); // Update UI to show selection const infoDiv = document.getElementById('selected-drive-info'); if (infoDiv) { infoDiv.innerHTML = `
Selected: ${drive.name} (${drive.path})
${drive.size} - ${drive.model || 'Unknown model'}
`; } // Enable benchmark configuration section const configDiv = document.getElementById('benchmark-config'); if (configDiv) { configDiv.classList.remove('opacity-50'); configDiv.querySelector('.card-body').innerHTML = `

Drive ${drive.name} selected. Configure benchmark parameters below.

`; } } // Listen for HTMX events document.addEventListener('htmx:afterRequest', function(evt) { // Render drives in home page if (evt.detail.target.id === 'drives-content') { renderDrives(JSON.parse(evt.detail.xhr.response)); } // Render drive selector in benchmark page if (evt.detail.target.id === 'drive-cards') { renderDriveSelector(JSON.parse(evt.detail.xhr.response)); } }); // Listen for HTMX load event as fallback document.addEventListener('htmx:load', function(evt) { if (evt.target.id === 'drive-cards') { // HTMX will load the content via hx-get // The afterRequest event will handle rendering } });