diff --git a/common/keymap.go b/common/keymap.go index 4b77d76..531bfc4 100644 --- a/common/keymap.go +++ b/common/keymap.go @@ -24,6 +24,7 @@ type Keymap struct { SetReport key.Binding SetContext key.Binding SetProject key.Binding + PickProjectTask key.Binding Select key.Binding Insert key.Binding Tag key.Binding @@ -127,6 +128,11 @@ func NewKeymap() *Keymap { key.WithHelp("p", "Set project"), ), + PickProjectTask: key.NewBinding( + key.WithKeys("P"), + key.WithHelp("P", "Pick project task"), + ), + Select: key.NewBinding( key.WithKeys(" "), key.WithHelp("space", "Select"), diff --git a/pages/report.go b/pages/report.go index 9e4f013..2893b54 100644 --- a/pages/report.go +++ b/pages/report.go @@ -82,6 +82,12 @@ func (p *ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case UpdateProjectMsg: p.activeProject = string(msg) cmds = append(cmds, p.getTasks()) + case TaskPickedMsg: + if msg.Task != nil && msg.Task.Status == "pending" { + p.common.TW.StopActiveTasks() + p.common.TW.StartTask(msg.Task) + } + cmds = append(cmds, p.getTasks()) case UpdatedTasksMsg: cmds = append(cmds, p.getTasks()) case tea.KeyMsg: @@ -119,6 +125,11 @@ func (p *ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmd := p.subpage.Init() p.common.PushPage(p) return p.subpage, cmd + case key.Matches(msg, p.common.Keymap.PickProjectTask): + p.subpage = NewProjectTaskPickerPage(p.common) + cmd := p.subpage.Init() + p.common.PushPage(p) + return p.subpage, cmd case key.Matches(msg, p.common.Keymap.Tag): if p.selectedTask != nil { tag := p.common.TW.GetConfig().Get("uda.tasksquire.tag.default") diff --git a/pages/timePage.go b/pages/timePage.go index 4cabaeb..cf1b1a8 100644 --- a/pages/timePage.go +++ b/pages/timePage.go @@ -172,6 +172,13 @@ func (p *TimePage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { p.pendingSyncAction = "" cmds = append(cmds, p.syncActiveIntervalAfterRefresh(action)) } + case TaskPickedMsg: + if msg.Task != nil && msg.Task.Status == "pending" { + p.common.TW.StopActiveTasks() + p.common.TW.StartTask(msg.Task) + cmds = append(cmds, p.getIntervals()) + cmds = append(cmds, doTick()) + } case RefreshIntervalsMsg: cmds = append(cmds, p.getIntervals()) cmds = append(cmds, doTick()) @@ -191,6 +198,11 @@ func (p *TimePage) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmd := p.subpage.Init() p.common.PushPage(p) return p.subpage, cmd + case key.Matches(msg, p.common.Keymap.PickProjectTask): + p.subpage = NewProjectTaskPickerPage(p.common) + cmd := p.subpage.Init() + p.common.PushPage(p) + return p.subpage, cmd case key.Matches(msg, p.common.Keymap.StartStop): row := p.intervals.SelectedRow() if row != nil { diff --git a/taskwarrior/taskwarrior.go b/taskwarrior/taskwarrior.go index 1d10792..670107c 100644 --- a/taskwarrior/taskwarrior.go +++ b/taskwarrior/taskwarrior.go @@ -147,7 +147,7 @@ func (ts *TaskSquire) GetTasks(report *Report, filter ...string) Tasks { args := ts.defaultArgs - if report.Context { + if report != nil && report.Context { for _, context := range ts.contexts { if context.Active && context.Name != "none" { args = append(args, context.ReadFilter) @@ -161,7 +161,7 @@ func (ts *TaskSquire) GetTasks(report *Report, filter ...string) Tasks { } exportArgs := []string{"export"} - if report.Name != "" { + if report != nil && report.Name != "" { exportArgs = append(exportArgs, report.Name) }