feat(#221): wire tagOp URL param from server to SearchFilterBar
Reads ?tagOp=OR from URL in +page.server.ts, passes it to the backend search endpoint, and surfaces it via the filters return. +page.svelte initialises tagOperator state from filters, writes it back to the URL in triggerSearch(), and binds it to SearchFilterBar. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,7 @@ export async function load({ url, fetch }) {
|
|||||||
? (rawDir as ValidDir)
|
? (rawDir as ValidDir)
|
||||||
: 'desc';
|
: 'desc';
|
||||||
const tagQ = url.searchParams.get('tagQ') || '';
|
const tagQ = url.searchParams.get('tagQ') || '';
|
||||||
|
const tagOp = url.searchParams.get('tagOp') === 'OR' ? 'OR' : 'AND';
|
||||||
|
|
||||||
const isDashboard = !q && !from && !to && !senderId && !receiverId && !tags.length && !tagQ;
|
const isDashboard = !q && !from && !to && !senderId && !receiverId && !tags.length && !tagQ;
|
||||||
|
|
||||||
@@ -48,6 +49,7 @@ export async function load({ url, fetch }) {
|
|||||||
receiverId: receiverId || undefined,
|
receiverId: receiverId || undefined,
|
||||||
tag: tags.length ? tags : undefined,
|
tag: tags.length ? tags : undefined,
|
||||||
tagQ: tagQ || undefined,
|
tagQ: tagQ || undefined,
|
||||||
|
tagOp: tagOp === 'OR' ? 'OR' : undefined,
|
||||||
sort,
|
sort,
|
||||||
dir: dir || undefined
|
dir: dir || undefined
|
||||||
}
|
}
|
||||||
@@ -147,7 +149,7 @@ export async function load({ url, fetch }) {
|
|||||||
senderName: senderObj?.displayName ?? '',
|
senderName: senderObj?.displayName ?? '',
|
||||||
receiverName: receiverObj?.displayName ?? ''
|
receiverName: receiverObj?.displayName ?? ''
|
||||||
},
|
},
|
||||||
filters: { q, from, to, senderId, receiverId, tags, sort, dir, tagQ },
|
filters: { q, from, to, senderId, receiverId, tags, sort, dir, tagQ, tagOp },
|
||||||
error: null as string | null
|
error: null as string | null
|
||||||
};
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -166,7 +168,7 @@ export async function load({ url, fetch }) {
|
|||||||
readyDocs: [],
|
readyDocs: [],
|
||||||
weeklyStats: null,
|
weeklyStats: null,
|
||||||
initialValues: { senderName: '', receiverName: '' },
|
initialValues: { senderName: '', receiverName: '' },
|
||||||
filters: { q, from, to, senderId, receiverId, tags, sort, dir, tagQ },
|
filters: { q, from, to, senderId, receiverId, tags, sort, dir, tagQ, tagOp },
|
||||||
error: 'Daten konnten nicht geladen werden.' as string | null
|
error: 'Daten konnten nicht geladen werden.' as string | null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ let tagNames = $state<{ name: string; id?: string; color?: string; parentId?: st
|
|||||||
let sort = $state(untrack(() => data.filters?.sort || 'DATE'));
|
let sort = $state(untrack(() => data.filters?.sort || 'DATE'));
|
||||||
let dir = $state(untrack(() => data.filters?.dir || 'desc'));
|
let dir = $state(untrack(() => data.filters?.dir || 'desc'));
|
||||||
let tagQ = $state(untrack(() => data.filters?.tagQ || ''));
|
let tagQ = $state(untrack(() => data.filters?.tagQ || ''));
|
||||||
|
let tagOperator = $state<'AND' | 'OR'>(
|
||||||
|
untrack(() => (data.filters?.tagOp as 'AND' | 'OR') || 'AND')
|
||||||
|
);
|
||||||
|
|
||||||
const hasAdvancedFilters = (filters: typeof data.filters) =>
|
const hasAdvancedFilters = (filters: typeof data.filters) =>
|
||||||
(filters?.tags?.length ?? 0) > 0 ||
|
(filters?.tags?.length ?? 0) > 0 ||
|
||||||
@@ -49,6 +52,7 @@ function triggerSearch() {
|
|||||||
if (sort) params.set('sort', sort);
|
if (sort) params.set('sort', sort);
|
||||||
if (dir) params.set('dir', dir);
|
if (dir) params.set('dir', dir);
|
||||||
if (tagQ) params.set('tagQ', tagQ);
|
if (tagQ) params.set('tagQ', tagQ);
|
||||||
|
if (tagOperator === 'OR') params.set('tagOp', 'OR');
|
||||||
goto(`/?${params.toString()}`, { keepFocus: true, noScroll: true });
|
goto(`/?${params.toString()}`, { keepFocus: true, noScroll: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +83,7 @@ $effect(() => {
|
|||||||
sort = data.filters?.sort || 'DATE';
|
sort = data.filters?.sort || 'DATE';
|
||||||
dir = data.filters?.dir || 'desc';
|
dir = data.filters?.dir || 'desc';
|
||||||
tagQ = data.filters?.tagQ || '';
|
tagQ = data.filters?.tagQ || '';
|
||||||
|
tagOperator = (data.filters?.tagOp as 'AND' | 'OR') || 'AND';
|
||||||
if (hasAdvancedFilters(data.filters)) showAdvanced = true;
|
if (hasAdvancedFilters(data.filters)) showAdvanced = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -104,6 +109,7 @@ const showRightColumn = $derived(data.canWrite || (data.incompleteDocs?.length ?
|
|||||||
bind:sort={sort}
|
bind:sort={sort}
|
||||||
bind:dir={dir}
|
bind:dir={dir}
|
||||||
bind:tagQ={tagQ}
|
bind:tagQ={tagQ}
|
||||||
|
bind:tagOperator={tagOperator}
|
||||||
initialSenderName={data.initialValues?.senderName}
|
initialSenderName={data.initialValues?.senderName}
|
||||||
initialReceiverName={data.initialValues?.receiverName}
|
initialReceiverName={data.initialValues?.receiverName}
|
||||||
isLoading={navigating.to !== null}
|
isLoading={navigating.to !== null}
|
||||||
|
|||||||
Reference in New Issue
Block a user