From d12509f5fe8220f3b690c966d91e815825cc9975 Mon Sep 17 00:00:00 2001 From: climech Date: Tue, 6 Apr 2021 11:07:56 +0200 Subject: [PATCH] change "[x]" to "[*]" when current view date != node's completion date (#13) --- multitree/node.go | 36 +++++++++++++++++++++++++++++++++++- multitree/repr.go | 11 ++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/multitree/node.go b/multitree/node.go index 4c117e7..ede68c6 100644 --- a/multitree/node.go +++ b/multitree/node.go @@ -1,6 +1,9 @@ package multitree -import "fmt" +import ( + "fmt" + "time" +) type Node struct { ID int64 @@ -46,6 +49,28 @@ func (n *Node) IsCompleted() bool { return n.Completed != nil } +// IsCompletedOnDate returns true if n was completed on date given as a string +// in the format "YYYY-MM-DD". The start of day is determined by offset, e.g. if +// offset is 4, the day starts at 4 A.M. +func (n *Node) IsCompletedOnDate(date string, offset int) bool { + t := n.TimeCompleted() + + if !t.IsZero() { + start, err := time.Parse("2006-01-02", date) + if err != nil { + panic(err) + } + start = start.Local().Add(time.Duration(offset) * time.Hour) + end := start.Add(24 * time.Hour) + + if t.Equal(start) || (t.After(start) && t.Before(end)) { + return true + } + } + + return false +} + func (n *Node) IsInProgress() bool { if n.IsCompleted() { return false @@ -73,6 +98,15 @@ func (n *Node) IsDateNode() bool { return false } +// TimeCompleted returns the task completion time as local time.Time. +func (n *Node) TimeCompleted() time.Time { + var t time.Time + if n.Completed != nil { + t = time.Unix(*n.Completed, 0) + } + return t +} + func (n *Node) Children() []*Node { return n.children } diff --git a/multitree/repr.go b/multitree/repr.go index dc11060..e627c71 100644 --- a/multitree/repr.go +++ b/multitree/repr.go @@ -71,6 +71,7 @@ const ( func (n *Node) StringTree() string { var sb strings.Builder var traverse func(*Node, []bool) + viewRoot := n.Tree().Roots()[0] // The stack holds a boolean value for each of the node's indent levels. If // the value is true, there are more siblings to come on that level, and the @@ -104,7 +105,15 @@ func (n *Node) StringTree() string { for _, i := range indents { sb.WriteString(i) } - sb.WriteString(n.String()) + + // Change "[x]" to "[*]" when current view date != node's completion date. + // TODO: make start of day configurable. + nodeStr := n.String() + if viewRoot.IsDateNode() && !n.IsCompletedOnDate(viewRoot.Name, 4) { + nodeStr = strings.Replace(nodeStr, "[x]", "[*]", 1) + } + + sb.WriteString(nodeStr) sb.WriteString("\n") if len(n.children) != 0 {