Commit Graph

788 Commits

Author SHA1 Message Date
Ulas Kalayci b545d83f64 fix: modal onClose callback, calendar popup truncation, datetime validation
- 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>
2026-05-06 07:00:07 +02:00
Ulas Kalayci 56b2fd471d chore: release v0.47.3 2026-05-06 01:45:38 +02:00
Ulas Kalayci d7cae21063 docs: archive cleanup plan, update SPEC and README for v0.45–v0.47
- Archive docs/designs/2026-05-04-repo-cleanup-design.md to docs/archive/designs/
- Remove docs/designs/2026-05-04-settings-sidebar-demo.html (implemented)
- SPEC.md: add CardDAV Accounts and CardDAV Addressbook Selection tables
- SPEC.md: expand Contacts table with multi-value fields, CardDAV columns, and
  new contact_phones / contact_emails / contact_addresses sub-tables
- SPEC.md: add birthday reminder_offset columns (v0.46.0)
- SPEC.md: update External Calendars table (apple→caldav migration note)
- SPEC.md: update Tasks module (bulk actions, v0.42.0)
- SPEC.md: update Contacts module (CardDAV multi-account sync, multi-value fields)
- SPEC.md: update Birthdays module (flexible reminder offsets, v0.46.0)
- SPEC.md: update Settings module (Synchronization tab, module toggles, scheduled
  backups, CardDAV UI, correct tab count and names)
- README.md: update Birthdays row (flexible reminder offsets)
- README.md: update Backup row (automatic scheduled backups)
- .gitignore: exclude screenshot scripts, seed scripts, backup files,
  docs/github-pages/ staging folder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 01:45:00 +02:00
Ulas Kalayci 9acb10ab1d Passe GitHub Pages Installationsguide an neues Design an
- DM Sans + DM Serif Display statt Fraunces
- Purple Farbschema (#6C3AED) statt Blue (#2563EB)
- CSS-Variablen konsistent mit index.html (--ff-display, --text-1, --border)
- Logo SVG: Purple Gradient
- i18n: data-t statt data-i18n (inkl. JavaScript-Anpassung)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-06 01:37:18 +02:00
Ulas Kalayci 12ec14af7b Erweitere GitHub Pages Features und aktualisiere Beschreibungen
- 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>
2026-05-05 13:06:54 +02:00
Ulas Kalayci 704e75260f Füge Puppeteer als dev dependency hinzu für Screenshot-Generierung
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 12:55:36 +02:00
Ulas Kalayci d00bb0aaa8 Redesign GitHub Pages: Hero-Layout, Sektionsreihenfolge, Dark Mode Farben
- Hero: Tablet-Screenshot neben Überschrift platziert, mobile Screenshot entfernt
- Grid-Layout für Hero-Bereich (Text links, Bild rechts)
- Sektionsreihenfolge: "Your Data. Your Private Place" vor "Features"
- Dark Mode Farben an App-Design angepasst (aus tokens.css):
  - Neutral-Skala: #1A1A18, #222220 statt #111015, #222130
  - Akzent: #818CF8 (Indigo-400) statt #A78BFA
  - Konsistente Farbgebung mit der App
- Responsive Design für neues Layout angepasst

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 12:55:30 +02:00
Ulas Kalayci 82f1a76a5d Update GitHub Page design and screenshots
- 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>
2026-05-05 12:36:20 +02:00
Ulas Kalayci dd5ba80541 Reorder GitHub Pages sections: Preview before Features
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>
2026-05-05 11:29:11 +02:00
Ulas Kalayci f1dd8e5161 docs: update screenshots to reflect current UI state
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>
2026-05-05 11:22:37 +02:00
Ulas Kalayci 289b079f47 chore: bump version to 0.47.2
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-05 07:06:29 +02:00
dependabot[bot] 46aa5774e8 chore(deps): bump the production-dependencies group with 2 updates (#124)
Bumps the production-dependencies group with 2 updates: [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) and [tsdav](https://github.com/natelindev/tsdav).


Updates `express-rate-limit` from 8.4.1 to 8.5.0
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Commits](https://github.com/express-rate-limit/express-rate-limit/compare/v8.4.1...v8.5.0)

Updates `tsdav` from 2.1.8 to 2.2.0
- [Release notes](https://github.com/natelindev/tsdav/releases)
- [Changelog](https://github.com/natelindev/tsdav/blob/main/CHANGELOG.md)
- [Commits](https://github.com/natelindev/tsdav/compare/v2.1.8...v2.2.0)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-version: 8.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
- dependency-name: tsdav
  dependency-version: 2.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: production-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 07:04:14 +02:00
Ulas Kalayci fd5423f6c5 chore: bump version to 0.47.1
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 22:28:17 +02:00
Ulas Kalayci bc61311ebc fix(settings): resolve scope error for CalDAV/CardDAV load functions
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>
2026-05-04 22:27:48 +02:00
Ulas Kalayci 10ef7006cd chore: bump version to v0.47.0
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 21:51:21 +02:00
Ulas Kalayci 6cdef0102c feat(settings): add dedicated Sync tab with CardDAV contacts integration
- Rename Calendar tab to Synchronization with two sections:
  * Calendar Sync (Google, Apple, CalDAV, ICS)
  * Contact Sync (CardDAV) - NEW
- Add visual tab grouping with CSS separators between sections
- Implement CardDAV account management UI:
  * Add/delete accounts
  * Enable/disable addressbooks
  * Manual sync trigger
  * Connection testing
- Add UX improvements:
  * Status badges (success/error/syncing)
  * Empty states with onboarding
  * Inline help tooltips (prepared)
  * Breadcrumb navigation (prepared)
- Update i18n keys in all 14 locales
- All 109 tests passing

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 21:50:59 +02:00
Ulas Kalayci 43225ee20c chore: bump version to v0.46.0 2026-05-04 20:32:26 +02:00
Ulas Kalayci 83d816c01b Merge branch 'feature/birthday-reminders' 2026-05-04 20:31:48 +02:00
Ulas Kalayci 82a1f2c239 feat: add flexible reminder options for birthdays
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>
2026-05-04 20:31:42 +02:00
Ulas Kalayci df45fba70e docs: update README Contacts module description
Reflect v0.45.0 CardDAV multi-account sync and multi-value contact
fields (multiple phones/emails/addresses per contact).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:10:30 +02:00
Ulas Kalayci 84664279c3 docs: update BACKLOG and remove emojis from CHANGELOG
- BACKLOG.md: remove BL-11 (implemented in v0.45.0), strip "Completed
  Features" section (CHANGELOG is authoritative source)
- CHANGELOG.md: no emojis found (already clean)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:10:11 +02:00
Ulas Kalayci 601d136a70 docs: remove session-specific PROGRESS.md
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>
2026-05-04 20:09:31 +02:00
Ulas Kalayci dd16078f7a docs: archive implemented plans, specs, and design documents
Move completed implementation plans (2026-04-20), design specs,
and audit documents to docs/archive/ for historical reference
while keeping the main docs/ directory focused on active
documentation.

Archived:
- 1 implementation plan (superpowers/plans/)
- 2 design specs (superpowers/specs/)
- 3 design documents (designs/)
- 5 audit/proposal documents (root level)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 20:09:23 +02:00
Ulas Kalayci 7349037880 docs: add repo cleanup design specification
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>
2026-05-04 20:06:44 +02:00
Ulas Kalayci d371e2b554 chore: release v0.45.0
CardDAV contacts integration with multi-value fields

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 19:11:20 +02:00
Ulas Kalayci 9c4f876c5b Merge branch 'feature/cardav-contacts'
# Conflicts:
#	package-lock.json
2026-05-04 19:10:13 +02:00
Ulas Kalayci fe0254e225 docs: update PROGRESS.md - all 15 tasks completed
Tasks 14-15 documentation:
- Task 14: OpenAPI routes documented (d0eb638)
- Task 15: CardDAV router mounted (8891097)

All 109 tests passing across 20 suites.
Implementation ready for final review and release.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:39:19 +02:00
Ulas Kalayci 8891097c7b feat(server): mount CardDAV router at /api/v1/contacts/cardav
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>
2026-05-04 18:37:56 +02:00
Ulas Kalayci d0eb63840f docs(openapi): add CardDAV routes and update contacts routes
Document 8 CardDAV management routes (accounts, addressbooks, sync)
and update 3 existing contacts routes to reflect multi-value field
support.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:37:05 +02:00
ulsklyc 8f87b295e9 Update FUNDING.yml 2026-05-04 18:33:28 +02:00
Ulas Kalayci 0dc303b81a feat(contacts): add multi-value fields support to PUT /contacts/:id
Extend PUT /contacts/:id route to support updating phones, emails, and
addresses arrays with replacement semantics. Uses atomic transactions
to DELETE all existing multi-values then INSERT new ones. Validates
all multi-value fields before updating. Response includes full contact
with multi-value fields via loadMultiValueFields() helper.

Backward compatible: multi-value fields only replaced when present in
request body. Scalar fields (name, category, etc.) continue to work
independently.

Tests added:
- Update with multi-value fields (replacement semantics verified)
- Validation error on invalid phone data (400)
- Backward compatibility: update without multi-values preserves them

All 109 tests pass.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:31:01 +02:00
ulsklyc 3a8a7dd3b0 Update Buy Me a Coffee username in FUNDING.yml 2026-05-04 18:29:58 +02:00
Ulas Kalayci 9e346dca5f docs: update PROGRESS.md for Task 12 completion 2026-05-04 18:25:30 +02:00
Ulas Kalayci 966a6d46e3 feat(contacts): add POST /contacts with multi-value fields
Implements Task 12: Extend POST /contacts to accept and persist phones,
emails, and addresses arrays. Uses atomic transactions to ensure all
related records are created together or rolled back on error.

- Validation: validatePhones/Emails/Addresses before insert
- Transaction: db.transaction() for atomic Contact + Multi-Values
- Backward compatible: Multi-value fields are optional
- Refactoring: Extracted loadMultiValueFields() helper (DRY)
- Response includes all multi-value fields with generated IDs

Tests: 3 new tests (create with multi-values, validation, backward compat)
TDD workflow: RED → GREEN → REFACTOR → Commit

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:25:18 +02:00
Ulas Kalayci 859a205299 docs: update PROGRESS.md for Task 11 completion 2026-05-04 18:18:38 +02:00
Ulas Kalayci fe8af33568 feat(contacts): add GET /contacts/:id with multi-value fields
Implements Task 11: Extend GET /contacts/:id to include phones, emails,
and addresses arrays. Each multi-value field is queried from its respective
table (contact_phones, contact_emails, contact_addresses) and mapped to
camelCase response format with isPrimary boolean conversion.

Tests: 2 new tests (contact with multi-values, empty arrays)
TDD workflow: RED → GREEN → Commit

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 18:18:07 +02:00
Ulas Kalayci 6e02c9e5b6 docs: session 2 handoff - Tasks 9-10 complete, ready for Task 11
Session 2 Summary:
- Task 9: PUT /addressbooks/:id (toggle enabled/disabled)
- Task 10: POST /accounts/:id/sync (with _mockSyncAccount)
- 101 tests passing (16 suites)
- Ready for Task 11: GET /contacts/:id with multi-value fields

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:57:41 +02:00
Ulas Kalayci 112cf55e66 docs: update PROGRESS.md for completed Task 10
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:54:45 +02:00
Ulas Kalayci 674fe796b3 feat(cardav): implement POST /accounts/:id/sync endpoint
Adds route to sync all enabled addressbooks for an account with mock support for tests.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:54:03 +02:00
Ulas Kalayci f895776911 docs: update PROGRESS.md for completed Task 9
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:47:55 +02:00
Ulas Kalayci 9ec7fda6b0 feat(cardav): implement PUT /addressbooks/:id endpoint
Adds route to toggle addressbook enabled/disabled state with bool validation.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:47:26 +02:00
Ulas Kalayci 749e6ac79b docs: update PROGRESS.md for Tasks 6-8 completion (session pause) 2026-05-04 17:36:57 +02:00
Ulas Kalayci 362f711290 feat(validate): add bool validator
Add boolean field validator for use in CardDAV addressbook toggle
route and other boolean validation needs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:13:54 +02:00
Ulas Kalayci c078a48884 feat(cardav): implement POST /accounts/:id/addressbooks/refresh endpoint
Add addressbook refresh route. Loads account from DB, delegates to
CardDAVSync.discoverAddressbooks() to run PROPFIND, then returns
updated addressbook list from DB.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:13:14 +02:00
Ulas Kalayci 12e8edf4c3 feat(cardav): implement GET /accounts/:id/addressbooks endpoint
Add addressbook listing route. Queries carddav_addressbook_selection
table directly, ordered by name. Returns empty array if account has
no addressbooks.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:11:53 +02:00
Ulas Kalayci 29646960fe docs: update PROGRESS.md for completed Task 5 2026-05-04 17:10:57 +02:00
Ulas Kalayci dd5ac8812c feat(cardav): implement POST /accounts/:id/test endpoint
Add connection test route. Loads account from DB and delegates to
CardDAVSync.testConnection() to verify credentials and discover
addressbooks without saving.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:10:25 +02:00
Ulas Kalayci 38fa84c3d4 docs: update PROGRESS.md for completed Task 4 2026-05-04 17:05:14 +02:00
Ulas Kalayci ca92cb2a86 feat(cardav): implement DELETE /accounts/:id endpoint
Add account deletion route with ID validation. Delegates to
CardDAVSync.deleteAccount() which cascades to addressbooks and
contacts via foreign key constraints.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:04:39 +02:00
Ulas Kalayci 39f3db99f7 docs: update progress after completing tasks 1-3
Tasks completed:
- Task 1: Multi-value validators (validatePhones, validateEmails, validateAddresses)
- Task 2: CardDAV router setup (GET /accounts)
- Task 3: POST /accounts endpoint

Test infrastructure established:
- _setTestDatabase/_resetTestDatabase for DB mocking
- _mockTestConnection for CardDAV API mocking
- 91 tests passing

Next: Task 4 (DELETE /accounts/:id)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-04 17:01:35 +02:00