From 4026bb90037268f6ef7c637f817fb62a55c04a7a Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 20 Mar 2026 17:01:24 +0100 Subject: [PATCH] feat(documents): prefill sender and receiver from URL params on new document page When navigating from the conversations page via the 'New document in this correspondence' link, the senderId and receiverId query params are now read in the server load, resolved to person names, and used to pre-populate the sender typeahead and receiver multi-select on the form. Co-Authored-By: Claude Sonnet 4.6 --- .../src/routes/documents/new/+page.server.ts | 41 ++++++++++++++++--- .../src/routes/documents/new/+page.svelte | 15 +++++-- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/frontend/src/routes/documents/new/+page.server.ts b/frontend/src/routes/documents/new/+page.server.ts index 4cfe77e7..6ef92f14 100644 --- a/frontend/src/routes/documents/new/+page.server.ts +++ b/frontend/src/routes/documents/new/+page.server.ts @@ -5,10 +5,12 @@ import { parseBackendError, getErrorMessage } from '$lib/errors'; export async function load({ fetch, - locals + locals, + url }: { fetch: typeof globalThis.fetch; locals: App.Locals; + url: URL; }) { const canWrite = locals.user?.groups?.some((g: { permissions: string[] }) => @@ -16,14 +18,41 @@ export async function load({ ) ?? false; if (!canWrite) throw error(403, 'Forbidden'); - const api = createApiClient(fetch); - const personsResult = await api.GET('/api/persons'); + const senderId = url.searchParams.get('senderId') || ''; + const receiverId = url.searchParams.get('receiverId') || ''; - if (!personsResult.response.ok) { - return { persons: [] }; + const api = createApiClient(fetch); + + let initialSenderName = ''; + let initialReceivers: { id: string; firstName: string; lastName: string }[] = []; + + const requests: Promise[] = []; + + if (senderId) { + requests.push( + api.GET('/api/persons/{id}', { params: { path: { id: senderId } } }).then(({ data }) => { + if (data) initialSenderName = `${data.firstName} ${data.lastName}`; + }) + ); } - return { persons: personsResult.data }; + if (receiverId) { + requests.push( + api.GET('/api/persons/{id}', { params: { path: { id: receiverId } } }).then(({ data }) => { + if (data) + initialReceivers = [{ id: data.id!, firstName: data.firstName, lastName: data.lastName }]; + }) + ); + } + + const [personsResult] = await Promise.all([api.GET('/api/persons'), ...requests]); + + return { + persons: personsResult.response.ok ? personsResult.data : [], + initialSenderId: senderId, + initialSenderName, + initialReceivers + }; } export const actions = { diff --git a/frontend/src/routes/documents/new/+page.svelte b/frontend/src/routes/documents/new/+page.svelte index e1b1d2d4..3727283b 100644 --- a/frontend/src/routes/documents/new/+page.svelte +++ b/frontend/src/routes/documents/new/+page.svelte @@ -5,11 +5,13 @@ import PersonTypeahead from '$lib/components/PersonTypeahead.svelte'; import PersonMultiSelect from '$lib/components/PersonMultiSelect.svelte'; import { m } from '$lib/paraglide/messages.js'; -let { form } = $props(); +let { data, form } = $props(); let tags: string[] = $state([]); -let senderId = $state(''); -let selectedReceivers: { id: string; firstName: string; lastName: string }[] = $state([]); +let senderId = $state(data.initialSenderId); +let selectedReceivers: { id: string; firstName: string; lastName: string }[] = $state( + data.initialReceivers +); let dateDisplay = $state(''); let dateIso = $state(''); @@ -120,7 +122,12 @@ function handleDateInput(e: Event) {
- +