Commit Graph

17 Commits

Author SHA1 Message Date
Thomas Richter
c92aec14d3 feat: auto-cleanup orphaned tags when removed from entries
Tags that are no longer associated with any entry are automatically
deleted from the database when a tag is removed from an entry.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 23:13:50 +01:00
Thomas Richter
b00d71956e fix: explicit tag scanning with delete UI
- Remove auto-parsing on collapse
- Add "Scan for #tags" button that parses from current textarea content
- Always show tags section with delete buttons
- Show help text when no tags exist

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 22:41:35 +01:00
Thomas Richter
79c9b12702 fix: parse hashtags only on blur/submit, add tag delete UI
- Parse hashtags when content textarea loses focus (blur)
- Parse hashtags when QuickCapture form is submitted
- Add tag display with delete buttons in expanded entry view
- Remove automatic hashtag parsing during typing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 22:27:02 +01:00
Thomas Richter
ce07d79652 feat: parse hashtags from content instead of dedicated tag input
Tags are now automatically extracted from #hashtags in content text.
Removed TagInput from entry editing, keeping it only in FilterBar.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 21:59:04 +01:00
Thomas Richter
de09b14239 feat(06-02): create health check endpoint
- Returns 200 'ok' when database is accessible
- Returns 503 'unhealthy' when database query fails
- Simple text response for Docker HEALTHCHECK
2026-02-01 13:23:12 +01:00
Thomas Richter
bb1e64ad2b feat(05-03): add highlighting to EntryCard and integrate search UI
- Add searchQuery prop to EntryCard for text highlighting
- Use {@html highlightText()} for title and content in collapsed view
- Integrate SearchBar and FilterBar in +page.svelte
- Add search/filter state with reactive sync to filters.query
- Pass recentSearches store to SearchBar
- Update filterEntries to use generics for type preservation
2026-01-31 17:18:55 +01:00
Thomas Richter
0c1a66b4c6 feat(04-03): create TagInput component and integrate into EntryCard
- Create TagInput.svelte with Svelecte for multi-select autocomplete
- Support creating new tags inline via creatable mode
- Display tags on collapsed entry cards (max 3 with +N indicator)
- Add TagInput in expanded view for editing entry tags
- Pass availableTags through EntryList to EntryCard
- Handle tag changes with immediate save via updateTags action
2026-01-31 13:09:34 +01:00
Thomas Richter
cfdb804118 feat(04-03): install Svelecte and add tag support to load/actions
- Install svelecte package for tag input with autocomplete
- Import tagRepository in +page.server.ts
- Attach tags to entries in load function alongside images
- Return allTags for autocomplete suggestions
- Add updateTags action to update entry tags via JSON payload
2026-01-31 13:07:08 +01:00
Thomas Richter
a232a95ced feat(04-02): add togglePin and updateDueDate form actions
- Add togglePin action to toggle entry.pinned boolean state
- Add updateDueDate action to set/clear entry.dueDate
- Both actions validate entry exists before updating
2026-01-31 13:02:55 +01:00
Thomas Richter
b239862854 feat(03-04): add deleteImage form action
- Delete image files from filesystem (original + thumbnail)
- Delete image record from database
- Continue database deletion even if file deletion fails
- Returns success after cleanup
2026-01-29 15:33:18 +01:00
Thomas Richter
de3aa5ac4e feat(03-02): add uploadImage form action with thumbnail generation
- Add uploadImage action that handles multipart file uploads
- Validate file type and entry existence before processing
- Generate thumbnail using Sharp with EXIF rotation
- Save original and thumbnail to filesystem
- Store image metadata in database
- Return entries with their images attached from load function
2026-01-29 15:27:12 +01:00
Thomas Richter
b3640e78a1 feat(03-01): add API endpoints for serving images
- Add GET /api/images/[id] for original images
- Add GET /api/images/[id]/thumbnail for thumbnails
- Both endpoints return 404 for missing images
- Immutable cache headers for CDN optimization
2026-01-29 15:23:33 +01:00
Thomas Richter
fc7c1f6c98 feat(02-03): add CompletedToggle to show/hide completed tasks
- Create CompletedToggle component with checkbox UI
- Add showCompleted URL param to +page.server.ts load function
- Update +page.svelte to sync preferences with URL
- Toggle state persists in localStorage via preferences store
- Clicking toggle updates URL and invalidates data for server filter
2026-01-29 11:12:51 +01:00
Thomas Richter
fed184828e feat(02-02): add QuickCapture component and integrate main page
- QuickCapture fixed at bottom with type selector and submit button
- Uses enhance for progressive form enhancement
- Persists last used type via preferences store
- Clears form on successful submit
- Main page composes EntryList and QuickCapture
- Adequate bottom padding (pb-40) for capture bar clearance
- Sticky header with app title

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:07:51 +01:00
Thomas Richter
9a449228b7 feat(02-01): add CRUD form actions
- Add create action with content validation (title optional, type defaults to thought)
- Add update action with field-by-field updates and validation
- Add delete action with existence check
- Add toggleComplete action to toggle between open/done
- Use getOrdered() in load function for tasks-first ordering
- Update page component to use new data structure
2026-01-29 11:02:43 +01:00
Thomas Richter
d7c7e9448d feat(01-02): add data directory, server hooks, and verification page
- Create data/ directory with attachments/ subdirectory and .gitkeep files
- Update .gitignore to track .gitkeep but ignore database files
- Server hooks initialize database on first request
- Page server load fetches entries and creates test entry if none exist
- Verification page shows database status, entry count, and recent entries
2026-01-29 04:38:44 +01:00
Thomas Richter
3a2e0f2e01 feat(01-01): create SvelteKit project with dependencies
- SvelteKit minimal template with TypeScript
- Tailwind CSS v4 with @tailwindcss/vite plugin
- ESLint and Prettier for code quality
- Dependencies: better-sqlite3, drizzle-orm, nanoid, zod
- Dev server runs on localhost:5173
2026-01-29 04:32:54 +01:00