[WIP] Add task editing

This commit is contained in:
Martin
2024-05-21 21:53:08 +02:00
parent fce35f0fc7
commit a23b76c3c9
4 changed files with 129 additions and 28 deletions

View File

@ -93,7 +93,8 @@ func (p ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case BackMsg:
p.subpageActive = false
case TaskMsg:
p.populateTaskTable(msg)
p.tasks = taskwarrior.Tasks(msg)
p.populateTaskTable(p.tasks)
case UpdateReportMsg:
p.activeReport = msg
cmds = append(cmds, p.getTasks())
@ -106,6 +107,8 @@ func (p ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
cmds = append(cmds, p.getTasks())
case AddedTaskMsg:
cmds = append(cmds, p.getTasks())
case EditedTaskMsg:
cmds = append(cmds, p.getTasks())
case tea.KeyMsg:
switch {
case key.Matches(msg, p.common.Keymap.Quit):
@ -128,6 +131,12 @@ func (p ReportPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
p.subpageActive = true
p.common.PageStack.Push(p)
return p.subpage, nil
case key.Matches(msg, p.common.Keymap.Edit):
p.subpage = NewTaskEditorPage(p.common, *p.selectedTask)
p.subpage.Init()
p.subpageActive = true
p.common.PageStack.Push(p)
return p.subpage, nil
case key.Matches(msg, p.common.Keymap.SetProject):
p.subpage = NewProjectPickerPage(p.common, p.activeProject)
p.subpage.Init()
@ -152,7 +161,7 @@ func (p ReportPage) View() string {
return p.common.Styles.Main.Render(p.taskTable.View()) + "\n"
}
func (p *ReportPage) populateTaskTable(tasks []*taskwarrior.Task) {
func (p *ReportPage) populateTaskTable(tasks taskwarrior.Tasks) {
nCols := len(p.activeReport.Columns)
columns := make([]table.Column, 0)
columnSizes := make([]int, nCols)
@ -162,7 +171,7 @@ func (p *ReportPage) populateTaskTable(tasks []*taskwarrior.Task) {
for i, task := range tasks {
row := table.Row{}
for i, col := range p.activeReport.Columns {
field := task.Get(col)
field := task.GetString(col)
columnSizes[i] = max(columnSizes[i], len(field))
row = append(row, field)
}
@ -204,8 +213,8 @@ func (p *ReportPage) getTasks() tea.Cmd {
if p.activeProject != "" {
filters = append(filters, "project:"+p.activeProject)
}
p.tasks = p.common.TW.GetTasks(p.activeReport, filters...)
return TaskMsg(p.tasks)
tasks := p.common.TW.GetTasks(p.activeReport, filters...)
return TaskMsg(tasks)
}
}

View File

@ -16,6 +16,7 @@ type TaskEditorPage struct {
common *common.Common
task taskwarrior.Task
form *huh.Form
edit bool
}
type TaskEditorKeys struct {
@ -32,6 +33,10 @@ func NewTaskEditorPage(common *common.Common, task taskwarrior.Task) *TaskEditor
task: task,
}
if task.Uuid != "" {
p.edit = true
}
if p.task.Priority == "" {
p.task.Priority = "(none)"
}
@ -118,7 +123,11 @@ func (p *TaskEditorPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
if p.form.State == huh.StateCompleted {
cmds = append(cmds, p.addTaskCmd)
if p.edit {
cmds = append(cmds, p.editTaskCmd)
} else {
cmds = append(cmds, p.addTaskCmd)
}
model, err := p.common.PageStack.Pop()
if err != nil {
slog.Error("page stack empty")
@ -139,8 +148,15 @@ func (p *TaskEditorPage) addTaskCmd() tea.Msg {
return AddedTaskMsg{}
}
func (p *TaskEditorPage) editTaskCmd() tea.Msg {
p.common.TW.ModifyTask(&p.task)
return EditedTaskMsg{}
}
type AddedTaskMsg struct{}
type EditedTaskMsg struct{}
// TODO: move this to taskwarrior; add missing date formats
func validateDate(s string) error {
formats := []string{