From 81fbc1b949f4c5e394e8fc20fa5d4801f338f36e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20B=C3=BCtow?= <1224732+snonux@users.noreply.github.com> Date: Thu, 19 Jun 2025 23:59:05 +0300 Subject: Add table-based UI and extend task fields --- cmd/tasksamurai/main.go | 66 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 15 deletions(-) (limited to 'cmd') diff --git a/cmd/tasksamurai/main.go b/cmd/tasksamurai/main.go index 95aef13..424d0d8 100644 --- a/cmd/tasksamurai/main.go +++ b/cmd/tasksamurai/main.go @@ -3,12 +3,14 @@ package main import ( "fmt" "os" + "strconv" + "strings" + "time" - "tasksamurai/internal" "tasksamurai/internal/task" "tasksamurai/internal/ui" - "github.com/charmbracelet/bubbles/list" + "github.com/charmbracelet/bubbles/table" tea "github.com/charmbracelet/bubbletea" ) @@ -19,19 +21,15 @@ func main() { os.Exit(1) } - var items []list.Item + var rows []table.Row for _, t := range tasks { - if t.Status != "completed" { - items = append(items, taskItem{t}) + if t.Status == "completed" { + continue } + rows = append(rows, taskToRow(t)) } - delegate := list.NewDefaultDelegate() - l := list.New(items, delegate, 0, 0) - l.Title = fmt.Sprintf("tasksamurai %s", internal.Version) - l.SetShowStatusBar(false) - l.SetFilteringEnabled(false) - m := ui.New(l) + m := ui.New(rows) p := tea.NewProgram(&m) if _, err := p.Run(); err != nil { @@ -40,8 +38,46 @@ func main() { } } -type taskItem struct{ t task.Task } +func taskToRow(t task.Task) table.Row { + active := "" + if t.Start != "" { + active = "yes" + } + + age := "" + if ts, err := time.Parse("20060102T150405Z", t.Entry); err == nil { + days := int(time.Since(ts).Hours() / 24) + age = fmt.Sprintf("%dd", days) + } + + tags := strings.Join(t.Tags, ",") + urg := fmt.Sprintf("%.1f", t.Urgency) + + var anns []string + for _, a := range t.Annotations { + anns = append(anns, a.Description) + } -func (i taskItem) Title() string { return i.t.Description } -func (i taskItem) Description() string { return "" } -func (i taskItem) FilterValue() string { return i.t.Description } + return table.Row{ + strconv.Itoa(t.ID), + t.Description, + active, + age, + t.Priority, + tags, + t.Recur, + formatDate(t.Due), + urg, + strings.Join(anns, "; "), + } +} + +func formatDate(s string) string { + if s == "" { + return "" + } + if ts, err := time.Parse("20060102T150405Z", s); err == nil { + return ts.Format("2006-01-02") + } + return s +} -- cgit v1.2.3