@@ -7,6 +7,7 @@ import { DragProvider, useDrag } from './drag-context'
77import { Tabs , TabsList , TabsTrigger } from '@/components/ui/tabs'
88import { useTasks , useUpdateTaskStatus } from '@/hooks/use-tasks'
99import { cn } from '@/lib/utils'
10+ import { fuzzyScore } from '@/lib/fuzzy-search'
1011import type { TaskStatus } from '@/types'
1112
1213const COLUMNS : TaskStatus [ ] = [
@@ -59,19 +60,45 @@ function MobileDropZone({ status }: { status: TaskStatus }) {
5960
6061interface KanbanBoardProps {
6162 repoFilter ?: string | null
63+ searchQuery ?: string
6264}
6365
64- function KanbanBoardInner ( { repoFilter } : KanbanBoardProps ) {
66+ function KanbanBoardInner ( { repoFilter, searchQuery } : KanbanBoardProps ) {
6567 const { data : allTasks = [ ] , isLoading } = useTasks ( )
6668 const updateStatus = useUpdateTaskStatus ( )
6769 const { activeTask } = useDrag ( )
6870 const [ activeTab , setActiveTab ] = useState < TaskStatus > ( 'IN_PROGRESS' )
6971
70- // Filter tasks by repo if filter is set
72+ // Filter tasks by repo and search query, sort by latest first
7173 const tasks = useMemo ( ( ) => {
72- if ( ! repoFilter ) return allTasks
73- return allTasks . filter ( ( t ) => t . repoName === repoFilter )
74- } , [ allTasks , repoFilter ] )
74+ let filtered = allTasks
75+ if ( repoFilter ) {
76+ filtered = filtered . filter ( ( t ) => t . repoName === repoFilter )
77+ }
78+ if ( searchQuery ?. trim ( ) ) {
79+ // When searching, sort by fuzzy score
80+ filtered = filtered
81+ . map ( ( t ) => ( {
82+ task : t ,
83+ score : Math . max (
84+ fuzzyScore ( t . title , searchQuery ) ,
85+ fuzzyScore ( t . description || '' , searchQuery ) ,
86+ fuzzyScore ( t . branch || '' , searchQuery ) ,
87+ fuzzyScore ( t . linearTicketId || '' , searchQuery ) ,
88+ fuzzyScore ( t . prUrl || '' , searchQuery )
89+ ) ,
90+ } ) )
91+ . filter ( ( { score } ) => score > 0 )
92+ . sort ( ( a , b ) => b . score - a . score )
93+ . map ( ( { task } ) => task )
94+ } else {
95+ // Default sort: newest first
96+ filtered = [ ...filtered ] . sort ( ( a , b ) =>
97+ new Date ( b . createdAt ) . getTime ( ) - new Date ( a . createdAt ) . getTime ( )
98+ )
99+ }
100+ return filtered
101+ } , [ allTasks , repoFilter , searchQuery ] )
75102
76103 // Task counts for tabs
77104 const taskCounts = useMemo ( ( ) => {
0 commit comments