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 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-03-20 17:01:24 +01:00
parent f2f9a1bf03
commit 4026bb9003
2 changed files with 46 additions and 10 deletions

View File

@@ -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<void>[] = [];
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 = {

View File

@@ -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) {
<!-- Absender -->
<div>
<PersonTypeahead name="senderId" label={m.form_label_sender()} bind:value={senderId} />
<PersonTypeahead
name="senderId"
label={m.form_label_sender()}
bind:value={senderId}
initialName={data.initialSenderName}
/>
</div>
<!-- Empfänger -->