Features
Search & Filtering

Search & Filtering

Find and filter tasks across your workspace with powerful search and filtering tools.

Global Search

Press Cmd/Ctrl + K to open global search:

  • Search across all boards
  • Find tasks, boards, and users
  • Quick navigation
const setGlobalSearchOpen = useAppStore((s) => s.setGlobalSearchOpen)
const setSearchQuery = useAppStore((s) => s.setSearchQuery)
 
// Open search
setGlobalSearchOpen(true)
 
// Set query
setSearchQuery('bug fix')

Filtering Tasks

Filter Conditions

FieldOperators
statusequals, not_equals
priorityequals, not_equals
assigneeequals, not_equals
dueDateequals, before, after
groupequals, not_equals

Filter Schema

interface FilterCondition {
  field: "status" | "priority" | "assignee" | "dueDate" | "group"
  operator: "equals" | "not_equals" | "contains" | "before" | "after"
  value: string
}

Applying Filters

const setActiveFilters = useAppStore((s) => s.setActiveFilters)
 
// Filter high priority tasks
setActiveFilters([
  { field: 'priority', operator: 'equals', value: 'high' }
])
 
// Filter tasks due this week
setActiveFilters([
  { field: 'dueDate', operator: 'before', value: '2025-01-20' }
])
 
// Multiple filters (AND logic)
setActiveFilters([
  { field: 'status', operator: 'equals', value: 'working' },
  { field: 'priority', operator: 'equals', value: 'high' }
])

Quick Filters

Pre-built filter shortcuts:

import { getQuickFilters } from '@/lib/filter-utils'
 
const quickFilters = getQuickFilters()
 
// My tasks
quickFilters.myTasks(currentUserId)
 
// Due today
quickFilters.dueToday()
 
// Overdue tasks
quickFilters.overdue()
 
// High priority
quickFilters.highPriority()
 
// In progress
quickFilters.inProgress()

Sorting

Sort Configuration

interface SortConfig {
  field: "name" | "status" | "priority" | "dueDate" | "createdAt" | "assignees"
  direction: "asc" | "desc"
}

Applying Sort

const setSortConfig = useAppStore((s) => s.setSortConfig)
 
// Sort by due date ascending
setSortConfig([
  { field: 'dueDate', direction: 'asc' }
])
 
// Multi-level sort
setSortConfig([
  { field: 'priority', direction: 'desc' },
  { field: 'dueDate', direction: 'asc' }
])

Saved Filters

Save frequently used filters:

interface SavedFilter {
  id: string
  boardId: string
  name: string
  conditions: FilterCondition[]
}
 
// Save filter
const saveFilter = useAppStore((s) => s.saveFilter)
saveFilter({
  boardId: 'board-id',
  name: 'High Priority Due Soon',
  conditions: [
    { field: 'priority', operator: 'equals', value: 'high' },
    { field: 'dueDate', operator: 'before', value: '2025-01-30' }
  ]
})
 
// Delete saved filter
const deleteFilter = useAppStore((s) => s.deleteFilter)
deleteFilter(filterId)

Filter Utility Functions

import { applyFilters, sortTasks } from '@/lib/filter-utils'
 
// Apply filters to tasks
const filteredTasks = applyFilters(tasks, activeFilters)
 
// Sort filtered tasks
const sortedTasks = sortTasks(filteredTasks, sortConfig)

Search in Table View

Table view supports column-specific filtering:

  1. Click the filter icon on a column header
  2. Select filter operator
  3. Enter filter value
  4. Apply filter

Filter Examples

All my overdue tasks

[
  { field: 'assignee', operator: 'equals', value: myUserId },
  { field: 'dueDate', operator: 'before', value: today },
  { field: 'status', operator: 'not_equals', value: 'done' }
]

Tasks stuck this week

[
  { field: 'status', operator: 'equals', value: 'stuck' },
  { field: 'dueDate', operator: 'before', value: endOfWeek }
]

Unassigned high priority

[
  { field: 'priority', operator: 'equals', value: 'high' },
  { field: 'assignee', operator: 'equals', value: '' }
]