fix: Implement live synchronization for heater and AC inputs in schedule form

This commit is contained in:
Aaron 2025-11-14 20:29:12 -05:00
parent eceee9c88d
commit 6bc7b1da93

View File

@ -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>