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 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.