diff --git a/server/src/wled_controller/static/css/dashboard.css b/server/src/wled_controller/static/css/dashboard.css index 996ee7e..083200a 100644 --- a/server/src/wled_controller/static/css/dashboard.css +++ b/server/src/wled_controller/static/css/dashboard.css @@ -186,6 +186,31 @@ gap: 4px; } +.dashboard-autostart-btn { + background: none; + border: none; + color: var(--text-muted); + font-size: 0.8rem; + width: 24px; + height: 24px; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border-radius: 4px; + transition: color 0.2s, background 0.2s; +} + +.dashboard-autostart-btn:hover { + color: var(--warning-color, #ffc107); + background: rgba(255, 193, 7, 0.1); +} + +.dashboard-autostart-btn.active { + color: var(--warning-color, #ffc107); +} + .dashboard-status-dot { font-size: 1rem; line-height: 1; diff --git a/server/src/wled_controller/static/js/app.js b/server/src/wled_controller/static/js/app.js index 34d09ca..88272d8 100644 --- a/server/src/wled_controller/static/js/app.js +++ b/server/src/wled_controller/static/js/app.js @@ -35,7 +35,7 @@ import { } from './features/devices.js'; import { loadDashboard, stopUptimeTimer, - dashboardToggleProfile, dashboardStartTarget, dashboardStopTarget, dashboardStopAll, + dashboardToggleProfile, dashboardStartTarget, dashboardStopTarget, dashboardToggleAutoStart, dashboardStopAll, toggleDashboardSection, changeDashboardPollInterval, } from './features/dashboard.js'; import { startEventsWS, stopEventsWS } from './core/events-ws.js'; @@ -186,6 +186,7 @@ Object.assign(window, { dashboardToggleProfile, dashboardStartTarget, dashboardStopTarget, + dashboardToggleAutoStart, dashboardStopAll, toggleDashboardSection, changeDashboardPollInterval, diff --git a/server/src/wled_controller/static/js/features/dashboard.js b/server/src/wled_controller/static/js/features/dashboard.js index 9fe5b59..7659bc7 100644 --- a/server/src/wled_controller/static/js/features/dashboard.js +++ b/server/src/wled_controller/static/js/features/dashboard.js @@ -21,6 +21,7 @@ let _fpsHistory = {}; // { targetId: number[] } — fps_actual let _fpsCurrentHistory = {}; // { targetId: number[] } — fps_current let _fpsCharts = {}; // { targetId: Chart } let _lastRunningIds = []; // sorted target IDs from previous render +let _lastAutoStartIds = ''; // comma-joined sorted auto-start IDs let _uptimeBase = {}; // { targetId: { seconds, timestamp } } let _uptimeTimer = null; let _uptimeElements = {}; // { targetId: HTMLElement } — cached DOM refs @@ -347,6 +348,7 @@ export async function loadDashboard(forceFullRender = false) { // Build dynamic HTML (targets, profiles) let dynamicHtml = ''; let runningIds = []; + let newAutoStartIds = ''; if (targets.length === 0 && profiles.length === 0) { dynamicHtml = `