mirror of
https://github.com/boolean-maybe/tiki
synced 2026-04-21 13:37:20 +00:00
73 lines
2.1 KiB
Go
73 lines
2.1 KiB
Go
package model
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/boolean-maybe/tiki/task"
|
|
)
|
|
|
|
// SearchState holds reusable search state that can be embedded in any view config
|
|
type SearchState struct {
|
|
mu sync.RWMutex
|
|
searchResults []task.SearchResult // nil = no active search
|
|
preSearchIndex int // for grid views (backlog, plugin)
|
|
preSearchPane string // for board view (pane ID)
|
|
preSearchRow int // for board view (row within pane)
|
|
searchQuery string // current search term (for UI restoration)
|
|
}
|
|
|
|
// SavePreSearchState saves the current selection index for grid-based views
|
|
func (ss *SearchState) SavePreSearchState(index int) {
|
|
ss.mu.Lock()
|
|
defer ss.mu.Unlock()
|
|
ss.preSearchIndex = index
|
|
}
|
|
|
|
// SavePreSearchPaneState saves the current pane and row for board view
|
|
func (ss *SearchState) SavePreSearchPaneState(paneID string, row int) {
|
|
ss.mu.Lock()
|
|
defer ss.mu.Unlock()
|
|
ss.preSearchPane = paneID
|
|
ss.preSearchRow = row
|
|
}
|
|
|
|
// SetSearchResults sets filtered search results and query
|
|
func (ss *SearchState) SetSearchResults(results []task.SearchResult, query string) {
|
|
ss.mu.Lock()
|
|
defer ss.mu.Unlock()
|
|
ss.searchResults = results
|
|
ss.searchQuery = query
|
|
}
|
|
|
|
// ClearSearchResults clears search and returns the pre-search state
|
|
// Returns: (preSearchIndex, preSearchPane, preSearchRow)
|
|
func (ss *SearchState) ClearSearchResults() (int, string, int) {
|
|
ss.mu.Lock()
|
|
defer ss.mu.Unlock()
|
|
|
|
ss.searchResults = nil
|
|
ss.searchQuery = ""
|
|
|
|
return ss.preSearchIndex, ss.preSearchPane, ss.preSearchRow
|
|
}
|
|
|
|
// IsSearchActive returns true if search is currently active
|
|
func (ss *SearchState) IsSearchActive() bool {
|
|
ss.mu.RLock()
|
|
defer ss.mu.RUnlock()
|
|
return ss.searchResults != nil
|
|
}
|
|
|
|
// GetSearchQuery returns the current search query
|
|
func (ss *SearchState) GetSearchQuery() string {
|
|
ss.mu.RLock()
|
|
defer ss.mu.RUnlock()
|
|
return ss.searchQuery
|
|
}
|
|
|
|
// GetSearchResults returns current search results (nil if no search active)
|
|
func (ss *SearchState) GetSearchResults() []task.SearchResult {
|
|
ss.mu.RLock()
|
|
defer ss.mu.RUnlock()
|
|
return ss.searchResults
|
|
}
|