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>
- 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).
- 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>
Shows a 3-screen modal overlay on first dashboard visit explaining key
features; dismissed state is persisted to localStorage so it never
reappears.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove .codex (Codex CLI artifact, not part of project)
- Restore CHANGELOG.md v0.23.17 entry (was deleted by contributor's fork)
- Restore version to 0.23.17 in package.json and package-lock.json
- Restore native translations for catFood, catLeisure, catEducation in ar, el,
hi, ja, ru, sv, tr, uk, zh (PR had replaced them with English strings)
- Replace Portuguese seed names in migration 16 with English (housing, food,
transport, personal_health, leisure, shopping_clothing, education,
financial_other and all subcategory display names)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: add missing i18n keys for nav, search, tasks, calendar, settings, reminders in all locales
Resolves#82
nav.more, calendar.ics.reset/resetToast, settings.ics.*, tasks.filter*,
tasks.swiped*, search.* and reminders.* keys were missing in all 14
non-German locale files, causing the app to fall back to German strings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: release v0.23.15
---------
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
When OPENWEATHER_UNITS=imperial, OpenWeatherMap returns wind speed in
mph directly — the server was incorrectly multiplying by 3.6 (m/s→km/h)
on top of that. All locale strings also hardcoded the unit label instead
of using a {{windUnit}} placeholder, so the label always read km/h.
Resolves#79
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Implemented new recipes page with UI for managing recipes.
- Added REST API routes for recipes including create, read, update, and delete operations.
- Introduced database schema for recipes and recipe ingredients.
- Updated meals to link with recipes, allowing meals to reference specific recipes.
- Enhanced validation for recipe-related fields in meals.
- Added styles for the recipes page and components.
Root cause: when auth.me() failed during initial navigation, the catch block
called navigate('/login') without clearing _pendingLoginRedirect. The outer
finally then fired a second concurrent navigate('/login'), which held
isNavigating=true while running. If the user submitted the login form (or
iCloud Keychain autofilled credentials) before the second navigation
completed, navigate('/', user) was silently blocked by the isNavigating guard —
login appeared to succeed but the app never advanced to the dashboard.
Fix: clear _pendingLoginRedirect in the catch block so the finally handler
does not spawn the duplicate navigation.
Also adds a GET /api/v1/version endpoint (no auth required) and shows the
version on the login page, so users can verify their PWA has received the
latest cached JS.
Resolves#68
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
innerHTML violates project convention (PostToolUse hook blocks it); use
replaceChildren with createElement/textContent instead. Also restore the
trailing newline removed from uk.json.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Ukrainian (uk) locale to SUPPORTED_LOCALES and locale picker
- Add public/locales/uk.json (622 keys, full Ukrainian translation)
- Add UAH (Ukrainian Hryvnia) to SUPPORTED_CURRENCIES and VALID_CURRENCIES
- Add CATEGORY_I18N map and catLabel() in settings.js to translate default
shopping category names in the settings panel; rename and delete dialogs
now also use the translated name instead of the raw German DB string
- Align server VALID_CURRENCIES with frontend: add missing AED, BRL, INR, SAR
Co-Authored-By: baragoon <baragoon@users.noreply.github.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>