Send tab defaults with presets.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -96,6 +96,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
const presetAddColorButton = document.getElementById('preset-add-color-btn');
|
||||
const presetBrightnessInput = document.getElementById('preset-brightness-input');
|
||||
const presetDelayInput = document.getElementById('preset-delay-input');
|
||||
const presetDefaultButton = document.getElementById('preset-default-btn');
|
||||
const presetSaveButton = document.getElementById('preset-save-btn');
|
||||
const presetClearButton = document.getElementById('preset-clear-btn');
|
||||
const presetAddFromPaletteButton = document.getElementById('preset-add-from-palette-btn');
|
||||
@@ -439,6 +440,38 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
};
|
||||
|
||||
const getActiveTabId = () => {
|
||||
if (currentEditTabId) {
|
||||
return currentEditTabId;
|
||||
}
|
||||
const section = document.querySelector('.presets-section[data-tab-id]');
|
||||
return section ? section.dataset.tabId : null;
|
||||
};
|
||||
|
||||
const updateTabDefaultPreset = async (presetId) => {
|
||||
const tabId = getActiveTabId();
|
||||
if (!tabId) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const tabResponse = await fetch(`/tabs/${tabId}`, {
|
||||
headers: { Accept: 'application/json' },
|
||||
});
|
||||
if (!tabResponse.ok) {
|
||||
return;
|
||||
}
|
||||
const tabData = await tabResponse.json();
|
||||
tabData.default_preset = presetId;
|
||||
await fetch(`/tabs/${tabId}`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(tabData),
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn('Failed to save tab default preset:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const openEditor = () => {
|
||||
if (presetEditorModal) {
|
||||
presetEditorModal.classList.add('active');
|
||||
@@ -996,12 +1029,30 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
// Work out the preset ID: for existing presets use currentEditId, otherwise fall back to name
|
||||
const presetId = currentEditId || payload.name;
|
||||
// First send/override the preset definition under its ID
|
||||
sendPresetViaEspNow(presetId, payload, null);
|
||||
sendPresetViaEspNow(presetId, payload, null, true, false);
|
||||
// Then send a separate select-only message for this preset ID to all devices in the tab
|
||||
sendSelectForCurrentTabDevices(presetId, section);
|
||||
});
|
||||
}
|
||||
|
||||
if (presetDefaultButton) {
|
||||
presetDefaultButton.addEventListener('click', async () => {
|
||||
const payload = buildPresetPayload();
|
||||
if (!payload.name) {
|
||||
alert('Preset name is required.');
|
||||
return;
|
||||
}
|
||||
const section = document.querySelector('.presets-section[data-tab-id]');
|
||||
const namesAttr = section && section.getAttribute('data-device-names');
|
||||
const deviceNames = namesAttr
|
||||
? namesAttr.split(',').map((n) => n.trim()).filter((n) => n.length > 0)
|
||||
: [];
|
||||
const presetId = currentEditId || payload.name;
|
||||
await updateTabDefaultPreset(presetId);
|
||||
sendDefaultPreset(presetId, deviceNames);
|
||||
});
|
||||
}
|
||||
|
||||
presetSaveButton.addEventListener('click', async () => {
|
||||
const payload = buildPresetPayload();
|
||||
if (!payload.name) {
|
||||
@@ -1035,18 +1086,18 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
if (saved && typeof saved === 'object') {
|
||||
if (currentEditId) {
|
||||
// PUT returns the preset object directly; use the existing ID
|
||||
sendPresetViaEspNow(currentEditId, saved, deviceNames);
|
||||
sendPresetViaEspNow(currentEditId, saved, deviceNames, true, false);
|
||||
} else {
|
||||
// POST returns { id: preset }
|
||||
const entries = Object.entries(saved);
|
||||
if (entries.length > 0) {
|
||||
const [newId, presetData] = entries[0];
|
||||
sendPresetViaEspNow(newId, presetData, deviceNames);
|
||||
sendPresetViaEspNow(newId, presetData, deviceNames, true, false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Fallback: send what we just built
|
||||
sendPresetViaEspNow(payload.name, payload, deviceNames);
|
||||
sendPresetViaEspNow(payload.name, payload, deviceNames, true, false);
|
||||
}
|
||||
|
||||
await loadPresets();
|
||||
@@ -1112,7 +1163,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
// Build an ESPNow preset message for a single preset and optionally include a select
|
||||
// for the given device names, then send it via WebSocket.
|
||||
// saveToDevice defaults to true.
|
||||
const sendPresetViaEspNow = (presetId, preset, deviceNames, saveToDevice = true) => {
|
||||
const sendPresetViaEspNow = (presetId, preset, deviceNames, saveToDevice = true, setDefault = false) => {
|
||||
try {
|
||||
const colors = Array.isArray(preset.colors) && preset.colors.length
|
||||
? preset.colors
|
||||
@@ -1142,6 +1193,9 @@ const sendPresetViaEspNow = (presetId, preset, deviceNames, saveToDevice = true)
|
||||
// Instruct led-driver to save this preset when received.
|
||||
message.save = true;
|
||||
}
|
||||
if (setDefault) {
|
||||
message.default = presetId;
|
||||
}
|
||||
|
||||
// Optionally include a select section for specific devices
|
||||
if (Array.isArray(deviceNames) && deviceNames.length > 0) {
|
||||
@@ -1163,6 +1217,26 @@ const sendPresetViaEspNow = (presetId, preset, deviceNames, saveToDevice = true)
|
||||
}
|
||||
};
|
||||
|
||||
const sendDefaultPreset = (presetId, deviceNames) => {
|
||||
if (!presetId) {
|
||||
alert('Select a preset to set as default.');
|
||||
return;
|
||||
}
|
||||
const message = { v: '1', default: presetId };
|
||||
if (Array.isArray(deviceNames) && deviceNames.length > 0) {
|
||||
const select = {};
|
||||
deviceNames.forEach((name) => {
|
||||
if (name) {
|
||||
select[name] = [presetId];
|
||||
}
|
||||
});
|
||||
if (Object.keys(select).length > 0) {
|
||||
message.select = select;
|
||||
}
|
||||
}
|
||||
sendEspnowMessage(message);
|
||||
};
|
||||
|
||||
// Expose for other scripts (tabs.js) so they can reuse the shared WebSocket.
|
||||
try {
|
||||
window.sendPresetViaEspNow = sendPresetViaEspNow;
|
||||
|
||||
Reference in New Issue
Block a user