/
spans.go
99 lines (95 loc) · 2.12 KB
/
spans.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package reports
import (
"fmt"
"io"
"sort"
"strings"
"time"
"git.fractalqb.de/fractalqb/tiktak"
"git.fractalqb.de/fractalqb/tiktak/tiktbl"
)
type Spans struct {
Report
Verbose bool
}
func (spans *Spans) Write(w io.Writer, tl tiktak.TimeLine, now time.Time) {
fmts := spans.Fmts
if fmts == nil {
fmts = MinutesFmts
}
today := tiktak.DateOf(now)
var (
tbl tiktbl.Data
day tiktak.Date
)
crsr := tbl.At(0, 0)
for i, s := range tl {
if s.Task() == nil && s.Next() == nil {
continue
}
sday := tiktak.DateOf(s.When())
if sday.Compare(&day) != 0 {
style := Underline()
if sday.Compare(&today) == 0 {
style = tiktbl.Styles{Bold(), Underline()}
}
_, week := s.When().ISOWeek()
d := fmt.Sprintf("%s; Week %d", fmts.Date(s.When()), week)
crsr.SetString(d, tiktbl.SpanAll, style).NextRow()
day = sday
}
end := "..."
style := Bold()
var dur string
if ns := s.Next(); ns == nil {
dur = fmts.Duration(now.Sub(s.When()))
} else {
end = fmts.Clock(ns.When())
dur = fmts.Duration(ns.When().Sub(s.When()))
style = tiktbl.NoStyle()
}
if s.Task() == nil {
style = tiktbl.AddStyles(style, Muted())
}
var flags []rune
for _, note := range s.Notes() {
if note.Sym == 0 {
continue
}
if !strings.ContainsRune(string(flags), note.Sym) {
flags = append(flags, note.Sym)
}
}
if len(flags) > 0 {
sort.Slice(flags, func(i, j int) bool { return flags[i] < flags[j] })
style = tiktbl.AddStyles(style, Warn())
}
if spans.Verbose {
crsr.SetString(SpanID(i), tiktbl.Right)
}
crsr = crsr.With(style).SetStrings(
string(flags),
fmts.Clock(s.When()),
end,
dur,
)
if s.Task() != nil {
crsr = crsr.SetString(s.Task().String(), style)
}
crsr = crsr.NextRow()
if spans.Verbose {
for _, note := range s.Notes() {
crsr.SetString("")
if note.Sym == 0 {
crsr.SetString(note.Text, tiktbl.SpanAll, Underline())
} else {
crsr.SetString(fmt.Sprintf("%c %s", note.Sym, note.Text), tiktbl.SpanAll, Underline())
}
crsr.NextRow()
}
}
}
tbl.Align(tiktbl.Left, 0)
tbl.Align(tiktbl.Right, 3)
spans.Layout.Write(w, &tbl)
}