(function () { 'use strict'; var grid = document.getElementById('board-grid'); var emptyMsg = document.getElementById('empty-msg'); var modalOverlay = document.getElementById('config-modal'); var configForm = document.getElementById('config-form'); var editingBoard = null; function esc(s) { if (typeof s !== 'string') return ''; var d = document.createElement('div'); d.appendChild(document.createTextNode(s)); return d.innerHTML; } // ---- Fetch boards ---- function fetchBoards() { fetch('/api/boards') .then(function (r) { return r.json(); }) .then(function (boards) { renderBoards(boards); }) .catch(function () {}); } // ---- Render board cards ---- function renderBoards(boards) { if (boards.length === 0) { emptyMsg.style.display = 'block'; grid.innerHTML = ''; grid.appendChild(emptyMsg); return; } emptyMsg.style.display = 'none'; var sorted = boards.slice().sort(function (a, b) { var na = (a.display_name || '').toLowerCase(); var nb = (b.display_name || '').toLowerCase(); return na.localeCompare(nb); }); var html = ''; sorted.forEach(function (board) { var statusClass = board.online ? 'online' : 'offline'; var badgeClass = board.online ? 'badge-online' : 'badge-offline'; var left = board.config && board.config.left || {}; var right = board.config && board.config.right || {}; var scores = board.scores || {}; var leftScore = scores.left != null ? scores.left : '-'; var rightScore = scores.right != null ? scores.right : '-'; var leftColor = left.color || '#dc2626'; var rightColor = right.color || '#2563eb'; html += '
Every discovered board has a unique display_id.
'; } else { summary.textContent = list.length + ' conflicted display ID' + (list.length > 1 ? 's' : '') + '. Give each board a unique display_id to fix (use Edit).'; list.forEach(function (conflict) { var box = document.createElement('div'); box.className = 'card p-4 mb-3'; var html = '