// WLED Configuration Module // Manages WLED segments and LED configuration let wledConfig = { segments: [] }; /** * Initialize WLED module */ function initWled() { loadWledConfig(); } /** * Load WLED configuration from server */ async function loadWledConfig() { try { const response = await fetch('/api/wled/config'); if (response.ok) { wledConfig = await response.json(); renderWledSegments(); showStatus('wled-status', t('wled.loaded'), 'success'); } } catch (error) { console.log('Using default WLED config'); wledConfig = { segments: [] }; renderWledSegments(); } } /** * Render WLED segments list */ function renderWledSegments() { const list = document.getElementById('wled-segments-list'); const emptyState = document.getElementById('no-wled-segments'); if (!list) return; // Clear existing segments (keep empty state) const existingItems = list.querySelectorAll('.wled-segment-item'); existingItems.forEach(item => item.remove()); if (wledConfig.segments.length === 0) { if (emptyState) emptyState.style.display = 'block'; return; } if (emptyState) emptyState.style.display = 'none'; wledConfig.segments.forEach((segment, index) => { const item = createSegmentElement(segment, index); list.insertBefore(item, emptyState); }); } /** * Create segment DOM element * @param {object} segment - Segment data * @param {number} index - Segment index * @returns {HTMLElement} Segment element */ function createSegmentElement(segment, index) { const item = document.createElement('div'); item.className = 'wled-segment-item'; item.dataset.index = index; item.innerHTML = `
`; return item; } /** * Add a new WLED segment */ function addWledSegment() { // Calculate next start position let nextStart = 0; if (wledConfig.segments.length > 0) { const lastSegment = wledConfig.segments[wledConfig.segments.length - 1]; nextStart = (lastSegment.start || 0) + (lastSegment.leds || 0); } wledConfig.segments.push({ name: '', start: nextStart, leds: 10 }); renderWledSegments(); } /** * Update a segment property * @param {number} index - Segment index * @param {string} property - Property name * @param {*} value - New value */ function updateSegment(index, property, value) { if (index >= 0 && index < wledConfig.segments.length) { wledConfig.segments[index][property] = value; } } /** * Remove a WLED segment * @param {number} index - Segment index to remove */ function removeWledSegment(index) { if (index >= 0 && index < wledConfig.segments.length) { wledConfig.segments.splice(index, 1); renderWledSegments(); } } /** * Save WLED configuration to server */ async function saveWledConfig() { try { const response = await fetch('/api/wled/config', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(wledConfig) }); if (response.ok) { showStatus('wled-status', t('wled.saved'), 'success'); } else { throw new Error('Save failed'); } } catch (error) { console.error('Error saving WLED config:', error); showStatus('wled-status', t('wled.error.save'), 'error'); } } /** * Helper function to escape HTML * @param {string} text - Text to escape * @returns {string} Escaped text */ function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } // Initialize when DOM is ready document.addEventListener('DOMContentLoaded', initWled);