// 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);