Ka-Note/docs/feature-meetings.md

93 lines
3.4 KiB
Markdown

# Feature: Meetings (einmalige Termine)
## Überblick
Neben den wiederkehrenden **Jour-Fixes** können einzelne, einmalige Meetings
direkt im Daily Log erfasst und dokumentiert werden. Meetings sind an einen
konkreten Tag gebunden und enthalten Uhrzeit, Teilnehmer und ein freies
Markdown-Notizfeld.
## Unterschied zu Jour-Fixes
| | Jour-Fix | Meeting |
|---|---|---|
| Wiederkehrend | Ja | Nein |
| Themen (Topics) | Ja, mit Historisierung | Nein |
| Notizen | HistoryEntry pro Thema & Datum | Ein Markdown-Feld, wird überschrieben |
| Teilnehmer | Nicht strukturiert | Explizites Feld |
| Uhrzeit | Nicht strukturiert | Pflichtfeld |
| Sichtbar in Sidebar | Ja (Favoriten) | Nein |
| Stammdaten | Ja (AgendaContext type='meeting') | Ja (AgendaContext type='event') |
## Datenmodell
Meetings werden als `AgendaContext` mit `type='event'` gespeichert.
Metadaten liegen im `meta`-Feld als `EventMeta`:
```typescript
interface EventMeta {
date: string; // YYYY-MM-DD
time: string; // HH:MM
participants: string[]; // Klarnamen, ohne @-Präfix
}
```
Die Notizen werden als ein einzelner `HistoryEntry` unter einem
`__notes__`-Topic (`{contextId}-notes`) gespeichert. Beim Speichern
wird der vorhandene Eintrag überschrieben — keine Versionierung.
## Bedienung
### Meeting anlegen
**Variante 1 — Daily Log:**
1. Im Daily Log den gewünschten Tag auswählen
2. Auf **+ Meeting** (rechts über der Meetings-Sektion) klicken
3. Titel, Uhrzeit und Teilnehmer eingeben
4. **Erstellen** klicken
**Variante 2 — CommandBar:**
- `/meeting <Titel>` eingeben → Meeting für heute wird angelegt
Die Uhrzeit wird beim Öffnen des Formulars mit der aktuellen Uhrzeit vorausgefüllt.
### Teilnehmer eingeben
Das Teilnehmerfeld unterstützt `@mention`-Syntax:
- `@` tippen → Dropdown mit Personen aus der Datenbank
- Personen mit Leerzeichen im Namen werden automatisch gequotet: `@"Max Müller"`
- Mehrere Teilnehmer durch Leerzeichen trennen: `@Anna @"Max Müller"`
- Die Teilnehmer-Badges in der Ansicht sind klickbar → Absprung zur Person
### Notizen erfassen
- Klick auf den Notizbereich öffnet den Markdown-Editor
- `@mention`, `@P:Projekt`, `@F:Firma`-Verlinkungen funktionieren wie überall
- **Ctrl+S** oder **Speichern**-Button zum Sichern
### Meeting bearbeiten
Beim Hover über die Meeting-Karte erscheinen ✏️ und 🗑️:
- ✏️ öffnet das Bearbeitungsformular für Titel, Uhrzeit und Teilnehmer
- 🗑️ löscht das Meeting (Soft-Delete, wiederherstellbar über Papierkorb)
## Technische Details
- Meetings erscheinen **nur im Daily Log** unter dem jeweiligen Datum
- Sie erscheinen **nicht** in der Sidebar und nicht in der Kontext-Navigation
- Der Sync läuft über den bestehenden `contexts`-Kanal — keine zusätzlichen
Sync-Endpunkte erforderlich
- Soft-Delete cascadiert auf das Notes-Topic und den HistoryEntry
## Relevante Dateien
| Datei | Zweck |
|---|---|
| `shared/src/types.ts` | `EventMeta`, `ContextType = '...\|event'` |
| `client/src/lib/db/repositories.ts` | `createEvent`, `updateEvent`, `updateEventNotes`, `getEventsForDate` |
| `client/src/lib/stores/agenda.ts` | `eventsForDate(date)` liveQuery |
| `client/src/lib/components/EventCard.svelte` | Meeting-Karte (Anzeige + Bearbeitung) |
| `client/src/lib/components/JournalView.svelte` | Integration im Daily Log |
| `client/src/lib/components/CommandBar.svelte` | `/meeting`-Befehl |
| `server/src/db/schema.ts` | `type` Enum um `'event'` erweitert |