From 9035f0966766d53ea9090405fdd12ce8d55f872b Mon Sep 17 00:00:00 2001 From: vegard Date: Wed, 18 Mar 2026 08:40:36 +0000 Subject: [PATCH] =?UTF-8?q?Gj=C3=B8r=20CalendarTrait=20til=20fullverdig=20?= =?UTF-8?q?BlockShell-panel=20med=20inline=20kalender=20(oppgave=2020.7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CalendarTrait var tidligere en stub med lenke til /calendar-ruten. Nå er hele kalender-UI-et innebygd direkte i panelet: - Månedsgrid med navigasjon (forrige/neste/i dag) - Hendelser vises som fargekodede chips i dagceller - Drag-and-drop mellom datoer for å flytte hendelser - Inline opprettelse av nye hendelser (tittel + valgfri tid) - setDragPayload for å dra hendelser til andre paneler - BlockReceiver: aksepterer content/communication-noder fra chat/kanban - Responsivt med @container queries for små paneler - Hendelsesliste under grid for oversikt over måneden Følger samme mønster som ChatTrait (20.5) og KanbanTrait (20.6). accessToken sendes nå til CalendarTrait fra collection-siden. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/traits/CalendarTrait.svelte | 914 +++++++++++++++++- .../src/routes/collection/[id]/+page.svelte | 4 +- tasks.md | 3 +- 3 files changed, 880 insertions(+), 41 deletions(-) diff --git a/frontend/src/lib/components/traits/CalendarTrait.svelte b/frontend/src/lib/components/traits/CalendarTrait.svelte index 1692efb..ceee883 100644 --- a/frontend/src/lib/components/traits/CalendarTrait.svelte +++ b/frontend/src/lib/components/traits/CalendarTrait.svelte @@ -1,19 +1,22 @@ - - {#snippet children()} - - Åpne kalender → - - {#if events.length > 0} -
    - {#each events.slice(0, 5) as ev (ev.node.id)} -
  • - {ev.when || '—'} - {ev.node.title || 'Hendelse'} -
  • + + +
    + {#if !connected} +
    +

    Venter på tilkobling…

    +
    + {:else} + +
    + +
    + {monthNames[viewMonth]} {viewYear} + +
    + +
    + + +
    + +
    + {#each dayNames as day} +
    {day}
    {/each} - {#if events.length > 5} -
  • +{events.length - 5} flere
  • - {/if} -
+ + + +
+ {#each calendarDays as day (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} +
+ + + + {@const monthEvents = scheduledEvents.filter(e => { + const d = e.scheduledAt; + return d.getMonth() === viewMonth && d.getFullYear() === viewYear; + })} + {#if monthEvents.length > 0} +
+
Hendelser denne måneden
+ {#each monthEvents as event (event.node.id)} +
handleDragStart(e, event)} + ondragend={handleDragEnd} + > + + {event.scheduledAt.getDate()}. {monthNames[event.scheduledAt.getMonth()].slice(0, 3).toLowerCase()} + + {#if event.timeStr} + {event.timeStr} + {/if} + {event.node.title || 'Uten tittel'} +
+ {/each} +
{/if} - {/snippet} -
+ {/if} + + + diff --git a/frontend/src/routes/collection/[id]/+page.svelte b/frontend/src/routes/collection/[id]/+page.svelte index 269ad4f..df97fe7 100644 --- a/frontend/src/routes/collection/[id]/+page.svelte +++ b/frontend/src/routes/collection/[id]/+page.svelte @@ -344,7 +344,7 @@ {:else if trait === 'rss'} {:else if trait === 'calendar'} - + {:else if trait === 'recording'} {:else if trait === 'transcription'} @@ -399,7 +399,7 @@ {:else if trait === 'rss'} {:else if trait === 'calendar'} - + {:else if trait === 'recording'} {:else if trait === 'transcription'} diff --git a/tasks.md b/tasks.md index ddf5bd6..790ed8d 100644 --- a/tasks.md +++ b/tasks.md @@ -229,8 +229,7 @@ Ref: `docs/features/universell_overfoering.md`, `docs/retninger/arbeidsflaten.md - [x] 20.4 Transfer service: `innholdstransfer`-modus (ny node + source_material edge) og `lettvekts-triage` (eksisterende node + ny edge/placement). Bestem modus fra verktøy-par. Shift-modifier for override. Ref: `docs/features/universell_overfoering.md` § 1, 3. - [x] 20.5 Panelrework — Chat: gjør ChatTrait til fullverdig BlockShell-panel med BlockReceiver, fullskjerm-toggle, og responsivt design innenfor begrenset container. - [x] 20.6 Panelrework — Kanban: gjør KanbanTrait til BlockShell-panel med drag-and-drop aksept fra andre paneler, fullskjerm, responsivt. -- [~] 20.7 Panelrework — Kalender: gjør CalendarTrait til BlockShell-panel med drop-aksept for scheduling, fullskjerm, responsivt. - > Påbegynt: 2026-03-18T08:35 +- [x] 20.7 Panelrework — Kalender: gjør CalendarTrait til BlockShell-panel med drop-aksept for scheduling, fullskjerm, responsivt. - [ ] 20.8 Panelrework — Editor/Artikkelverktøy: gjør artikkelverktøy til BlockShell-panel med source_material mottak fra andre paneler. Ref: `docs/features/artikkelverktoy.md`. - [ ] 20.9 Panelrework — Studio: gjør StudioTrait til BlockShell-panel med drop-aksept for lydfiler, fullskjerm, responsivt.