UI Mode Work & Archiving
This commit is contained in:
parent
cf80d56e20
commit
f4af61386e
16
app_state.go
16
app_state.go
@ -21,6 +21,8 @@ type AppState struct {
|
|||||||
OpFuncs map[string]func([]string) int
|
OpFuncs map[string]func([]string) int
|
||||||
|
|
||||||
TimerList *timertxt.TimerList
|
TimerList *timertxt.TimerList
|
||||||
|
DoneList *timertxt.TimerList
|
||||||
|
screens []Screen
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewApp() *AppState {
|
func NewApp() *AppState {
|
||||||
@ -35,10 +37,14 @@ func NewApp() *AppState {
|
|||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AppState) filterList(list *timertxt.TimerList, filter string) *timertxt.TimerList {
|
||||||
|
return list.Filter(a.getFilterPredicate(filter))
|
||||||
|
}
|
||||||
|
|
||||||
func (a *AppState) run(parms []string) int {
|
func (a *AppState) run(parms []string) int {
|
||||||
if len(parms) == 0 || parms[0] == "ui" {
|
if len(parms) == 0 || parms[0] == "ui" {
|
||||||
// UI Mode
|
// UI Mode
|
||||||
//return uiLoop()
|
return uiLoop()
|
||||||
}
|
}
|
||||||
if fn, ok := a.OpFuncs[parms[0]]; ok {
|
if fn, ok := a.OpFuncs[parms[0]]; ok {
|
||||||
return fn(parms[1:])
|
return fn(parms[1:])
|
||||||
@ -64,6 +70,14 @@ func (a *AppState) addOperation(name string, desc []string, fn func([]string) in
|
|||||||
a.OpFuncs[name] = fn
|
a.OpFuncs[name] = fn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AppState) getTimerString(timer timertxt.Timer) string {
|
||||||
|
return fmt.Sprintf("%d. %s", timer.Id, strings.TrimPrefix(timer.String(), "x "))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppState) getDoneTimerString(timer timertxt.Timer) string {
|
||||||
|
return fmt.Sprintf("0. %s", timer.Id, timer.String())
|
||||||
|
}
|
||||||
|
|
||||||
func (a *AppState) doVersionCheck() {
|
func (a *AppState) doVersionCheck() {
|
||||||
confVer, _ := a.config.GetInt("version")
|
confVer, _ := a.config.GetInt("version")
|
||||||
for confVer < a.Version {
|
for confVer < a.Version {
|
||||||
|
89
model.go
89
model.go
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
timertxt "git.bullercodeworks.com/brian/go-timertxt"
|
timertxt "git.bullercodeworks.com/brian/go-timertxt"
|
||||||
@ -17,6 +18,45 @@ func (a *AppState) SetTimerFinished(id int, end time.Time) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AppState) addTimer(timerString string) error {
|
||||||
|
t, err := timertxt.ParseTimer(timerString)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t.StartDate.IsZero() {
|
||||||
|
t.StartDate = time.Now()
|
||||||
|
}
|
||||||
|
a.TimerList.AddTimer(t)
|
||||||
|
return a.WriteList()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppState) archiveTimer(id int) error {
|
||||||
|
var err error
|
||||||
|
var timer *timertxt.Timer
|
||||||
|
if timer, err = a.TimerList.GetTimer(id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := a.TimerList.ArchiveTimerToFile(*timer, app.getDoneFile()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.TimerList.RemoveTimer(*timer)
|
||||||
|
return a.WriteList()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AppState) unarchiveTimer(id int) error {
|
||||||
|
var err error
|
||||||
|
var timer *timertxt.Timer
|
||||||
|
if timer, err = a.DoneList.GetTimer(id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.TimerList.AddTimer(timer)
|
||||||
|
if err = a.WriteList(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
a.DoneList.RemoveTimer(*timer)
|
||||||
|
return a.WriteDoneList()
|
||||||
|
}
|
||||||
|
|
||||||
func (a *AppState) LoadTimerList() error {
|
func (a *AppState) LoadTimerList() error {
|
||||||
var err error
|
var err error
|
||||||
var tl timertxt.TimerList
|
var tl timertxt.TimerList
|
||||||
@ -30,7 +70,6 @@ func (a *AppState) WriteList() error {
|
|||||||
return a.TimerList.WriteToFilename(a.getTimerFile())
|
return a.TimerList.WriteToFilename(a.getTimerFile())
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func (a *AppState) LoadDoneList() error {
|
func (a *AppState) LoadDoneList() error {
|
||||||
var err error
|
var err error
|
||||||
var tl timertxt.TimerList
|
var tl timertxt.TimerList
|
||||||
@ -42,4 +81,50 @@ func (a *AppState) LoadDoneList() error {
|
|||||||
func (a *AppState) WriteDoneList() error {
|
func (a *AppState) WriteDoneList() error {
|
||||||
return a.DoneList.WriteToFilename(a.getDoneFile())
|
return a.DoneList.WriteToFilename(a.getDoneFile())
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
func (a *AppState) getFilterPredicate(filter string) func(timertxt.Timer) bool {
|
||||||
|
var predicates []func(timertxt.Timer) bool
|
||||||
|
// If none of the 'filter' is in upper-case, do a case-insensitive filter
|
||||||
|
checkCase := true
|
||||||
|
if strings.ToLower(filter) == filter {
|
||||||
|
checkCase = false
|
||||||
|
}
|
||||||
|
filterParts := strings.Split(filter, " ")
|
||||||
|
for _, part := range filterParts {
|
||||||
|
if strings.HasPrefix(part, "@") {
|
||||||
|
predicates = append(predicates, func(t timertxt.Timer) bool {
|
||||||
|
for _, v := range t.Contexts {
|
||||||
|
if "@"+v == part {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
} else if strings.HasPrefix(part, "+") {
|
||||||
|
predicates = append(predicates, func(t timertxt.Timer) bool {
|
||||||
|
for _, v := range t.Projects {
|
||||||
|
if "+"+v == part {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
predicates = append(predicates, func(t timertxt.Timer) bool {
|
||||||
|
val := t.Original
|
||||||
|
if !checkCase {
|
||||||
|
val = strings.ToLower(t.Original)
|
||||||
|
}
|
||||||
|
return strings.Contains(val, part)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return func(t timertxt.Timer) bool {
|
||||||
|
for _, v := range predicates {
|
||||||
|
if v(t) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
138
task_ops.go
138
task_ops.go
@ -1,138 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
timertxt "git.bullercodeworks.com/brian/go-timertxt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (a *AppState) opStatus(args []string) int {
|
|
||||||
fmt.Println("Current Time: " + time.Now().Format(time.Stamp))
|
|
||||||
if len(*a.TimerList.GetActiveTimers()) == 0 {
|
|
||||||
fmt.Println("No timers running")
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
for _, v := range *a.TimerList.GetActiveTimers() {
|
|
||||||
fmt.Println(timerToFriendlyString(&v))
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AppState) opListTimers(args []string) int {
|
|
||||||
// By default only list today
|
|
||||||
// Format:
|
|
||||||
// 2019/02/20 (9.25)
|
|
||||||
// start - end [ contexts ] [ projects ]
|
|
||||||
// ...
|
|
||||||
dayTotals := make(map[string]time.Duration)
|
|
||||||
for _, v := range *a.TimerList {
|
|
||||||
dur := v.FinishDate.Sub(v.StartDate)
|
|
||||||
if v.FinishDate.IsZero() {
|
|
||||||
dur = time.Now().Sub(v.StartDate)
|
|
||||||
}
|
|
||||||
dayTotals[v.StartDate.Format("2006/01/02")] += dur
|
|
||||||
}
|
|
||||||
var oldDayStr, dayStr string
|
|
||||||
for _, v := range *a.TimerList {
|
|
||||||
oldDayStr = dayStr
|
|
||||||
dayStr = v.StartDate.Format("2006/01/02")
|
|
||||||
if dayStr != oldDayStr {
|
|
||||||
wrkDur := dayTotals[dayStr].Round(GetRoundToDuration())
|
|
||||||
fmtStr := dayStr + " ( %.2f )\n"
|
|
||||||
fmt.Printf(fmtStr, DurationToDecimal(wrkDur))
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(" " + timerToFriendlyString(&v))
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AppState) opStartTimer(args []string) int {
|
|
||||||
var contexts, projects []string
|
|
||||||
t := timertxt.NewTimer()
|
|
||||||
contexts, args = getContextsFromSlice(args)
|
|
||||||
projects, args = getProjectsFromSlice(args)
|
|
||||||
if len(args) > 0 {
|
|
||||||
if start, err := parseFuzzyTime(args[0]); err == nil {
|
|
||||||
t.StartDate = start
|
|
||||||
args = args[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
t.Contexts = contexts
|
|
||||||
t.Projects = projects
|
|
||||||
|
|
||||||
a.TimerList.AddTimer(t)
|
|
||||||
if err := a.WriteList(); err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AppState) opStopTimer(args []string) int {
|
|
||||||
var err error
|
|
||||||
var wrk time.Time
|
|
||||||
end := time.Now()
|
|
||||||
id := -1
|
|
||||||
|
|
||||||
if len(args) > 0 {
|
|
||||||
if wrk, err = parseFuzzyTime(args[0]); err != nil {
|
|
||||||
id, err = strconv.Atoi(args[0])
|
|
||||||
} else {
|
|
||||||
end = wrk
|
|
||||||
args = args[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Println("Stopping at : " + end.Format(time.RFC3339))
|
|
||||||
var timerIds []int
|
|
||||||
if id == -1 {
|
|
||||||
for _, v := range *a.TimerList.GetActiveTimers() {
|
|
||||||
timerIds = append(timerIds, v.Id)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
timerIds = append(timerIds, id)
|
|
||||||
}
|
|
||||||
for _, v := range timerIds {
|
|
||||||
var stopped *timertxt.Timer
|
|
||||||
if stopped, err = a.TimerList.GetTimer(v); err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
}
|
|
||||||
if err = a.SetTimerFinished(v, end); err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Println("Stopped Timer:", timerToFriendlyString(stopped))
|
|
||||||
}
|
|
||||||
if err = a.WriteList(); err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AppState) opState(args []string) int {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AppState) opFuzzyParse(args []string) int {
|
|
||||||
if len(args) > 0 {
|
|
||||||
if start, err := parseFuzzyTime(args[0]); err == nil {
|
|
||||||
fmt.Println(start.Format(time.RFC3339))
|
|
||||||
} else {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AppState) opPrintUsage(args []string) int {
|
|
||||||
for _, v := range a.ValidOperations {
|
|
||||||
for _, vv := range v {
|
|
||||||
fmt.Println(" " + vv)
|
|
||||||
fmt.Println("")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user