diff --git a/pages/messaging.go b/pages/messaging.go index fb705ae..289c0e5 100644 --- a/pages/messaging.go +++ b/pages/messaging.go @@ -1,6 +1,11 @@ package pages -import tea "github.com/charmbracelet/bubbletea" +import ( + "tasksquire/taskwarrior" + "time" + + tea "github.com/charmbracelet/bubbletea" +) type UpdatedTasksMsg struct{} @@ -67,3 +72,13 @@ func changeMode(mode mode) tea.Cmd { } type changeModeMsg mode + +type taskMsg taskwarrior.Tasks + +type tickMsg time.Time + +func doTick() tea.Cmd { + return tea.Tick(time.Second, func(t time.Time) tea.Msg { + return tickMsg(t) + }) +} diff --git a/pages/report.go b/pages/report.go index 5471c8d..a9d6b31 100644 --- a/pages/report.go +++ b/pages/report.go @@ -60,7 +60,7 @@ func (p *ReportPage) SetSize(width int, height int) { } func (p *ReportPage) Init() tea.Cmd { - return p.getTasks() + return tea.Batch(p.getTasks(), doTick()) } func (p *ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { @@ -69,7 +69,11 @@ func (p *ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.WindowSizeMsg: p.SetSize(msg.Width, msg.Height) // case BackMsg: - case TaskMsg: + case tickMsg: + cmds = append(cmds, p.getTasks()) + cmds = append(cmds, doTick()) + return p, tea.Batch(cmds...) + case taskMsg: p.tasks = taskwarrior.Tasks(msg) p.populateTaskTable(p.tasks) case UpdateReportMsg: @@ -99,7 +103,7 @@ func (p *ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { p.common.PushPage(p) return p.subpage, nil case key.Matches(msg, p.common.Keymap.Add): - p.subpage = NewTaskEditorPage(p.common, taskwarrior.Task{}) + p.subpage = NewTaskEditorPage(p.common, taskwarrior.NewTask()) p.subpage.Init() p.common.PushPage(p) return p.subpage, nil @@ -212,8 +216,6 @@ func (p *ReportPage) getTasks() tea.Cmd { filters = append(filters, "project:"+p.activeProject) } tasks := p.common.TW.GetTasks(p.activeReport, filters...) - return TaskMsg(tasks) + return taskMsg(tasks) } } - -type TaskMsg taskwarrior.Tasks diff --git a/pages/taskEditor.go b/pages/taskEditor.go index 5581556..fba7185 100644 --- a/pages/taskEditor.go +++ b/pages/taskEditor.go @@ -11,9 +11,9 @@ import ( "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/list" + "github.com/charmbracelet/bubbles/textarea" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/glamour" "github.com/charmbracelet/huh" "github.com/charmbracelet/lipgloss" ) @@ -215,8 +215,11 @@ func (p *TaskEditorPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } case key.Matches(msg, p.common.Keymap.Ok): model, cmd := p.areas[p.area].Update(msg) - p.areas[p.area] = model.(area) - return p, tea.Batch(cmd, nextField()) + if p.area != 3 { + p.areas[p.area] = model.(area) + return p, tea.Batch(cmd, nextField()) + } + return p, cmd } } @@ -732,27 +735,38 @@ func (t *timeEdit) View() string { } type detailsEdit struct { - com *common.Common - renderer *glamour.TermRenderer - vp viewport.Model + com *common.Common + vp viewport.Model + ta textarea.Model + details string + // renderer *glamour.TermRenderer } func NewDetailsEdit(com *common.Common, task *taskwarrior.Task) *detailsEdit { - renderer, err := glamour.NewTermRenderer( - // glamour.WithStandardStyle("light"), - glamour.WithAutoStyle(), - glamour.WithWordWrap(40), - ) - if err != nil { - slog.Error(err.Error()) - return nil - } + // renderer, err := glamour.NewTermRenderer( + // // glamour.WithStandardStyle("light"), + // glamour.WithAutoStyle(), + // glamour.WithWordWrap(40), + // ) + // if err != nil { + // slog.Error(err.Error()) + // return nil + // } vp := viewport.New(40, 30) + ta := textarea.New() + ta.SetWidth(40) + ta.SetHeight(30) + ta.ShowLineNumbers = false + ta.Focus() + if task.Udas["details"] != nil { + ta.SetValue(task.Udas["details"].(string)) + } d := detailsEdit{ - com: com, - renderer: renderer, - vp: vp, + com: com, + // renderer: renderer, + vp: vp, + ta: ta, } return &d @@ -762,7 +776,7 @@ func (d *detailsEdit) SetCursor(c int) { } func (d *detailsEdit) Init() tea.Cmd { - return nil + return textarea.Blink } func (d *detailsEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { @@ -772,32 +786,34 @@ func (d *detailsEdit) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case prevFieldMsg: return d, prevArea() default: - var cmd tea.Cmd - d.vp, cmd = d.vp.Update(msg) - return d, cmd + var vpCmd, taCmd tea.Cmd + d.vp, vpCmd = d.vp.Update(msg) + d.ta, taCmd = d.ta.Update(msg) + return d, tea.Batch(vpCmd, taCmd) } } func (d *detailsEdit) View() string { - dtls := ` - # Cool Details! - ## Things I need - - [ ] A thing - - [x] Done thing - - ## People - - pe1 - - pe2 - ` + return d.ta.View() + // dtls := ` + // # Cool Details! + // ## Things I need + // - [ ] A thing + // - [x] Done thing - details, err := d.renderer.Render(dtls) - if err != nil { - slog.Error(err.Error()) - return "Could not parse markdown" - } + // ## People + // - pe1 + // - pe2 + // ` - d.vp.SetContent(details) - return d.vp.View() + // details, err := d.renderer.Render(dtls) + // if err != nil { + // slog.Error(err.Error()) + // return "Could not parse markdown" + // } + + // d.vp.SetContent(details) + // return d.vp.View() } // func (p *TaskEditorPage) SetSize(width, height int) { @@ -956,6 +972,10 @@ func (p *TaskEditorPage) updateTasksCmd() tea.Msg { // p.common.TW.AddTaskAnnotation(p.task.Uuid, *p.areas[0].(*taskEdit).newAnnotation) } + if _, ok := p.task.Udas["details"]; ok || p.areas[3].(*detailsEdit).ta.Value() != "" { + p.task.Udas["details"] = p.areas[3].(*detailsEdit).ta.Value() + } + p.common.TW.ImportTask(&p.task) return UpdatedTasksMsg{} } diff --git a/taskwarrior/models.go b/taskwarrior/models.go index 7efd877..482f0a7 100644 --- a/taskwarrior/models.go +++ b/taskwarrior/models.go @@ -68,6 +68,15 @@ type Task struct { Udas map[string]any `json:"-"` } +// TODO: fix pointer receiver +func NewTask() Task { + return Task{ + Tags: make([]string, 0), + Depends: make([]string, 0), + Udas: make(map[string]any), + } +} + func (t *Task) GetString(fieldWFormat string) string { field, format, _ := strings.Cut(fieldWFormat, ".") diff --git a/test/taskchampion.sqlite3 b/test/taskchampion.sqlite3 index 8cd282e..0195efd 100644 Binary files a/test/taskchampion.sqlite3 and b/test/taskchampion.sqlite3 differ