❤️ Favoritter vs 📅 Mit Program
| Aspekt | ❤️ Favoritter | 📅 Mit Program |
|---|---|---|
| Formål | "Jeg vil gerne besøge denne aktivitet" | "Jeg vil deltage på dette specifikke tidspunkt" |
| Target CPT | ug_modules | tidspunkt |
| UI Component | HeartButton.ts | CalendarButton.ts |
| Service | FavoritesService.ts | ProgramService.ts |
| State | myFavorites: Set<number> | myProgram: Set<number> |
| Dexie Tabel | favorites + favoriteLog | program + programLog |
| UI Pattern | Simpel toggle (on/off) | Dropdown med flere tidspunkter |
| Ekstra Feature | — | getConflicts() - overlap detection |
| Ikon | ♡ → ❤️ | 📅+ → ✅📅 |
UI Components
Web Awesome + Custom Components
FavoritesUI.ts
Hovedcontainer, render loop
GlobalTabs.ts
Tab: Favoritter | Program
HeartButton.ts
❤️ Toggle med event delegation
CalendarButton.ts
📅 Dropdown med tidspunkter
ListView.ts
Vertikal liste af udstillere
ProgramView.ts
Tidslinje grupperet efter dag
State Manager
Pub/Sub pattern med requestAnimationFrame batching
StateManager.ts
Central state, listeners, persistence
myFavorites
Set<number> - module IDs
myProgram
Set<number> - tidspunkt IDs
activeTab
"favorites" | "program"
State Preview
Services
Business logic og sync
FavoritesService.ts
toggle(), get(), notifyListeners()
ProgramService.ts
toggle(), getConflicts()
SyncManager.ts
Batch sync for begge systemer
UserService.ts
UUID, device tracking
❤️ Favorit Flow
1 Klik HeartButton
↓
2 FavoritesService.toggle(moduleId)
↓
3 db.favorites.put()
↓
4 updateMyFavorites()
📅 Program Flow
1 Klik CalendarButton
↓
2 ProgramService.toggle(tidspunktId)
↓
3 db.program.put()
↓
4 updateMyProgram()
Database (Dexie/IndexedDB)
Offline-first lokal storage
favorites
odba userId_postId
postId (ug_modules ID)
isFavorite, synced
favoriteLog
++id auto
postId, loggedAt
deviceId, synced
program
odba userId_tidspunktId
tidspunktId (tidspunkt ID)
isInProgram, synced
programLog
++id auto
tidspunktId, loggedAt
deviceId, synced
syncQueue
++id
action: favorite | add_program
payload, retries
user / device
userId (UUID)
friendToken
deviceId
🖥️ Faktisk UI Implementering
Live data fra program.bogforum.dk (Bogforum 2025)
ListView.ts → ExhibitorCard.ts + HeartButton.ts (ingen CalendarButton - udstillere har ikke tidspunkter)
Bogforum 2025 • 156 udstillere
Gyldendal
Danmarks største forlag med skønlitteratur, fagbøger og børnebøger
Politikens Forlag
SynkroniseretKvalitetslitteratur, kogebøger og livsstil fra Politikens hus
❤️ Fra dine favoritter
Vild med Broderi
124 broderikunstnere har skabt 174 unikke værker der fortolker H.C. Andersens eventyr
Casper Richter – Tegner og Illustrator
Tegneserie- og illustratorkunstner specialiseret i fantasy og sci-fi
ListView.ts → AuthorCard.ts + HeartButton.ts (forfattere er en separat CPT: forfatter)
Bogforum 2025 • 243 forfattere
ListView.ts → ExhibitorCard.ts + HeartButton.ts + CalendarButton.ts (aktiviteter HAR tidspunkter)
Bogforum 2025 • 89 programpunkter
Forfattersignering med Sara Blædel
SynkroniseretSignering med Sara Blædel, aktuelt med krimien 'ILKA - Jagten på Anita'
❤️ Fra dine favoritter
📅 Tidspunkter (1)
Lørdag
15:00-15:30 • Stand 4-002
Møde forfatteren Gunvor Maria Juul
Venter syncMadhistoriker præsenterer 'Middag med H.C. Andersen' - om eventyrdigterens spisevaner
📅 Tidspunkter (1)
Søndag
13:00-15:00 • Stand 2-006
Virkelighedens vikinger
Peter Herning fortæller og læser op fra 'Den anden konge' om vikingetidens ledere
📅 Tidspunkter (2)
Lørdag
15:00-15:30 • Stand 2-064
Søndag
15:00-15:30 • Stand 2-064
⚠️ Overlap med Sara Blædel
Signering – Lukas Birch
Signering af 'Revyens Røverhistorier' (guldudgave) + særlig boksæt med spillekort
📅 Tidspunkter (1)
Lørdag
13:30-14:00 • Stand 2-016
ProgramView.ts → Dag-grupperet visning af tilføjede programpunkter med conflict detection
Dit program er tomt
Gå til Program og tilføj aktiviteter ved at klikke på 📅-ikonet
🔍 Live State (simuleret)
myFavorites:
Set([])
myProgram:
Set([])
conflicts:
[]
pendingSync:
0