fix: Implement live synchronization for heater and AC inputs in schedule form
This commit is contained in:
parent
eceee9c88d
commit
6bc7b1da93
@ -1469,6 +1469,71 @@ document.addEventListener('DOMContentLoaded', function() {{
|
|||||||
}}
|
}}
|
||||||
.btn:hover {{ transform: translateY(-2px); }}
|
.btn:hover {{ transform: translateY(-2px); }}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<script defer>
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {{
|
||||||
|
var form = document.querySelector('form[action="/schedule"]');
|
||||||
|
if (!form) return;
|
||||||
|
|
||||||
|
function getPairByTarget(t) {{
|
||||||
|
var m = t.name && t.name.match(/^schedule_(\d+)_(heater|ac)$/);
|
||||||
|
if (!m) return null;
|
||||||
|
var i = m[1];
|
||||||
|
return {{
|
||||||
|
heater: form.querySelector('input[name="schedule_' + i + '_heater"]'),
|
||||||
|
ac: form.querySelector('input[name="schedule_' + i + '_ac"]')
|
||||||
|
}};
|
||||||
|
}}
|
||||||
|
|
||||||
|
function syncFromHeater(h, a) {{
|
||||||
|
var hv = parseFloat(h.value), av = parseFloat(a.value);
|
||||||
|
if (!isNaN(hv) && !isNaN(av) && hv > av) a.value = hv;
|
||||||
|
}}
|
||||||
|
|
||||||
|
function syncFromAc(h, a) {{
|
||||||
|
var hv = parseFloat(h.value), av = parseFloat(a.value);
|
||||||
|
if (!isNaN(hv) && !isNaN(av) && av < hv) h.value = av;
|
||||||
|
}}
|
||||||
|
|
||||||
|
// Live sync via event delegation (all rows)
|
||||||
|
form.addEventListener('input', function(e) {{
|
||||||
|
if (!e.target.name) return;
|
||||||
|
var pair = getPairByTarget(e.target);
|
||||||
|
if (!pair || !pair.heater || !pair.ac) return;
|
||||||
|
if (e.target.name.endsWith('_heater')) syncFromHeater(pair.heater, pair.ac);
|
||||||
|
else if (e.target.name.endsWith('_ac')) syncFromAc(pair.heater, pair.ac);
|
||||||
|
}});
|
||||||
|
|
||||||
|
form.addEventListener('change', function(e) {{
|
||||||
|
if (!e.target.name) return;
|
||||||
|
var pair = getPairByTarget(e.target);
|
||||||
|
if (!pair || !pair.heater || !pair.ac) return;
|
||||||
|
if (e.target.name.endsWith('_heater')) syncFromHeater(pair.heater, pair.ac);
|
||||||
|
else if (e.target.name.endsWith('_ac')) syncFromAc(pair.heater, pair.ac);
|
||||||
|
}});
|
||||||
|
|
||||||
|
// Normalize on load
|
||||||
|
for (var i = 0; i < 4; i++) {{
|
||||||
|
var h = form.querySelector('input[name="schedule_' + i + '_heater"]');
|
||||||
|
var a = form.querySelector('input[name="schedule_' + i + '_ac"]');
|
||||||
|
if (h && a) syncFromHeater(h, a);
|
||||||
|
}}
|
||||||
|
|
||||||
|
// Normalize on submit to guarantee posted values
|
||||||
|
form.addEventListener('submit', function() {{
|
||||||
|
for (var i = 0; i < 4; i++) {{
|
||||||
|
var h = form.querySelector('input[name="schedule_' + i + '_heater"]');
|
||||||
|
var a = form.querySelector('input[name="schedule_' + i + '_ac"]');
|
||||||
|
if (!h || !a) continue;
|
||||||
|
var hv = parseFloat(h.value), av = parseFloat(a.value);
|
||||||
|
if (isNaN(hv) || isNaN(av)) continue;
|
||||||
|
if (hv > av) a.value = hv; // heat up → raise AC
|
||||||
|
if (av < hv) h.value = av; // AC down → lower heat
|
||||||
|
}}
|
||||||
|
}});
|
||||||
|
}});
|
||||||
|
</script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@ -1505,69 +1570,6 @@ document.addEventListener('DOMContentLoaded', function() {{
|
|||||||
To change modes (Automatic/Hold), return to the dashboard
|
To change modes (Automatic/Hold), return to the dashboard
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {{
|
|
||||||
var form = document.querySelector('form[action="/schedule"]');
|
|
||||||
if (!form) return;
|
|
||||||
|
|
||||||
function getPairByTarget(t) {{
|
|
||||||
var m = t.name && t.name.match(/^schedule_(\d+)_(heater|ac)$/);
|
|
||||||
if (!m) return null;
|
|
||||||
var i = m[1];
|
|
||||||
return {{
|
|
||||||
heater: form.querySelector('input[name="schedule_' + i + '_heater"]'),
|
|
||||||
ac: form.querySelector('input[name="schedule_' + i + '_ac"]')
|
|
||||||
}};
|
|
||||||
}}
|
|
||||||
|
|
||||||
function syncFromHeater(h, a) {{
|
|
||||||
var hv = parseFloat(h.value), av = parseFloat(a.value);
|
|
||||||
if (!isNaN(hv) && !isNaN(av) && hv > av) a.value = hv;
|
|
||||||
}}
|
|
||||||
|
|
||||||
function syncFromAc(h, a) {{
|
|
||||||
var hv = parseFloat(h.value), av = parseFloat(a.value);
|
|
||||||
if (!isNaN(hv) && !isNaN(av) && av < hv) h.value = av;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Live sync via event delegation (handles all rows)
|
|
||||||
form.addEventListener('input', function(e) {{
|
|
||||||
if (!e.target.name) return;
|
|
||||||
var pair = getPairByTarget(e.target);
|
|
||||||
if (!pair || !pair.heater || !pair.ac) return;
|
|
||||||
if (e.target.name.endsWith('_heater')) syncFromHeater(pair.heater, pair.ac);
|
|
||||||
else if (e.target.name.endsWith('_ac')) syncFromAc(pair.heater, pair.ac);
|
|
||||||
}});
|
|
||||||
|
|
||||||
form.addEventListener('change', function(e) {{
|
|
||||||
if (!e.target.name) return;
|
|
||||||
var pair = getPairByTarget(e.target);
|
|
||||||
if (!pair || !pair.heater || !pair.ac) return;
|
|
||||||
if (e.target.name.endsWith('_heater')) syncFromHeater(pair.heater, pair.ac);
|
|
||||||
else if (e.target.name.endsWith('_ac')) syncFromAc(pair.heater, pair.ac);
|
|
||||||
}});
|
|
||||||
|
|
||||||
// Normalize all rows on load (in case initial data violates rule)
|
|
||||||
for (var i = 0; i < 4; i++) {{
|
|
||||||
var h = form.querySelector('input[name="schedule_' + i + '_heater"]');
|
|
||||||
var a = form.querySelector('input[name="schedule_' + i + '_ac"]');
|
|
||||||
if (h && a) syncFromHeater(h, a); // ensure AC >= heat at start
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Guarantee posted values are valid on submit
|
|
||||||
form.addEventListener('submit', function() {{
|
|
||||||
for (var i = 0; i < 4; i++) {{
|
|
||||||
var h = form.querySelector('input[name="schedule_' + i + '_heater"]');
|
|
||||||
var a = form.querySelector('input[name="schedule_' + i + '_ac"]');
|
|
||||||
if (!h || !a) continue;
|
|
||||||
var hv = parseFloat(h.value), av = parseFloat(a.value);
|
|
||||||
if (isNaN(hv) || isNaN(av)) continue;
|
|
||||||
if (hv > av) a.value = hv; // heat up → raise AC
|
|
||||||
if (av < hv) h.value = av; // AC down → lower heat
|
|
||||||
}}
|
|
||||||
}});
|
|
||||||
}});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user