Raum-Modal: Solltemperatur wirkt sofort, kein Speichern-Knopf mehr
Im Raum-Modal wirkt jedes Bedienelement sofort - der Rollladen faehrt, der Schalter schaltet, die Lampe leuchtet. Nur die Solltemperatur wartete auf "Save changes". Sie schickt jetzt beim Loslassen des Reglers, wie die Rollladenregler daneben, und der Knopf ist im Raum-Modal weg. Einer, der nur fuer einen der Reiter gilt, waere in allen anderen eine Falle. Das Modal bleibt nach dem Schicken offen; frueher schloss es sich, weil der Knopf das Ende der Bedienung war. Wer dreimal nachjustiert, will nicht dreimal neu aufmachen. Die Heizungskarte traegt dafuer dieselbe Sperre wie die Geraetekarten - waehrend das Kommando unterwegs ist, ist sie gesperrt. Dabei einen Fehler mitgenommen: der Speichern-Knopf gehoert allen Modals gemeinsam, und wer ihn versteckt, versteckt ihn fuer alle. Ein Raum ohne Thermostat liess ihn schon bisher verschwinden - danach hatten der AutoAction-Editor und die Raumzuordnung bis zum Neuladen keinen Speichern-Knopf mehr. Beide holen ihn jetzt wieder hervor. Nachgemessen: im Raum-Modal versteckt, im Editor und in der Raumzuordnung sichtbar. Die Fahrknoepfe sind von 34 auf 50 Pixel gewachsen - sie sind das, was man im Vorbeigehen antippt, die Regler daneben braucht man seltener. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -112,7 +112,7 @@ foreach ($katalog as $d) {
|
||||
// einer Geraeteliste: ein Regler fuer den Raum statt einer Karte je Geraet.
|
||||
$fertig = [];
|
||||
if ($hatThermostat) {
|
||||
$karte = "<div class='card mb-2'><div class='card-body py-2'>"
|
||||
$karte = "<div class='card mb-2 raum-geraet'><div class='card-body py-2'>"
|
||||
. "<div class='d-flex justify-content-between align-items-baseline'>"
|
||||
. "<label class='form-label mb-0 small' for='modal-slider'>Solltemperatur</label>"
|
||||
. "<span id='modal-slider-label' class='fw-semibold text-nowrap ms-2' style='color:#297195'>–</span>"
|
||||
|
||||
+5
-4
@@ -296,13 +296,14 @@ input[type='range']::-webkit-slider-runnable-track {
|
||||
}
|
||||
|
||||
/* Auf, Stop, Zu untereinander - die Knoepfe zeigen in die Richtung, in die
|
||||
sie fahren. Schmal, weil nur Symbole darin stehen. */
|
||||
sie fahren. Breit genug fuer einen Daumen: sie sind das, was man im
|
||||
Vorbeigehen antippt, die Regler daneben braucht man seltener. */
|
||||
.raum-fahrt {
|
||||
flex: 0 0 auto;
|
||||
flex: 0 0 3.1rem;
|
||||
}
|
||||
.raum-fahrt .btn {
|
||||
padding: 0.2rem 0.55rem;
|
||||
line-height: 1.4;
|
||||
padding: 0.3rem 0;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* Eine Spalte mit senkrechtem Regler: Name, oberes Wort, Bahn, unteres
|
||||
|
||||
@@ -637,6 +637,8 @@ function openAutoActionModal(params) {
|
||||
const alt = document.getElementById("modalSaveBtn");
|
||||
const btn = alt.cloneNode(true);
|
||||
alt.replaceWith(btn);
|
||||
// Das Raum-Modal versteckt ihn; hier wird er gebraucht.
|
||||
btn.hidden = false;
|
||||
btn.addEventListener("click", submitAutoAction);
|
||||
|
||||
// Der Editor braucht mehr Breite als die Ladedialoge, gibt sie aber wieder
|
||||
@@ -742,6 +744,8 @@ function openRoomModal() {
|
||||
const alt = document.getElementById("modalSaveBtn");
|
||||
const btn = alt.cloneNode(true);
|
||||
alt.replaceWith(btn);
|
||||
// Das Raum-Modal versteckt ihn; hier wird er gebraucht.
|
||||
btn.hidden = false;
|
||||
btn.addEventListener("click", speichereRaeume);
|
||||
|
||||
const dialog = document.querySelector("#modalEV .modal-dialog");
|
||||
|
||||
+21
-7
@@ -177,12 +177,16 @@ function switchFloor(floor){
|
||||
.replace("ue", "ü").replace("ae", "ä").replace("oe", "ö");
|
||||
|
||||
// Der Speichern-Knopf gehoert allen Modals gemeinsam. Ein Klon ohne
|
||||
// Zuhoerer stellt sicher, dass nicht auch der Handler eines vorher
|
||||
// geoeffneten Modals mitfeuert.
|
||||
// Zuhoerer stellt sicher, dass nicht der Handler eines vorher
|
||||
// geoeffneten Modals mitfeuert; im Raum-Modal bleibt er weg. Hier wird
|
||||
// nichts gesammelt und dann abgeschickt - jeder Rollladen, jeder
|
||||
// Schalter und jede Lampe wirkt sofort, und die Solltemperatur tut es
|
||||
// jetzt auch. Ein Knopf, der nur fuer einen der Reiter gilt, waere in
|
||||
// allen anderen eine Falle.
|
||||
const alt = document.getElementById("modalSaveBtn");
|
||||
const btn = alt.cloneNode(true);
|
||||
alt.replaceWith(btn);
|
||||
btn.addEventListener("click", () => sendeSolltemperatur(raum));
|
||||
btn.hidden = true;
|
||||
|
||||
const koerper = document.getElementById("modal-body");
|
||||
koerper.innerHTML = loadingHTML("Wird geladen...");
|
||||
@@ -202,11 +206,11 @@ function switchFloor(floor){
|
||||
wert => wert + " °C");
|
||||
const stand = mqttData["Raumtemp"]?.[teile[0]]?.[teile[1]]?.["Set Temp[degC]"];
|
||||
slider.value = typeof stand !== "undefined" ? stand : 10;
|
||||
// Nur "input": das zeichnet die Anzeige, schickt aber nichts.
|
||||
slider.dispatchEvent(new Event("input"));
|
||||
// "change" kommt beim Loslassen - wie bei den Rollladenreglern.
|
||||
slider.addEventListener("change", () => sendeSolltemperatur(raum));
|
||||
}
|
||||
// Ohne Thermostat gibt es nichts zu speichern - dann waere der Knopf
|
||||
// eine Falle.
|
||||
btn.hidden = !slider;
|
||||
|
||||
raumBedienungAktivieren(koerper);
|
||||
raumMesswerteAktualisieren(teile[0], teile[1]);
|
||||
@@ -396,13 +400,23 @@ function switchFloor(floor){
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Die neue Solltemperatur schicken.
|
||||
*
|
||||
* Das Modal bleibt danach offen: frueher schloss es sich, weil der
|
||||
* Speichern-Knopf das Ende der Bedienung war. Jetzt ist das Verschieben
|
||||
* des Reglers die Bedienung, und wer dreimal nachjustiert, will nicht
|
||||
* dreimal neu aufmachen.
|
||||
*/
|
||||
function sendeSolltemperatur(raum) {
|
||||
const slider = document.getElementById("modal-slider");
|
||||
if (!slider) return;
|
||||
const karte = slider.closest(".raum-geraet");
|
||||
if (karte) karte.classList.add("raum-warte");
|
||||
raumRequest("temp", { room: raum, temp: Number(slider.value) })
|
||||
.then(antwort => {
|
||||
if (karte) karte.classList.remove("raum-warte");
|
||||
raumMeldung(antwort);
|
||||
if (!antwort.error) setTimeout(() => modalEV.hide(), 700);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user