diff --git a/frontend/src/routes/+page.server.ts b/frontend/src/routes/+page.server.ts index 248fc783..19a783eb 100644 --- a/frontend/src/routes/+page.server.ts +++ b/frontend/src/routes/+page.server.ts @@ -1,5 +1,10 @@ import { redirect } from '@sveltejs/kit'; import { createApiClient } from '$lib/api.server'; +import type { components } from '$lib/generated/api'; + +type IncompleteDocumentDTO = components['schemas']['IncompleteDocumentDTO']; +type NotificationDTO = components['schemas']['NotificationDTO']; +type Document = components['schemas']['Document']; export async function load({ url, fetch }) { const q = url.searchParams.get('q') || ''; @@ -9,44 +14,76 @@ export async function load({ url, fetch }) { const receiverId = url.searchParams.get('receiverId') || ''; const tags = url.searchParams.getAll('tag'); + const isDashboard = !q && !from && !to && !senderId && !receiverId && !tags.length; + const api = createApiClient(fetch); try { - const [docsResult, personsResult, incompleteCountResult] = await Promise.all([ - api.GET('/api/documents/search', { - params: { - query: { - q: q || undefined, - from: from || undefined, - to: to || undefined, - senderId: senderId || undefined, - receiverId: receiverId || undefined, - tag: tags.length ? tags : undefined - } - } - }), - api.GET('/api/persons'), - api.GET('/api/documents/incomplete-count') + const [docsResult, personsResult] = await Promise.all([ + isDashboard + ? Promise.resolve(null) + : api.GET('/api/documents/search', { + params: { + query: { + q: q || undefined, + from: from || undefined, + to: to || undefined, + senderId: senderId || undefined, + receiverId: receiverId || undefined, + tag: tags.length ? tags : undefined + } + } + }), + api.GET('/api/persons') ]); - if (docsResult.response.status === 401 || personsResult.response.status === 401) { + if (personsResult.response.status === 401) { + throw redirect(302, '/login'); + } + if (docsResult && docsResult.response.status === 401) { throw redirect(302, '/login'); } - const documents = docsResult.data ?? []; + const documents: Document[] = docsResult?.data ?? []; const allPersons: { id: string; firstName: string; lastName: string }[] = personsResult.data ?? []; const senderObj = allPersons.find((p) => p.id === senderId); const receiverObj = allPersons.find((p) => p.id === receiverId); - const incompleteCount = incompleteCountResult.response.ok - ? (incompleteCountResult.data?.count ?? 0) - : 0; + // Dashboard widgets — failures are isolated and don't crash the page + let mentions: NotificationDTO[] = []; + let incompleteDocs: IncompleteDocumentDTO[] = []; + let recentDocs: Document[] = []; + + if (isDashboard) { + const [mentionsResult, incompleteResult, recentResult] = await Promise.allSettled([ + api.GET('/api/notifications', { + params: { query: { type: 'MENTION', read: false, size: 5 } } + }), + api.GET('/api/documents/incomplete', { params: { query: { size: 5 } } }), + api.GET('/api/documents/search', { + params: { query: { status: 'REVIEWED' } } + }) + ]); + + if (mentionsResult.status === 'fulfilled' && mentionsResult.value.response.ok) { + mentions = mentionsResult.value.data?.content ?? []; + } + if (incompleteResult.status === 'fulfilled' && incompleteResult.value.response.ok) { + incompleteDocs = incompleteResult.value.data ?? []; + } + if (recentResult.status === 'fulfilled' && recentResult.value.response.ok) { + recentDocs = (recentResult.value.data ?? []).slice(0, 5); + } + } return { + isDashboard, documents, - incompleteCount, + mentions, + incompleteDocs, + recentDocs, initialValues: { senderName: senderObj ? `${senderObj.firstName} ${senderObj.lastName}` : '', receiverName: receiverObj ? `${receiverObj.firstName} ${receiverObj.lastName}` : '' @@ -58,8 +95,11 @@ export async function load({ url, fetch }) { if ((e as { status?: number }).status) throw e; console.error('Error loading data:', e); return { + isDashboard, documents: [], - incompleteCount: 0, + mentions: [], + incompleteDocs: [], + recentDocs: [], initialValues: { senderName: '', receiverName: '' }, filters: { q, from, to, senderId, receiverId, tags }, error: 'Daten konnten nicht geladen werden.' as string | null diff --git a/frontend/src/routes/enrich/+page.svelte b/frontend/src/routes/enrich/+page.svelte index 2f2be719..bc7021d7 100644 --- a/frontend/src/routes/enrich/+page.svelte +++ b/frontend/src/routes/enrich/+page.svelte @@ -5,14 +5,6 @@ let { data } = $props(); const documents = $derived(data.documents); const count = $derived(documents.length); - -function formatUploadDate(createdAt: string): string { - return new Intl.DateTimeFormat('de-DE', { - day: 'numeric', - month: 'long', - year: 'numeric' - }).format(new Date(createdAt)); -}
- {doc.title || doc.originalFilename} -
-- {formatUploadDate(doc.createdAt)} + {doc.title}