diff --git a/docs/features/kalender.md b/docs/features/kalender.md index 5d942eb..2f6ed09 100644 --- a/docs/features/kalender.md +++ b/docs/features/kalender.md @@ -5,17 +5,24 @@ Månedsbasert kalendervisning for redaksjonell planlegging. Hendelser er nodes i kunnskapsgrafen og kan kobles til episoder, temaer, aktører og kanban-kort. Komplementerer Kanban ("hva" vs "når"). ## 2. Status -**PG-adapter ferdig og deployet (mars 2025).** Abonnement, ICS-eksport og SpacetimeDB-sync gjenstår. +**Kalendervisning implementert (mars 2026).** Bruker `scheduled`-edges i stedet for +separat `calendar_events`-tabell. Abonnement, ICS-eksport og SpacetimeDB-sync gjenstår. ### Implementert -- Migrering `0003_calendar.sql`: `calendars` + `calendar_events` (begge FK→nodes) -- Hendelser er nodes — tilgangsstyrt via `node_access`-matrise -- Heldagshendelser (`T12:00:00` for tidssone-trygghet) vs. tidshendelser med klokkeslett -- Fargekoder per hendelse (7 forhåndsdefinerte) + standard kalenderfarge -- REST API: GET med tidsvindu-filtrering, POST/PATCH/DELETE hendelser -- PG polling-adapter med 5 sek intervall -- CalendarBlock.svelte: månedsrutenett, navigering, opprett/rediger-modal, Escape-lukking -- `linked_node`-kolonne for fremtidig kobling til kanban-kort, episoder etc. +- **Fase 1 (v1, mars 2025):** PG-adapter med `calendars` + `calendar_events` (legacy) +- **Fase 2 (v2, mars 2026):** Edge-basert kalender med `scheduled`-edges + - Rute: `/calendar` — månedsbasert rutenett + - Hendelser er noder med `scheduled`-edge (`metadata.at` = ISO 8601 tidspunkt) + - Heldagshendelser bruker `T12:00:00`-konvensjon (tidssone-trygg) + - Tidsbaserte hendelser viser klokkeslett i rutenett + - Drag-and-drop for å flytte hendelser mellom datoer + - Inline-oppretting: klikk + på en dato, angi tittel og valgfritt klokkeslett + - Fargekoding basert på `node_kind` (innhold, kommunikasjon, media, samling) + - Månedsnavigering med «I dag»-knapp + - Hendelsesliste under rutenett for gjeldende måned + - Lenke fra mottak-siden med hendelsesteller + - Tilgang via `nodeVisibility` (respekterer `node_access`-matrise) + - Sanntidsoppdatering via SpacetimeDB-subscriptions ### Gjenstår — Fase 2 - Kobling til kanban-kort (vis deadline på kalender) diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index a19923e..80b38e0 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -129,6 +129,12 @@ } catch { return false; } } + /** Count scheduled events for badge display */ + const scheduledCount = $derived.by(() => { + if (!connected) return 0; + return edgeStore.byType('scheduled').length; + }); + let isCreatingBoard = $state(false); /** Create a new kanban board */ @@ -279,6 +285,12 @@

Mottak

{#if connected && accessToken}
+ + Kalender{#if scheduledCount > 0} ({scheduledCount}){/if} + +
+

+ {monthNames[viewMonth]} {viewYear} +

+ +
+ +
+ + +
+ +
+ {#each dayNames as day} +
+ {day} +
+ {/each} +
+ + +
+ {#each calendarDays as day, i (day.dateKey)} + {@const dayEvents = eventsByDate.get(day.dateKey) ?? []} + {@const isDropTarget = dragOverDate === day.dateKey} +
handleDragOver(e, day.dateKey)} + ondragleave={handleDragLeave} + ondrop={(e: DragEvent) => handleDrop(e, day.dateKey)} + role="gridcell" + > + +
+ + {day.dayOfMonth} + + {#if day.isCurrentMonth && accessToken} + + {/if} +
+ + +
+ {#each dayEvents as event (event.node.id)} +
handleDragStart(e, event)} + ondragend={handleDragEnd} + title="{event.timeStr ? event.timeStr + ' ' : ''}{event.node.title || 'Uten tittel'}" + > + {#if event.timeStr} + {event.timeStr} + {/if} + {event.node.title || 'Uten tittel'} +
+ {/each} +
+ + + {#if addingToDate === day.dateKey} +
+ + +
+ + +
+
+ {/if} +
+ {/each} +
+
+ + + {#if scheduledEvents.length > 0} + {@const monthEvents = scheduledEvents.filter(e => { + const d = e.scheduledAt; + return d.getMonth() === viewMonth && d.getFullYear() === viewYear; + })} + {#if monthEvents.length > 0} +
+

Hendelser denne måneden

+ +
+ {/if} + {/if} + {/if} + + diff --git a/tasks.md b/tasks.md index 6b0ba86..6fdee57 100644 --- a/tasks.md +++ b/tasks.md @@ -110,8 +110,7 @@ Uavhengige faser kan fortsatt plukkes. ## Fase 9: Flere visninger - [x] 9.1 Kanban-visning: noder med board-edge, gruppert på status-edge. Drag-and-drop for statusendring. -- [~] 9.2 Kalender-visning: noder med `scheduled`-edge, på tidslinje. - > Påbegynt: 2026-03-17T22:20 +- [x] 9.2 Kalender-visning: noder med `scheduled`-edge, på tidslinje. - [ ] 9.3 Dagbok-visning: private noder (ingen delte edges), sortert på tid. - [ ] 9.4 Kunnskapsgraf: topic-noder, `mentions`-edges. Visuell graf-visning.