25 lines
870 B
TypeScript
25 lines
870 B
TypeScript
import type { SearchItem } from '$lib/navigation/client-navigation';
|
|||
|
|
import type { AppSession } from '$lib/session';
|
||
|
|
|
||
|
|
export const PALETTE_RESULT_LIMIT = 10;
|
||
|
|
|
||
|
|
export function buildSessionKey(session: AppSession | null | undefined): string | null {
|
||
|
|
if (!session) return null;
|
||
|
|
return `${session.role}:${session.email}:${session.user_id ?? ''}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function filterSearchItems(items: SearchItem[], query: string, limit = PALETTE_RESULT_LIMIT) {
|
||
|
|
const trimmedQuery = query.trim().toLowerCase();
|
||
|
|
const matchingItems = items.filter((item) => {
|
||
|
|
const haystack = `${item.label} ${item.description} ${item.keywords}`.toLowerCase();
|
||
|
|
return haystack.includes(trimmedQuery);
|
||
|
|
});
|
||
|
|
|
||
|
|
const filteredItems = matchingItems.slice(0, limit);
|
||
|
|
return {
|
||
|
|
matchingItems,
|
||
|
|
filteredItems,
|
||
|
|
hiddenResultCount: matchingItems.length - filteredItems.length
|
||
|
|
};
|
||
|
|
}
|