- Restore migration order: remove spurious v30 birthday-reminders entry
inserted before CardDAV (v30) and birthday-reminders (v31), which caused
a duplicate v31 on fresh installs
- Restore birthdayReminderAt() offsetMin handling (regression from merge)
- Fix check-in INSERT: check_out was set to checkIn instead of NULL,
making sessions invisible to loadOpenSession (IS NULL query)
- Implement check-out path in toggleSession() — only check-in was reachable
- Wrap GET /task-templates in try/catch per project convention
- Fix DELETE response envelopes: { ok: true } → { data: ... }
- Remove housekeeping worker exclusion from GET /auth/users
- Replace toISOString() with local-date helper to avoid UTC date shift
- Use user currency preference in money() instead of hardcoded BRL
- Replace hardcoded #7C3AED fallbacks in style attrs with CSS token
- Add German translations for documents folder and settings housekeeping keys
- Remove DESIGN.md and IMPLEMENTATION.md (AI planning artifacts)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The onSave callback was being executed immediately on modal open (its
purpose is to wire up event listeners), causing the required-fields
error to appear instantly and leaving the form with no way to submit.
Both forms now include modal-actions buttons in the content HTML, and
onSave correctly attaches a submit event listener instead of running
validation directly.
Fixes#128
Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
- DB migration v32: task_assignments and event_assignments join tables
with CASCADE delete; existing assigned_to data migrated automatically
- Tasks API: accepts assigned_to as array, returns assigned_users[]
with json_group_array; filter uses EXISTS on task_assignments
- Calendar API: same pattern via event_assignments; serializeEvent
includes assigned_users array
- Recurring task completion copies all assignments to the new instance
- Frontend: shared UserMultiSelect component with avatar stack display
(renderAvatarStack, renderUserMultiSelect, getSelectedUserIds,
bindUserMultiSelect); tasks.js and calendar.js use it in modals
and card/agenda views
- CSS: user-multi-select.css with avatar-stack and user-ms classes
- 14 new tests covering CRUD, JSON aggregation, EXISTS filter,
and CASCADE behavior for both task and event assignments
Closes#125
Extracts the tab-bar UI into a reusable renderSubTabs() utility
(public/utils/sub-tabs.js + public/styles/sub-tabs.css) so all
sub-module navigation shares one implementation and visual style.
- Settings: replaces template-literal <nav class="settings-tabs">
with renderSubTabs(); tabs now show icon + label (pill-style),
group separators via separatorBefore, panel switching via onChange
- Kitchen: renderKitchenTabsBar() becomes a thin wrapper around
renderSubTabs(); kitchen-tabs.css keeps only layout adjustment rules
- CSS: kitchen-tab* rules removed from kitchen-tabs.css,
settings-tab-btn* rules removed from settings.css; both now
inherit from sub-tabs.css
- tokens.css: adds --sub-tabs-height (52px default;
kitchen overrides to --kitchen-tabs-height: 56px)
- test-browser-loader.mjs: resolves browser-absolute /utils/*.js
imports to public/ directory for Node test compatibility
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Open standards (CalDAV, CardDAV, ICS) now appear first in the Sync tab
under a dedicated "CalDAV & CardDAV" section, making self-hosted sync
options prominent. Cloud services (Google, Apple) move to a secondary
"Cloud-Dienste" section. Fixes raw <h2> heading in CalDAV card — now
uses consistent settings-card__title like all other cards.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- modal.js: add onClose callback to openModal(), fix _initialFormTimeout
cleanup, deduplicate escape/overlay-click handlers in confirmModal,
promptModal, selectModal using the new callback
- calendar.js: replace popup.innerHTML with insertAdjacentHTML (constraint),
add truncateDescription() to cap long event descriptions at 500 chars
- validate.js: extend DATETIME_RE to cover ISO 8601 with ms/timezone,
normalise datetime values to YYYY-MM-DDTHH:MM on input
- index.js: include app version in startup log message
- docker-compose.yml / .env.example: switch from named volume to
host-mounted DATA_DIR/BACKUP_DIR with sane defaults
- docs/installation.md: document host-mount data paths
Co-Authored-By: Rafael Foster <rafaelfoster@users.noreply.github.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Füge Documents, Recipes und Birthdays zu Feature-Grid hinzu (8 statt 6 Features für ausgewogene 4+4 Darstellung)
- Aktualisiere Calendar-Sync-Beschreibung mit CalDAV-Anbietern und ICS-Subscriptions
- Aktualisiere Budget (15 Währungen, Loan-Tracking), Contacts (CardDAV-Sync), Notes (Markdown-Support)
- Entferne Kanban Board aus Grid (bereits Teil von Task Management)
- Ergänze alle Übersetzungen (EN/DE) für neue und aktualisierte Features
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Implement modern design with DM Serif Display + DM Sans fonts
- Switch accent color to purple/violet (#6C3AED / #A78BFA)
- Add hero section with desktop + mobile mockups
- Add feature showcase with alternating layouts
- Add screenshot carousel
- Update all screenshots to new versions
- Maintain dark/light mode and EN/DE language support
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Improved content flow by showing screenshots (Preview section) before the Features section, giving visitors a visual first impression before diving into the feature list.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace old screenshots with new ones showing updated dashboard design and weather widget. Update README to display mobile + desktop side-by-side, regenerate social preview images with new dashboard screenshot.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Root cause: loadCalDAVAccounts and loadCardDAVAccounts were defined
inside the render function but called from bindIcsEvents (outside render),
causing ReferenceError when accessing Settings page.
Changes:
- Move loadCalDAVAccounts and loadCardDAVAccounts to top-level functions
- Add user parameter to both functions (no longer in render scope)
- Update all recursive calls to pass user parameter
- Move initial load code from bindIcsEvents to render function
Fixes the "loadCalDAVAccounts is not defined" error in v0.47.0.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add support for customizable birthday reminders with preset offsets
(none, at time, 15min, 1h, 1d, 2d, 1w, 2w) and custom intervals.
Users can now configure when to be reminded of upcoming birthdays.
- Add migration 31: reminder_offset, reminder_custom_amount, reminder_custom_unit to birthdays table
- Update POST/PUT /birthdays routes to accept reminder fields
- Add getOffsetMinutes() helper in birthday service
- Update birthdayReminderAt() to calculate reminder time with offset
- Modify syncBirthdayReminder() to handle empty offset (no reminder)
- Add renderBirthdayReminderSection() UI component
- Move reminder-custom CSS from calendar.css to reminders.css
- Add protocol check to service worker (non-http protocol guard)
All translations already present in de.json.
Tests: 109 passing, 0 failing.
Co-Authored-By: Rafael Foster <rafaelfoster@users.noreply.github.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Remove CardDAV v0.45.0 session tracking document. Information is
preserved in git history, CHANGELOG.md, and archived design docs.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Design document for comprehensive repository and documentation
maintenance after v0.45.0 release. Covers archiving strategy for
implemented plans/specs, BACKLOG/CHANGELOG updates, and README
improvements.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Import and mount cardavRouter with requireAuth middleware. All
CardDAV management routes now accessible under /api/v1/contacts/cardav.
Router mounted BEFORE contacts router to ensure /api/v1/contacts/cardav
paths match before /api/v1/contacts.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>