mirror of
https://github.com/Maks1mS/bubbles.git
synced 2025-03-13 20:43:44 +03:00
feat: allow custom filter functions
Signed-off-by: Carlos A Becker <caarlos0@gmail.com>
This commit is contained in:
parent
d897463138
commit
6c18900279
36
list/list.go
36
list/list.go
@ -71,6 +71,34 @@ func (f filteredItems) items() []Item {
|
|||||||
// message should be routed to Update for processing.
|
// message should be routed to Update for processing.
|
||||||
type FilterMatchesMsg []filteredItem
|
type FilterMatchesMsg []filteredItem
|
||||||
|
|
||||||
|
// Filter takes a term and a list of strings to search through
|
||||||
|
// (defined by Item#FilterValue).
|
||||||
|
// It should return a sorted list of ranks.
|
||||||
|
type Filter func(string, []string) []Rank
|
||||||
|
|
||||||
|
// Rank defines a rank for a given item.
|
||||||
|
type Rank struct {
|
||||||
|
// The index of the item in the original input.
|
||||||
|
Index int
|
||||||
|
// Indices of the actual word that were matched against the filter term.
|
||||||
|
MatchedIndexes []int
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultFilter uses the sahilm/fuzzy to filter through the list.
|
||||||
|
// This is set by default.
|
||||||
|
func DefaultFilter(term string, targets []string) []Rank {
|
||||||
|
var ranks fuzzy.Matches = fuzzy.Find(term, targets)
|
||||||
|
sort.Stable(ranks)
|
||||||
|
result := make([]Rank, len(ranks))
|
||||||
|
for i, r := range ranks {
|
||||||
|
result[i] = Rank{
|
||||||
|
Index: r.Index,
|
||||||
|
MatchedIndexes: r.MatchedIndexes,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
type statusMessageTimeoutMsg struct{}
|
type statusMessageTimeoutMsg struct{}
|
||||||
|
|
||||||
// FilterState describes the current filtering state on the model.
|
// FilterState describes the current filtering state on the model.
|
||||||
@ -107,6 +135,8 @@ type Model struct {
|
|||||||
// Key mappings for navigating the list.
|
// Key mappings for navigating the list.
|
||||||
KeyMap KeyMap
|
KeyMap KeyMap
|
||||||
|
|
||||||
|
Filter Filter
|
||||||
|
|
||||||
disableQuitKeybindings bool
|
disableQuitKeybindings bool
|
||||||
|
|
||||||
// Additional key mappings for the short and full help views. This allows
|
// Additional key mappings for the short and full help views. This allows
|
||||||
@ -173,6 +203,7 @@ func New(items []Item, delegate ItemDelegate, width, height int) Model {
|
|||||||
showHelp: true,
|
showHelp: true,
|
||||||
filteringEnabled: true,
|
filteringEnabled: true,
|
||||||
KeyMap: DefaultKeyMap(),
|
KeyMap: DefaultKeyMap(),
|
||||||
|
Filter: DefaultFilter,
|
||||||
Styles: styles,
|
Styles: styles,
|
||||||
Title: "List",
|
Title: "List",
|
||||||
FilterInput: filterInput,
|
FilterInput: filterInput,
|
||||||
@ -1133,11 +1164,8 @@ func filterItems(m Model) tea.Cmd {
|
|||||||
targets = append(targets, t.FilterValue())
|
targets = append(targets, t.FilterValue())
|
||||||
}
|
}
|
||||||
|
|
||||||
var ranks fuzzy.Matches = fuzzy.Find(m.FilterInput.Value(), targets)
|
|
||||||
sort.Stable(ranks)
|
|
||||||
|
|
||||||
filterMatches := []filteredItem{}
|
filterMatches := []filteredItem{}
|
||||||
for _, r := range ranks {
|
for _, r := range m.Filter(m.FilterInput.Value(), targets) {
|
||||||
filterMatches = append(filterMatches, filteredItem{
|
filterMatches = append(filterMatches, filteredItem{
|
||||||
item: items[r.Index],
|
item: items[r.Index],
|
||||||
matches: r.MatchedIndexes,
|
matches: r.MatchedIndexes,
|
||||||
|
Loading…
Reference in New Issue
Block a user