Haltezeit als Zeitfeld: Stunden und Minuten statt einer Minutenzahl

Dasselbe <input type="time"> wie von/bis daneben, nur als Dauer gelesen -
"03:30" tippt sich leichter als "210" und steht in derselben Zeile wie die
beiden Uhrzeiten darueber. Dass es keine Uhrzeit meint, sagt der Text
ringsum ("erst nach ... am Stueck"); die Kopfzeile des Rahmens schreibt es
beim Tippen aus.

Die Obergrenze ist damit 23:59 statt 24 Stunden - genau das, was ein
Zeitfeld hergibt.

Dabei aufgefallen: haltezeitKurz() rundete auf Zehntelstunden und machte aus
23:59 die Auskunft "24 Std.". Eine Haltezeit, die laenger aussieht als sie
ist, ist genau die falsche Auskunft - krumme Werte stehen jetzt als
"23 Std. 59 Min." da, halbe behalten ihr Komma.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 09:26:00 +02:00
co-authored by Claude Opus 5
parent 229910bcb8
commit 95a61709d7
4 changed files with 73 additions and 36 deletions
+36 -13
View File
@@ -1136,10 +1136,36 @@ function rahmenKurzText() {
return teile.join(" · ");
}
/** Wie haltezeitKurz() in automations.php: Minuten bis eine Stunde, dann Stunden. */
/**
* Haltezeit und Zeitfeld ineinander umrechnen.
*
* Das Feld ist ein gewoehnliches <input type="time">, sein Wert also "03:30".
* Gemeint ist keine Uhrzeit, sondern eine Dauer - deshalb hier zwei eigene
* Funktionen und nicht die Behandlung von window_from/window_to, die den Text
* unveraendert durchreichen.
*/
function haltezeitAlsUhr(sekunden) {
const min = Math.round(sekunden / 60);
return String(Math.floor(min / 60)).padStart(2, "0") + ":"
+ String(min % 60).padStart(2, "0");
}
/** Leer oder unsinnig ist 0; die Obergrenze ist 23:59, siehe haltezeitPruefen(). */
function haltezeitAusUhr(text) {
const teile = String(text || "").split(":");
const sek = ((Number(teile[0]) || 0) * 60 + (Number(teile[1]) || 0)) * 60;
return Math.min(Math.max(sek, 0), 86340);
}
/** Wie haltezeitKurz() in automations.php - dort steht, warum nicht gerundet wird. */
function haltezeitKurz(sekunden) {
if (sekunden < 3600) return Math.floor(sekunden / 60) + " Min.";
return (sekunden / 3600).toFixed(1).replace(/[.,]0$/, "").replace(".", ",") + " Std.";
const minuten = Math.floor(sekunden / 60);
if (minuten < 60) return minuten + " Min.";
const stunden = Math.floor(minuten / 60);
const rest = minuten % 60;
if (rest === 0) return stunden + " Std.";
if (rest === 30) return stunden + ",5 Std.";
return stunden + " Std. " + rest + " Min.";
}
function rahmenIstVorgabe() {
@@ -1181,7 +1207,7 @@ function fuelleFormular() {
const sperre = document.getElementById("lockoutSecs");
optionListe(sperre, autoLockouts.map(o => ({ value: o.value, text: o.label })),
autoModel.lockout_secs);
document.getElementById("holdMin").value = autoModel.hold_secs / 60;
document.getElementById("holdZeit").value = haltezeitAlsUhr(autoModel.hold_secs);
document.getElementById("autoName").value = autoModel.name;
// Kennt die Liste die Etage nicht, bleibt eine Auswahlliste sonst leer
// stehen und schickt beim Speichern "" mit.
@@ -1216,10 +1242,7 @@ function leseFormular() {
autoModel.once_per_day = document.getElementById("oncePerDay").checked;
autoModel.next_day = document.getElementById("nextDay").checked;
autoModel.lockout_secs = Number(document.getElementById("lockoutSecs").value);
// Minuten im Feld, Sekunden im Modell - und nichts Unmoegliches: ein
// leeres Feld ist 0, ein Tag ist die Obergrenze (siehe haltezeitPruefen()).
const halten = Math.round(Number(document.getElementById("holdMin").value) || 0);
autoModel.hold_secs = Math.min(Math.max(halten, 0), 1440) * 60;
autoModel.hold_secs = haltezeitAusUhr(document.getElementById("holdZeit").value);
}
/**
@@ -1227,15 +1250,15 @@ function leseFormular() {
* Ohne das stuende dort "rund um die Uhr", waehrend darunter 08:45 steht.
*/
function rahmenFelderVerdrahten() {
["tSpanFrom", "tSpanTo", "lockoutSecs", "holdMin",
["tSpanFrom", "tSpanTo", "lockoutSecs", "holdZeit",
"runOnce", "oncePerDay", "nextDay"].forEach(id => {
const feld = document.getElementById(id);
if (feld) feld.addEventListener("change", () => { leseFormular(); renderRahmen(); });
});
// Bei der Haltezeit schon beim Tippen: aus "210" wird in der Kopfzeile
// "erst nach 3,5 Std." - genau dafuer gibt man die Zahl ein. "change"
// allein kaeme erst beim Verlassen des Feldes.
document.getElementById("holdMin")
// Bei der Haltezeit schon beim Tippen: aus "03:30" wird in der Kopfzeile
// "erst nach 3,5 Std.". "change" allein kaeme erst beim Verlassen des
// Feldes, und ein Zeitfeld verlaesst man ungern, um nachzusehen.
document.getElementById("holdZeit")
.addEventListener("input", () => { leseFormular(); renderRahmen(); });
// Zugeklappt steht in der Kopfzeile, was gilt; aufgeklappt stehen dort die