onSave(panel) is a setup hook, not a submit handler. Bind the form's
submit event inside it and call closeModal({ force: true }) on success.
Also add explicit submit/cancel buttons to the modal content.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a pencil-icon edit button to each ICS subscription row. Clicking it
opens a modal to update name, color, and shared visibility via PATCH
/calendar/subscriptions/:id. Adds updatedToast i18n key to all 15 locales.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Birthday date inputs in Settings (profile, new member, edit member) and
the Birthdays page were using type="text" with a custom mask, which
suppresses the native iOS date picker wheel. Switching to type="date"
with a plain ISO value restores the native picker while keeping the
existing parseDateInput / isDateInputValid logic intact.
Closes#98
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Family member records now store phone, email, and birthday, auto-synced
to Contacts and Birthdays modules (PR #99 by @rafaelfoster)
- Settings gets dedicated Family and API Tokens tabs (admin-only)
- Avatar editor redesigned with icon buttons; tab bar fits standard width
- Dentist calendar icon normalised to 'tooth'; theme reset bug fixed
- i18n: missing family field translations added to 12 locales
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Zeigt automatisch wenn navigator.onLine === false.
Blendet sich aus sobald Verbindung wiederhergestellt.
reminders.css aus globalem <link> entfernt (wird lazy geladen).
- Removed the KPI tiles section from renderDashboardOverview: it showed
Tasks/Calendar/Birthdays/etc. counts in a bar at the top, duplicating
the full widgets directly below it
- Replaced the main/side two-column workspace layout with the established
flat dashboard__grid so all widgets align consistently in the web view
- Removed now-unused renderKpiTile function and stats/today locals
- Skeleton updated to match the simplified layout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- router.js: route-announcer used bare `path` variable which is not in scope
inside renderPage(); replaced with `route.path`
- dashboard.js: shoppingLists query used `HAVING open_count > 0` without GROUP BY;
SQLite rejects this — replaced with a WHERE subquery
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Birthdays module: CRUD with calendar/reminder auto-sync, photo upload, age notes
- Add DB migration 18 (birthdays table with calendar_event_id, trigger, indexes)
- Add dashboard widgets: birthdays, family participants, budget overview
- Add Settings > General: admins can set a custom app name (reflected in title/sidebar/login)
- Improve service worker: network-first caching for mutable JS/CSS assets
- Add translations for 16 locales (birthday keys)
Fixes applied during integration:
- innerHTML replaced with insertAdjacentHTML/replaceChildren throughout birthdays.js and dashboard.js
- docker-compose.yml personal dev changes reverted
Co-authored-by: Rafael Foster <rafaelgfoster@gmail.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- birthdays.js: all innerHTML writes replaced with replaceChildren() + insertAdjacentHTML()
- dashboard.js: shell.innerHTML replaced with replaceChildren() + insertAdjacentHTML()
- docker-compose.yml: revert port to 3000 and restore image line (were personal dev changes)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>