Displaying and updating Due Date

This commit is contained in:
Anis Ahmad
2020-05-30 12:36:14 +06:00
parent 30cd7f40a1
commit 9a6d3c6b30
3 changed files with 60 additions and 26 deletions

View File

@@ -1,6 +1,7 @@
package main package main
import ( import (
"fmt"
"time" "time"
"github.com/gdamore/tcell" "github.com/gdamore/tcell"
@@ -10,14 +11,15 @@ import (
) )
var ( var (
taskName *tview.TextView taskName, taskDateDisplay *tview.TextView
taskDate *tview.InputField taskDate *tview.InputField
taskDetailView *femto.View taskDetailView *femto.View
taskStatusToggle *tview.Button taskStatusToggle *tview.Button
colorscheme femto.Colorscheme colorscheme femto.Colorscheme
) )
const dateLayoutISO = "2006-01-02" const dateLayoutISO = "2006-01-02"
const dateLayoutHuman = "02 Jan, Monday"
func prepareDetailPane() { func prepareDetailPane() {
taskName = tview.NewTextView().SetDynamicColors(true) taskName = tview.NewTextView().SetDynamicColors(true)
@@ -69,35 +71,36 @@ func prepareDetailPane() {
} }
func makeDateRow() *tview.Flex { func makeDateRow() *tview.Flex {
taskDateDisplay = tview.NewTextView().SetDynamicColors(true)
taskDate = makeLightTextInput("yyyy-mm-dd"). taskDate = makeLightTextInput("yyyy-mm-dd").
SetLabel("Due Date: "). SetLabel("Set:").
SetLabelColor(tcell.ColorGray). SetLabelColor(tcell.ColorGray).
SetFieldWidth(12) SetFieldWidth(12).
SetDoneFunc(func(key tcell.Key) {
switch key {
case tcell.KeyEnter:
setTaskDate(parseDateInputOrCurrent(taskDate.GetText()).Unix(), true)
case tcell.KeyEsc:
setTaskDate(currentTask.DueDate, false)
}
})
todaySelector := func() { todaySelector := func() {
taskDate.SetText(time.Now().Format(dateLayoutISO)) setTaskDate(time.Now().Unix(), true)
} }
nextDaySelector := func() { nextDaySelector := func() {
currentText := taskDate.GetText() setTaskDate(parseDateInputOrCurrent(taskDate.GetText()).AddDate(0, 0, 1).Unix(), true)
if date, err := time.Parse(dateLayoutISO, currentText); err == nil {
taskDate.SetText(date.AddDate(0, 0, 1).Format(dateLayoutISO))
} else {
taskDate.SetText(time.Now().AddDate(0, 0, 1).Format(dateLayoutISO))
}
} }
prevDaySelector := func() { prevDaySelector := func() {
currentText := taskDate.GetText() setTaskDate(parseDateInputOrCurrent(taskDate.GetText()).AddDate(0, 0, -1).Unix(), true)
if date, err := time.Parse(dateLayoutISO, currentText); err == nil {
taskDate.SetText(date.AddDate(0, 0, -1).Format(dateLayoutISO))
} else {
taskDate.SetText(time.Now().AddDate(0, 0, -1).Format(dateLayoutISO))
}
} }
return tview.NewFlex(). return tview.NewFlex().
AddItem(taskDate, 25, 2, true). AddItem(taskDateDisplay, 0, 2, true).
AddItem(taskDate, 14, 0, true).
AddItem(nil, 1, 0, false).
AddItem(nil, 1, 0, false). AddItem(nil, 1, 0, false).
AddItem(makeButton("today", todaySelector), 8, 1, false). AddItem(makeButton("today", todaySelector), 8, 1, false).
AddItem(nil, 1, 0, false). AddItem(nil, 1, 0, false).
@@ -125,6 +128,32 @@ func setStatusToggle(idx int) {
} }
} }
// Display Task date in detail pane, and update date if asked to
func setTaskDate(unixDate int64, update bool) {
if update {
currentTask.DueDate = unixDate
if err := taskRepo.UpdateField(currentTask, "DueDate", unixDate); err != nil {
showMessage("Could not update due date: " + err.Error())
return
}
}
if unixDate != 0 {
due := time.Unix(unixDate, 0)
color := "white"
humanDate := due.Format(dateLayoutHuman)
if due.Before(time.Now()) {
color = "red"
}
taskDateDisplay.SetText(fmt.Sprintf("Due: [%s]%s", color, humanDate))
taskDate.SetText(due.Format(dateLayoutISO))
} else {
taskDate.SetText("")
taskDateDisplay.SetText("Due: [::d]Not Set")
}
}
func prepareDetailsEditor() { func prepareDetailsEditor() {
taskDetailView = femto.NewView(makeBufferFromString("")) taskDetailView = femto.NewView(makeBufferFromString(""))
taskDetailView.SetRuntimeFiles(runtime.Files) taskDetailView.SetRuntimeFiles(runtime.Files)

View File

@@ -53,11 +53,7 @@ func loadTask(idx int) {
taskDetailView.Buf = makeBufferFromString(currentTask.Details) taskDetailView.Buf = makeBufferFromString(currentTask.Details)
taskDetailView.SetColorscheme(colorscheme) taskDetailView.SetColorscheme(colorscheme)
taskDetailView.Start() taskDetailView.Start()
setTaskDate(currentTask.DueDate, false)
taskDate.SetText("")
if currentTask.DueDate != 0 {
taskDate.SetText(time.Unix(currentTask.DueDate, 0).Format(dateLayoutISO))
}
contents.AddItem(detailPane, 0, 3, false) contents.AddItem(detailPane, 0, 3, false)
setStatusToggle(idx) setStatusToggle(idx)

View File

@@ -35,6 +35,15 @@ func makeLightTextInput(placeholder string) *tview.InputField {
SetFieldBackgroundColor(tcell.ColorGray) SetFieldBackgroundColor(tcell.ColorGray)
} }
// If input text is a valid date, parse it. Or get current date
func parseDateInputOrCurrent(inputText string) time.Time {
if date, err := time.Parse(dateLayoutISO, inputText); err == nil {
return date
} else {
return time.Now()
}
}
func showMessage(text string) { func showMessage(text string) {
message.SetText(text) message.SetText(text)
statusBar.SwitchToPage(messagePage) statusBar.SwitchToPage(messagePage)