From 8802613e9eb295124d7e42fee0393a690afaa2c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20B=C3=BCtow?= <1224732+snonux@users.noreply.github.com> Date: Fri, 20 Jun 2025 22:51:38 +0300 Subject: Use date picker for due date hotkey --- internal/ui/table.go | 32 ++++++++++++++++++++------------ internal/ui/table_test.go | 9 +++++---- 2 files changed, 25 insertions(+), 16 deletions(-) (limited to 'internal') diff --git a/internal/ui/table.go b/internal/ui/table.go index 60adc06..6f4c0f8 100644 --- a/internal/ui/table.go +++ b/internal/ui/table.go @@ -42,7 +42,7 @@ type Model struct { dueEditing bool dueID int - dueInput textinput.Model + dueDate time.Time searching bool searchInput textinput.Model @@ -79,8 +79,7 @@ func New(filters []string) (Model, error) { m := Model{filters: filters} m.annotateInput = textinput.New() m.annotateInput.Prompt = "annotation: " - m.dueInput = textinput.New() - m.dueInput.Prompt = "due: " + m.dueDate = time.Now() m.searchInput = textinput.New() m.searchInput.Prompt = "search: " @@ -208,19 +207,25 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if m.dueEditing { switch msg.Type { case tea.KeyEnter: - task.SetDueDate(m.dueID, m.dueInput.Value()) + task.SetDueDate(m.dueID, m.dueDate.Format("2006-01-02")) m.dueEditing = false - m.dueInput.Blur() m.reload() return m, nil case tea.KeyEsc: m.dueEditing = false - m.dueInput.Blur() return m, nil } - var cmd tea.Cmd - m.dueInput, cmd = m.dueInput.Update(msg) - return m, cmd + switch msg.String() { + case "h", "left": + m.dueDate = m.dueDate.AddDate(0, 0, -1) + case "l", "right": + m.dueDate = m.dueDate.AddDate(0, 0, 1) + case "k", "up": + m.dueDate = m.dueDate.AddDate(0, 0, -7) + case "j", "down": + m.dueDate = m.dueDate.AddDate(0, 0, 7) + } + return m, nil } if m.prioritySelecting { switch msg.Type { @@ -341,8 +346,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if id, err := strconv.Atoi(idStr); err == nil { m.dueID = id m.dueEditing = true - m.dueInput.SetValue("") - m.dueInput.Focus() + m.dueDate = time.Now() return m, nil } } @@ -455,7 +459,7 @@ func (m Model) View() string { if m.dueEditing { view = lipgloss.JoinVertical(lipgloss.Left, view, - m.dueInput.View(), + m.dueView(), ) } if m.prioritySelecting { @@ -560,6 +564,10 @@ func formatPriority(p string) string { return style.Render(p) } +func (m Model) dueView() string { + return fmt.Sprintf("due: %s", m.dueDate.Format("2006-01-02")) +} + func (m Model) priorityView() string { var parts []string for i, p := range priorityOptions { diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index d120337..77ee3f3 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -263,8 +263,8 @@ func TestDueDateHotkey(t *testing.T) { mv, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'d'}}) m = mv.(Model) - for _, r := range "2024-12-31" { - mv, _ = m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{r}}) + for i := 0; i < 3; i++ { + mv, _ = m.Update(tea.KeyMsg{Type: tea.KeyRight}) m = mv.(Model) } mv, _ = m.Update(tea.KeyMsg{Type: tea.KeyEnter}) @@ -275,7 +275,8 @@ func TestDueDateHotkey(t *testing.T) { t.Fatalf("read due: %v", err) } - if strings.TrimSpace(string(data)) != "1 modify due:2024-12-31" { + want := "1 modify due:" + time.Now().AddDate(0, 0, 3).Format("2006-01-02") + if strings.TrimSpace(string(data)) != want { t.Fatalf("due not set: %q", data) } } @@ -470,7 +471,7 @@ func TestEscClosesHelp(t *testing.T) { t.Fatalf("New: %v", err) } - mv, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'?'}}) + mv, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'h'}}) m = mv.(Model) if !m.showHelp { t.Fatalf("help not shown") -- cgit v1.2.3