diff --git a/apps/calendar/apps/web/src/lib/api/base-client.ts b/apps/calendar/apps/web/src/lib/api/base-client.ts index eafbc7f5f..f2d3ff1ff 100644 --- a/apps/calendar/apps/web/src/lib/api/base-client.ts +++ b/apps/calendar/apps/web/src/lib/api/base-client.ts @@ -84,6 +84,7 @@ export function createApiClient(config: ApiClientConfig) { return { data, error: null }; } catch (error) { clearTimeout(timeoutId); + console.error('[BaseClient] Fetch error:', error); if (error instanceof Error && error.name === 'AbortError') { return { @@ -105,7 +106,7 @@ export function createApiClient(config: ApiClientConfig) { /** * Helper to build query strings from object */ -export function buildQueryString(params: T): string { +export function buildQueryString(params: Record): string { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null) { diff --git a/apps/calendar/apps/web/src/lib/api/todos.ts b/apps/calendar/apps/web/src/lib/api/todos.ts index 6f11e576c..f356b8d6f 100644 --- a/apps/calendar/apps/web/src/lib/api/todos.ts +++ b/apps/calendar/apps/web/src/lib/api/todos.ts @@ -167,7 +167,7 @@ const fetchTodoApi = todoClient.fetchApi; export async function getTasks( query: TaskQuery = {} ): Promise<{ data: Task[] | null; error: Error | null }> { - const queryString = buildQueryString(query); + const queryString = buildQueryString(query as Record); const result = await fetchTodoApi(`/tasks${queryString}`); return { data: result.data?.tasks || null, @@ -242,7 +242,9 @@ export async function uncompleteTask( } export async function getTodayTasks(): Promise<{ data: Task[] | null; error: Error | null }> { + console.log('[TodoAPI] Fetching /tasks/today from:', TODO_API_BASE); const result = await fetchTodoApi('/tasks/today'); + console.log('[TodoAPI] Response:', result); return { data: result.data?.tasks || null, error: result.error, diff --git a/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte index 30c398603..7ad07179d 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/DayView.svelte @@ -75,8 +75,11 @@ ); // Get display mode for an event (per-event override takes precedence over global setting) - function getEventDisplayMode(event: any): 'header' | 'block' { - return event.metadata?.allDayDisplayMode || settingsStore.allDayDisplayMode; + function getEventDisplayMode(event: CalendarEvent): 'header' | 'block' { + return ( + (event.metadata as { allDayDisplayMode?: 'header' | 'block' } | null)?.allDayDisplayMode || + settingsStore.allDayDisplayMode + ); } // Split all-day events by display mode @@ -90,7 +93,7 @@ // Drag & Drop State // ============================================================================ let isDragging = $state(false); - let draggedEvent = $state(null); + let draggedEvent = $state(null); let dragOffsetMinutes = $state(0); let dragPreviewTop = $state(0); let dragPreviewHeight = $state(0); @@ -100,7 +103,7 @@ // Resize State // ============================================================================ let isResizing = $state(false); - let resizeEvent = $state(null); + let resizeEvent = $state(null); let resizeEdge = $state<'top' | 'bottom'>('bottom'); let resizeOriginalStart = $state(null); let resizeOriginalEnd = $state(null); @@ -132,7 +135,7 @@ // ============================================================================ // Drag Handlers // ============================================================================ - function startDrag(event: any, e: PointerEvent) { + function startDrag(event: CalendarEvent, e: PointerEvent) { e.preventDefault(); e.stopPropagation(); @@ -218,7 +221,7 @@ // ============================================================================ // Resize Handlers // ============================================================================ - function startResize(event: any, edge: 'top' | 'bottom', e: PointerEvent) { + function startResize(event: CalendarEvent, edge: 'top' | 'bottom', e: PointerEvent) { e.preventDefault(); e.stopPropagation(); @@ -345,7 +348,7 @@ // ============================================================================ // Event Styling // ============================================================================ - function getEventStyle(event: any) { + function getEventStyle(event: CalendarEvent) { const start = typeof event.startTime === 'string' ? parseISO(event.startTime) : event.startTime; const end = typeof event.endTime === 'string' ? parseISO(event.endTime) : event.endTime; @@ -459,6 +462,7 @@ {@const isBeingDragged = isDragging && draggedEvent?.id === event.id} {@const isBeingResized = isResizing && resizeEvent?.id === event.id} {@const isDraft = eventsStore.isDraftEvent(event.id)} +
startResize(event, 'top', e)} role="slider" aria-label="Startzeit ändern" + aria-valuenow={0} tabindex="-1" >
@@ -505,6 +510,7 @@ onpointerdown={(e) => startResize(event, 'bottom', e)} role="slider" aria-label="Endzeit ändern" + aria-valuenow={0} tabindex="-1" > diff --git a/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte index e3bd719f1..ce714fa6f 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/MonthView.svelte @@ -80,7 +80,7 @@ // Drag & Drop State // ============================================================================ let isDragging = $state(false); - let draggedEvent = $state(null); + let draggedEvent = $state(null); let dragTargetDay = $state(null); let monthViewRef = $state(null); @@ -286,6 +286,7 @@ {#each getEventsForDay(day) as event} {@const isBeingDragged = isDragging && draggedEvent?.id === event.id} {@const isDraft = eventsStore.isDraftEvent(event.id)} +
(null); + let draggedEvent = $state(null); let dragOffsetMinutes = $state(0); let dragTargetDay = $state(null); let dragPreviewTop = $state(0); @@ -104,7 +104,7 @@ // ========== Resize State ========== let isResizing = $state(false); - let resizeEvent = $state(null); + let resizeEvent = $state(null); let resizeEdge = $state<'top' | 'bottom'>('bottom'); let resizeOriginalStart = $state(null); let resizeOriginalEnd = $state(null); @@ -126,8 +126,11 @@ } // Get display mode for an event (per-event override takes precedence over global setting) - function getEventDisplayMode(event: any): 'header' | 'block' { - return event.metadata?.allDayDisplayMode || settingsStore.allDayDisplayMode; + function getEventDisplayMode(event: CalendarEvent): 'header' | 'block' { + return ( + (event.metadata as { allDayDisplayMode?: 'header' | 'block' } | null)?.allDayDisplayMode || + settingsStore.allDayDisplayMode + ); } // Split all-day events by display mode @@ -144,7 +147,7 @@ days.some((day) => getHeaderAllDayEventsForDay(day).length > 0) ); - function getEventStyle(event: any) { + function getEventStyle(event: CalendarEvent) { const start = typeof event.startTime === 'string' ? parseISO(event.startTime) : event.startTime; const end = typeof event.endTime === 'string' ? parseISO(event.endTime) : event.endTime; @@ -225,7 +228,7 @@ return Math.round(totalMinutes / MINUTES_PER_SLOT) * MINUTES_PER_SLOT; } - function startDrag(event: any, e: PointerEvent) { + function startDrag(event: CalendarEvent, e: PointerEvent) { e.preventDefault(); e.stopPropagation(); @@ -328,7 +331,7 @@ // ========== Resize Functions ========== - function startResize(event: any, edge: 'top' | 'bottom', e: PointerEvent) { + function startResize(event: CalendarEvent, edge: 'top' | 'bottom', e: PointerEvent) { e.preventDefault(); e.stopPropagation(); @@ -573,6 +576,7 @@ onpointerdown={(e) => startResize(event, 'top', e)} role="slider" aria-label="Startzeit ändern" + aria-valuenow={0} tabindex="-1" >
@@ -589,13 +593,14 @@ onpointerdown={(e) => startResize(event, 'bottom', e)} role="slider" aria-label="Endzeit ändern" + aria-valuenow={0} tabindex="-1" > {/each} - {#if isDragging && draggedEvent && dragTargetDay && isSameDay(day, dragTargetDay) && !getEventsForDay(day).some((e) => e.id === draggedEvent.id)} + {#if isDragging && draggedEvent && dragTargetDay && isSameDay(day, dragTargetDay) && !getEventsForDay(day).some((e) => e.id === draggedEvent!.id)}
@@ -611,13 +615,14 @@ onpointerdown={(e) => startResize(event, 'bottom', e)} role="slider" aria-label={$_('event.changeEndTime')} + aria-valuenow={0} tabindex="-1" > {/each} - {#if isDragging && draggedEvent && dragTargetDay && isSameDay(day, dragTargetDay) && !getEventsForDay(day).some((e) => e.id === draggedEvent.id)} + {#if isDragging && draggedEvent && dragTargetDay && isSameDay(day, dragTargetDay) && !getEventsForDay(day).some((e) => e.id === draggedEvent!.id)}