summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-04 08:09:24 +0200
committerPaul Buetow <paul@buetow.org>2026-03-04 08:09:24 +0200
commitb53e1eb61eea026973e2d0a09c7079774f550ce0 (patch)
tree8e5daf522195716bfc4761990a3e701dd70f71ce /internal
parentc3c8282a7989016d4a7a763d8cfc5e8f25117a08 (diff)
tui: optimize entry filtering and matching
Diffstat (limited to 'internal')
-rw-r--r--internal/tui/entries.go49
1 files changed, 26 insertions, 23 deletions
diff --git a/internal/tui/entries.go b/internal/tui/entries.go
index ca84300..e189846 100644
--- a/internal/tui/entries.go
+++ b/internal/tui/entries.go
@@ -22,6 +22,15 @@ const (
entryEditFieldValue
)
+var categoryColors = map[string]string{
+ "work": "#8BD3DD",
+ "lunch": "#F6BD60",
+ "off": "#CDB4DB",
+ "bank": "#A8DADC",
+ "sick": "#FFB4A2",
+ "selfdevelopment": "#B8E1A9",
+}
+
// EntriesModel is a chronological worktime entry browser.
type EntriesModel struct {
allEntries []worktime.Entry
@@ -343,17 +352,8 @@ func (m *EntriesModel) applyFilters() {
if filter != "" && !strings.Contains(strings.ToLower(entry.What), filter) {
continue
}
- if search != "" {
- joined := strings.ToLower(strings.Join([]string{
- entry.Action,
- entry.What,
- entry.Source,
- entry.Human,
- entry.Descr,
- }, " "))
- if !strings.Contains(joined, search) {
- continue
- }
+ if search != "" && !entryMatchesSearch(entry, search) {
+ continue
}
m.visible = append(m.visible, entry)
}
@@ -631,16 +631,7 @@ func colorizeCategory(category string) string {
category = "work"
}
- colors := map[string]string{
- "work": "#8BD3DD",
- "lunch": "#F6BD60",
- "off": "#CDB4DB",
- "bank": "#A8DADC",
- "sick": "#FFB4A2",
- "selfdevelopment": "#B8E1A9",
- }
-
- color, ok := colors[category]
+ color, ok := categoryColors[category]
if !ok {
color = "#D9D9D9"
}
@@ -656,7 +647,7 @@ func minInt(a, b int) int {
func findEntryIndex(entries []worktime.Entry, target worktime.Entry) int {
for idx, entry := range entries {
- if entry == target {
+ if sameEntryIdentity(entry, target) {
return idx
}
}
@@ -671,7 +662,7 @@ func findHostEntryIndex(dbDir, host string, target worktime.Entry) (int, error)
entries := db.Entries[host]
for idx, entry := range entries {
- if entry == target {
+ if sameEntryIdentity(entry, target) {
return idx, nil
}
}
@@ -705,3 +696,15 @@ func trimLastRune(value string) string {
return value[:len(value)-size]
}
+
+func entryMatchesSearch(entry worktime.Entry, search string) bool {
+ return strings.Contains(strings.ToLower(entry.Action), search) ||
+ strings.Contains(strings.ToLower(entry.What), search) ||
+ strings.Contains(strings.ToLower(entry.Source), search) ||
+ strings.Contains(strings.ToLower(entry.Human), search) ||
+ strings.Contains(strings.ToLower(entry.Descr), search)
+}
+
+func sameEntryIdentity(a, b worktime.Entry) bool {
+ return a.Epoch == b.Epoch && a.Action == b.Action && a.Source == b.Source
+}