diff --git a/src/routes/announcements/+page.svelte b/src/routes/announcements/+page.svelte index e5a2717..7ab183f 100644 --- a/src/routes/announcements/+page.svelte +++ b/src/routes/announcements/+page.svelte @@ -22,52 +22,51 @@ import ChevronDown from 'svelte-material-icons/ChevronDown.svelte'; import Create from 'svelte-material-icons/Plus.svelte'; - let searchParams: Readable; + let expanded = false; - if (building) searchParams = readable(new URLSearchParams()); - else searchParams = derived(page, ($page) => $page.url.searchParams); + const searchParams: Readable = building + ? readable(new URLSearchParams()) + : derived(page, ($page) => $page.url.searchParams); let searchTerm = $searchParams.get('s') || ''; + let displayedTerm = ''; $: query = createQuery(queries.announcements()); $: tagsQuery = createQuery(queries.announcementTags()); $: selectedTags = $searchParams.getAll('tag'); - let expanded = false; - - function filterAnnouncements( - announcements: Iterable, - search: string, - selectedTags: string[] - ): ResponseAnnouncement[] { - const announcementFilter = createFilter(Array.from(announcements), { - searcherOptions: { - keys: ['title', 'content'] - }, - additionalFilter: (announcement: ResponseAnnouncement, tags: string[]): boolean => { - return ( - tags.length === 0 || - tags.some((tag) => announcement.tags && announcement.tags.includes(tag)) - ); - } - }); - - return announcementFilter(selectedTags, search); - } - - // Make sure we don't have to filter the announcements after every key press - let displayedTerm = ''; const update = () => { displayedTerm = searchTerm; const url = new URL(window.location.href); url.pathname = '/announcements'; - if (searchTerm) url.searchParams.set('s', searchTerm); - else url.searchParams.delete('s'); + searchTerm ? url.searchParams.set('s', searchTerm) : url.searchParams.delete('s'); }; - onMount(update); + const archivedAnnouncements = (announcements: ResponseAnnouncement[]) => + announcements.filter((a) => a.archived_at && moment(a.archived_at).isBefore(moment())); + const activeAnnouncements = (announcements: ResponseAnnouncement[]) => + announcements.filter((a) => !a.archived_at || moment(a.archived_at).isAfter(moment())); + + const filterAnnouncements = ( + announcements: ResponseAnnouncement[], + search: string, + tags: string[] + ): ResponseAnnouncement[] => { + const announcementFilter = createFilter(announcements, { + searcherOptions: { keys: ['title', 'content'] }, + + additionalFilter: (a: ResponseAnnouncement, tags: string[]) => + tags.length === 0 || tags.some((tag) => a.tags?.includes(tag)) + }); + + return announcementFilter(tags, search); + }; + + onMount(() => { + debounce(update)(); + });