Add details editing

This commit is contained in:
Martin
2024-06-09 21:46:39 +02:00
parent bafd8958d4
commit 98d2d041d6
5 changed files with 92 additions and 46 deletions

View File

@ -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)
})
}

View File

@ -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

View File

@ -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,9 +215,12 @@ 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)
if p.area != 3 {
p.areas[p.area] = model.(area)
return p, tea.Batch(cmd, nextField())
}
return p, cmd
}
}
if p.columnCursor == 0 {
@ -733,26 +736,37 @@ func (t *timeEdit) View() string {
type detailsEdit struct {
com *common.Common
renderer *glamour.TermRenderer
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,
// 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
return d.ta.View()
// dtls := `
// # Cool Details!
// ## Things I need
// - [ ] A thing
// - [x] Done thing
## People
- pe1
- pe2
`
// ## People
// - pe1
// - pe2
// `
details, err := d.renderer.Render(dtls)
if err != nil {
slog.Error(err.Error())
return "Could not parse markdown"
}
// 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()
// 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{}
}

View File

@ -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, ".")

Binary file not shown.