From 07650b487830c385acba88be3a6e1ca01c774178 Mon Sep 17 00:00:00 2001 From: Yurii Date: Tue, 19 May 2026 21:39:29 +0300 Subject: [PATCH] refactor: improved dashboard & restore settings --- src_data/pages/dashboard.html | 40 +++++++++++++++++++++++++++++------ src_data/scripts/utils.js | 37 +++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/src_data/pages/dashboard.html b/src_data/pages/dashboard.html index 50f57e5..cb6fdde 100644 --- a/src_data/pages/dashboard.html +++ b/src_data/pages/dashboard.html @@ -351,9 +351,14 @@ value = -(step); } - newSettings[purpose].target = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2)); - modifiedTime = Date.now(); - setValue('.targetTemp', newSettings[purpose].target, tContainer); + const newValue = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2)); + if (newSettings[purpose].target != newValue) { + newSettings[purpose].target = newValue; + modifiedTime = Date.now(); + + setValue('.targetTemp', newValue, tContainer); + tContainer.querySelector('.thermostat-header').setAttribute("aria-busy", "true"); + } } }); } @@ -383,27 +388,46 @@ value = -(bigStep); } - newSettings[purpose].target = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2)); - modifiedTime = Date.now(); + const newValue = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2)); + if (newSettings[purpose].target != newValue) { + newSettings[purpose].target = newValue; + modifiedTime = Date.now(); - setValue('.targetTemp', newSettings[purpose].target, tContainer); + setValue('.targetTemp', newSettings[purpose].target, tContainer); + tContainer.querySelector('.thermostat-header').setAttribute("aria-busy", "true"); + } }, 500); }); }); document.querySelector('#tHeatEnabled').addEventListener('change', (event) => { + if (newSettings.heating.enabled == event.currentTarget.checked) { + return; + } + modifiedTime = Date.now(); newSettings.heating.enabled = event.currentTarget.checked; + document.querySelector('.tHeat .thermostat-header').setAttribute("aria-busy", "true"); }); document.querySelector('#tHeatTurbo').addEventListener('change', (event) => { + if (newSettings.heating.turbo == event.currentTarget.checked) { + return; + } + modifiedTime = Date.now(); newSettings.heating.turbo = event.currentTarget.checked; + document.querySelector('.tHeat .thermostat-header').setAttribute("aria-busy", "true"); }); document.querySelector('#tDhwEnabled').addEventListener('change', (event) => { + if (newSettings.dhw.enabled == event.currentTarget.checked) { + return; + } + modifiedTime = Date.now(); newSettings.dhw.enabled = event.currentTarget.checked; + document.querySelector('.tDhw .thermostat-header').setAttribute("aria-busy", "true"); }); document.querySelector('.notify-fault .reset').addEventListener('click', async (event) => { @@ -531,6 +555,10 @@ setValue('.pressureUnit', pressureUnit(unitSystem)); setValue('.volumeUnit', volumeUnit(unitSystem)); + document.querySelectorAll('.thermostat-header').forEach((item) => { + item.setAttribute("aria-busy", "false"); + }); + } catch (error) { console.log(error); } diff --git a/src_data/scripts/utils.js b/src_data/scripts/utils.js index ab318ef..c728a8e 100644 --- a/src_data/scripts/utils.js +++ b/src_data/scripts/utils.js @@ -318,7 +318,7 @@ const setupRestoreBackupForm = (formSelector) => { console.log("Backup: ", data); if (data.settings != undefined) { - for (var key in data.settings) { + for (const key in data.settings) { let response = await fetch(url, { method: "POST", cache: "no-cache", @@ -338,6 +338,41 @@ const setupRestoreBackupForm = (formSelector) => { return; } } + + let finalPayload = {}; + if (data.settings.emergency?.target !== undefined) { + finalPayload.emergency ??= {}; + finalPayload.emergency.target = data.settings.emergency.target; + } + + if (data.settings.heating?.target !== undefined) { + finalPayload.heating ??= {}; + finalPayload.heating.target = data.settings.heating.target; + } + + if (data.settings.dhw?.target !== undefined) { + finalPayload.dhw ??= {}; + finalPayload.dhw.target = data.settings.dhw.target; + } + + if (Object.keys(finalPayload).length) { + let response = await fetch(url, { + method: "POST", + cache: "no-cache", + credentials: "include", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + "settings": finalPayload + }) + }); + + if (!response.ok) { + onFailed(); + return; + } + } } if (data.sensors != undefined) {