diff --git a/src/routes/matches/+page.svelte b/src/routes/matches/+page.svelte index 6933b9a..b396b80 100644 --- a/src/routes/matches/+page.svelte +++ b/src/routes/matches/+page.svelte @@ -26,6 +26,11 @@ let nextPageTime = $state(data.nextPageTime); let isLoadingMore = $state(false); + // Sorting and filtering state + let sortBy = $state<'date' | 'duration' | 'score'>('date'); + let sortOrder = $state<'desc' | 'asc'>('desc'); + let resultFilter = $state<'all' | 'win' | 'loss' | 'tie'>('all'); + // Reset pagination when data changes (new filters applied) $effect(() => { matches = data.matches; @@ -33,6 +38,44 @@ nextPageTime = data.nextPageTime; }); + // Computed filtered and sorted matches + const displayMatches = $derived(() => { + let filtered = [...matches]; + + // Apply result filter + if (resultFilter !== 'all') { + filtered = filtered.filter((match) => { + const teamAWon = match.score_team_a > match.score_team_b; + const teamBWon = match.score_team_b > match.score_team_a; + const tie = match.score_team_a === match.score_team_b; + + if (resultFilter === 'win') return teamAWon; + if (resultFilter === 'loss') return teamBWon; + if (resultFilter === 'tie') return tie; + return true; + }); + } + + // Apply sorting + filtered.sort((a, b) => { + let comparison = 0; + + if (sortBy === 'date') { + comparison = new Date(a.date).getTime() - new Date(b.date).getTime(); + } else if (sortBy === 'duration') { + comparison = a.duration - b.duration; + } else if (sortBy === 'score') { + const aScoreDiff = Math.abs(a.score_team_a - a.score_team_b); + const bScoreDiff = Math.abs(b.score_team_a - b.score_team_b); + comparison = aScoreDiff - bScoreDiff; + } + + return sortOrder === 'desc' ? -comparison : comparison; + }); + + return filtered; + }); + const handleSearch = () => { const params = new URLSearchParams(); if (searchQuery) params.set('search', searchQuery); @@ -120,18 +163,83 @@ {#if showFilters} -
+ No matches match your current filters. Try adjusting your filter settings. +
+