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:
@@ -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")
|
||||||
|
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
Reference in New Issue
Block a user