Implement reliability improvements across frontend

- api.js: add exponential backoff retry (3 attempts, 500/1000/2000ms) for
  GET requests on network errors and 5xx responses; mutating methods are
  not retried since they are not idempotent
- api.js: add offline indicator — fixed pill banner appears at bottom of
  page when navigator goes offline, disappears when back online
- style.css: add styles for offline banner and session expiry warning
- auth.js: show amber warning banner below nav when session expires within
  24 hours (with exact hours remaining); dismissible with X button
- auth.js: fix password min-length client-side check from 6 to 10 to
  match the backend
- log.js, flock.js, budget.js: disable submit button during async request
  and re-enable in finally block to prevent double-submits and make loading
  state visible
- dashboard.js: fix chart date labels to use user's configured timezone
  instead of the browser's local timezone

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-18 00:09:36 -07:00
parent 60fed6d464
commit ce1e9c5134
7 changed files with 122 additions and 17 deletions

View File

@@ -97,6 +97,7 @@ document.addEventListener('DOMContentLoaded', () => {
form.addEventListener('submit', async (e) => {
e.preventDefault();
const btn = form.querySelector('[type=submit]');
const data = {
date: document.getElementById('date').value,
@@ -104,6 +105,7 @@ document.addEventListener('DOMContentLoaded', () => {
notes: document.getElementById('notes').value.trim() || null,
};
btn.disabled = true;
try {
await API.post('/api/flock', data);
showMessage(msg, 'Flock change saved!');
@@ -112,6 +114,8 @@ document.addEventListener('DOMContentLoaded', () => {
loadFlock();
} catch (err) {
showMessage(msg, `Error: ${err.message}`, 'error');
} finally {
btn.disabled = false;
}
});