()
| 16336 | <span class="text-[10px] px-2 py-0.5 rounded ${roleClass}">${formatInterfaceRole(entry.role)}</span> |
| 16337 | ${focusChip} |
| 16338 | </div> |
| 16339 | <div class="text-[11px] text-gray-400">${connectionLabel}</div> |
| 16340 | </div> |
| 16341 | <button type="button" class="${buttonClasses}" data-interface="${escapeHtml(entry.name || '')}" data-scan-state="${scanning ? 'enabled' : 'disabled'}">${buttonLabel}</button> |
| 16342 | </div> |
| 16343 | <div class="text-[11px] ${scanClass}">${scanNote}${ipLabel}</div> |
| 16344 | </div> |
| 16345 | `; |
| 16346 | }).join(''); |
| 16347 | |
| 16348 | listEl.querySelectorAll('button[data-interface]').forEach(button => { |
| 16349 | button.addEventListener('click', handleScanControlToggle); |
| 16350 | }); |
| 16351 | |
| 16352 | updateMultiInterfaceModeControls(state); |
| 16353 | } |
| 16354 | |
| 16355 | function updateMultiInterfaceModeControls(state) { |
| 16356 | const buttonsContainer = document.getElementById('wifi-multi-mode-buttons'); |
| 16357 | const focusWrapper = document.getElementById('wifi-multi-focus-controls'); |
| 16358 | const focusSelect = document.getElementById('wifi-multi-focus-select'); |
| 16359 | if (!buttonsContainer || !focusWrapper || !focusSelect) { |
| 16360 | return; |
| 16361 | } |
| 16362 | |
| 16363 | const activeMode = (state && state.scan_mode) ? state.scan_mode.toLowerCase() : 'single'; |
| 16364 | const focusInterface = state && state.focus_interface ? state.focus_interface : ''; |
| 16365 | const interfaces = state && Array.isArray(state.interfaces) ? state.interfaces : []; |
| 16366 | |
| 16367 | const buttons = buttonsContainer.querySelectorAll('button[data-mode]'); |
| 16368 | buttons.forEach(button => { |
| 16369 | const mode = button.dataset.mode; |
| 16370 | if (!mode) { |
| 16371 | return; |
| 16372 | } |
| 16373 | const isActive = mode === activeMode; |
| 16374 | button.classList.toggle('bg-Ragnar-500', isActive); |
| 16375 | button.classList.toggle('border-Ragnar-400', isActive); |
| 16376 | button.classList.toggle('text-white', isActive); |
| 16377 | button.classList.toggle('shadow-md', isActive); |
| 16378 | button.classList.toggle('bg-slate-800', !isActive); |
| 16379 | button.classList.toggle('border-slate-600', !isActive); |
| 16380 | button.classList.toggle('text-gray-300', !isActive); |
| 16381 | button.onclick = async () => { |
| 16382 | if (button.dataset.busy === 'true' || mode === activeMode) { |
| 16383 | return; |
| 16384 | } |
| 16385 | await setMultiInterfaceMode(mode, button); |
| 16386 | }; |
| 16387 | }); |
| 16388 | |
| 16389 | const shouldShowFocus = activeMode === 'single'; |
| 16390 | focusWrapper.classList.toggle('hidden', !shouldShowFocus); |
| 16391 | |
| 16392 | const uniqueOptions = interfaces |
| 16393 | .filter(entry => entry && entry.name) |
| 16394 | .map(entry => ({ |
| 16395 | name: entry.name, |
no test coverage detected