diff --git a/src/routes/hunter/HuntLobby.svelte b/src/routes/hunter/HuntLobby.svelte index 8822828..49ad3cf 100644 --- a/src/routes/hunter/HuntLobby.svelte +++ b/src/routes/hunter/HuntLobby.svelte @@ -173,6 +173,46 @@ const approved = $derived(Object.values(itemStatuses).filter(s => s.itemFoundStatus === 'APPROVED').length) const submitted = $derived(Object.values(itemStatuses).filter(s => s.itemFoundStatus === 'SUBMITTED').length) const rejected = $derived(Object.values(itemStatuses).filter(s => s.itemFoundStatus === 'REJECTED').length) + + let searchQuery = $state('') + let filterStatus = $state(null) + let filterPoints = $state(null) + let sortBy = $state<'name' | 'points'>('points') + let sortDir = $state<'asc' | 'desc'>('asc') + + const uniquePointValues = $derived([...new Set(items.map(i => i.points))].sort((a, b) => a - b)) + + const filteredItems = $derived( + [...items] + .filter(item => { + if (searchQuery && !item.name.toLowerCase().includes(searchQuery.toLowerCase())) return false + if (filterStatus && (itemStatuses[item.id]?.itemFoundStatus ?? 'NOT_FOUND') !== filterStatus) return false + if (filterPoints !== null && item.points !== filterPoints) return false + return true + }) + .sort((a, b) => { + if (sortBy === 'name') { + const cmp = a.name.localeCompare(b.name) + return sortDir === 'asc' ? cmp : -cmp + } + const ptsCmp = a.points - b.points + if (ptsCmp !== 0) return sortDir === 'asc' ? ptsCmp : -ptsCmp + return a.name.localeCompare(b.name) + }) + ) + + function toggleSort(field: 'name' | 'points') { + if (sortBy === field) sortDir = sortDir === 'asc' ? 'desc' : 'asc' + else { sortBy = field; sortDir = 'asc' } + } + + const statusFilters: { label: string; value: string | null }[] = [ + { label: 'All', value: null }, + { label: 'Not Found', value: 'NOT_FOUND' }, + { label: 'Submitted', value: 'SUBMITTED' }, + { label: 'Approved', value: 'APPROVED' }, + { label: 'Rejected', value: 'REJECTED' }, + ]
@@ -248,8 +288,55 @@ {:else} + +
+ +
+ {#each statusFilters as f} + + {/each} +
+
+ + + +
+
+
- {#each items as item} + {#each filteredItems as item} {@const status = itemStatuses[item.id]} + {:else} +

No items match your filters

{/each}
{/if}