Add bulk Log Charged action to dashboard toolbar

Select multiple batteries, pick a date, and optionally increment charge
cycles for all of them in one shot. Reuses the existing bulk-action form
and POST /battery/bulk-action route; no new routes or migrations needed.
This commit is contained in:
2026-04-13 09:30:56 -05:00
parent b1bc02e963
commit 3c2b2dc389
2 changed files with 34 additions and 0 deletions
+18
View File
@@ -470,6 +470,24 @@ def create_app(config_object="config"):
db.commit() db.commit()
label = field_name.replace("_", " ").title() label = field_name.replace("_", " ").title()
flash(f"Set {label} on {n} batter{'y' if n == 1 else 'ies'}.", "success") flash(f"Set {label} on {n} batter{'y' if n == 1 else 'ies'}.", "success")
elif action == "log_charged":
date_val = request.form.get("charged_date", "").strip()
if not date_val:
flash("Date is required.", "error")
return redirect(url_for("dashboard"))
increment = 1 if request.form.get("increment_cycles") else 0
for b in batteries:
db.add(ChargeLog(battery_id=b.id, charged_date=date_val,
increment_cycles=increment, notes=None))
if increment:
b.charge_cycles = (b.charge_cycles or 0) + 1
db.commit()
flash(
f"Logged charge date {date_val} for "
f"{n} batter{'y' if n == 1 else 'ies'}"
+ (" (+cycles)." if increment else "."),
"success",
)
else: else:
flash("Unknown action.", "error") flash("Unknown action.", "error")
+16
View File
@@ -124,6 +124,16 @@
<button class="btn btn-sm btn-primary" name="action" value="install_device" type="submit" <button class="btn btn-sm btn-primary" name="action" value="install_device" type="submit"
onclick="return confirmInstallDevice()">Install in device</button> onclick="return confirmInstallDevice()">Install in device</button>
</span> </span>
<span style="display:flex;gap:0.35rem;align-items:center;flex-wrap:wrap;">
<input type="date" name="charged_date" id="bulk-charged-date"
style="padding:0.25rem 0.5rem;font-size:0.85rem;border:1px solid #cbd5e1;border-radius:4px;">
<label style="font-size:0.85rem;display:flex;align-items:center;gap:0.25rem;cursor:pointer;">
<input type="checkbox" name="increment_cycles" id="bulk-increment-cycles" value="1" checked>
+cycle
</label>
<button class="btn btn-sm btn-primary" name="action" value="log_charged" type="submit"
onclick="return validateBulkCharge()">Log Charged</button>
</span>
</div> </div>
<div class="table-wrap"> <div class="table-wrap">
@@ -349,6 +359,12 @@ document.addEventListener('click', function() {
document.getElementById('col-picker-panel').style.display = 'none'; document.getElementById('col-picker-panel').style.display = 'none';
}); });
function validateBulkCharge() {
var d = document.getElementById('bulk-charged-date');
if (!d.value) { d.focus(); return false; }
return true;
}
function bulkStorageChanged(sel) { function bulkStorageChanged(sel) {
var text = document.getElementById('bulk-storage-text'); var text = document.getElementById('bulk-storage-text');
var hidden = document.getElementById('bulk-field-value-storage'); var hidden = document.getElementById('bulk-field-value-storage');