mirror of
https://github.com/arnaucube/wtt.git
synced 2026-02-27 21:46:40 +01:00
implemented list with and without details, delete (rm), showHoursByDays
This commit is contained in:
62
README.md
62
README.md
@@ -1,25 +1,69 @@
|
||||
# wtt
|
||||
Work Time Tracker - console time tracking app
|
||||
|
||||
Add wtt to the path:
|
||||
```
|
||||
export PATH="$PATH:/home/user/path/wtt"
|
||||
```
|
||||
|
||||
### Use
|
||||
Create new project
|
||||
- Create new project
|
||||
```
|
||||
./wtt new ProjectName
|
||||
wtt new ProjectName
|
||||
```
|
||||
- Abreviation:
|
||||
```
|
||||
wtt n ProjectName
|
||||
```
|
||||
|
||||
|
||||
Start working on a project
|
||||
- List projects
|
||||
```
|
||||
./wtt start ProjectName
|
||||
wtt list
|
||||
```
|
||||
- Abreviation:
|
||||
```
|
||||
wtt ls
|
||||
```
|
||||
|
||||
Stop working on the current project
|
||||
- Also can list with more details using:
|
||||
```
|
||||
./wtt stop
|
||||
wtt ls -a
|
||||
```
|
||||
|
||||
List projects
|
||||
- Start working on a project
|
||||
```
|
||||
./wtt list
|
||||
wtt start ProjectName
|
||||
```
|
||||
- Abreviation:
|
||||
```
|
||||
wtt s ProjectName
|
||||
```
|
||||
|
||||
- Stop working on the current project
|
||||
```
|
||||
wtt stop
|
||||
```
|
||||
|
||||
- Delete project
|
||||
```
|
||||
wtt rm ProjectName
|
||||
```
|
||||
|
||||
- Show current working
|
||||
```
|
||||
wtt current
|
||||
```
|
||||
- Abreviation:
|
||||
```
|
||||
wtt c
|
||||
```
|
||||
- Help:
|
||||
```
|
||||
wtt help
|
||||
```
|
||||
- Abreviation:
|
||||
```
|
||||
wtt h
|
||||
```
|
||||
|
||||

|
||||
|
||||
55
main.go
55
main.go
@@ -25,7 +25,7 @@ func main() {
|
||||
//get the command line parameters
|
||||
if len(os.Args) > 1 {
|
||||
switch os.Args[1] {
|
||||
case "new":
|
||||
case "new", "n":
|
||||
//create project os.Args[2]
|
||||
if len(os.Args) > 2 {
|
||||
projectName := os.Args[2]
|
||||
@@ -39,11 +39,18 @@ func main() {
|
||||
color.Red("No project name specified")
|
||||
}
|
||||
break
|
||||
case "list":
|
||||
case "list", "ls":
|
||||
if len(os.Args) > 2 {
|
||||
param := os.Args[2]
|
||||
if param == "-a" {
|
||||
listProjectsDetails()
|
||||
}
|
||||
} else {
|
||||
//list projects
|
||||
listProjects()
|
||||
}
|
||||
break
|
||||
case "start":
|
||||
case "start", "s":
|
||||
//check if already there is any project started
|
||||
if work.CurrentProjectName != "" {
|
||||
color.Red("Can not start project, already project " + work.CurrentProjectName + " running")
|
||||
@@ -63,6 +70,8 @@ func main() {
|
||||
work.CurrentProjectName = projectName
|
||||
saveWork()
|
||||
fmt.Println("starting to work in project " + work.Projects[i].Name)
|
||||
} else {
|
||||
color.Red("No project name to start selected")
|
||||
}
|
||||
break
|
||||
case "stop":
|
||||
@@ -80,18 +89,46 @@ func main() {
|
||||
work.Projects[i].Streaks[j].Duration = time.Now().Sub(work.Projects[i].Streaks[j].Start)
|
||||
work.CurrentProjectName = ""
|
||||
saveWork()
|
||||
fmt.Print("Worked ")
|
||||
fmt.Print(work.Projects[i].Streaks[j].Duration)
|
||||
fmt.Println(" in the project " + work.Projects[i].Name)
|
||||
|
||||
//stop project os.Args[2]
|
||||
color.Green("Worked " + work.Projects[i].Streaks[j].Duration.String() + " in the project " + work.Projects[i].Name)
|
||||
break
|
||||
case "rm":
|
||||
if len(os.Args) > 2 {
|
||||
projectName := os.Args[2]
|
||||
if work.CurrentProjectName == projectName {
|
||||
work.CurrentProjectName = ""
|
||||
}
|
||||
deleteProject(projectName)
|
||||
saveWork()
|
||||
color.Yellow("Project " + projectName + " deleted")
|
||||
} else {
|
||||
color.Red("no project name specified")
|
||||
}
|
||||
|
||||
break
|
||||
case "current", "c":
|
||||
if work.CurrentProjectName != "" {
|
||||
fmt.Print("Current working project: ")
|
||||
color.Blue(work.CurrentProjectName)
|
||||
} else {
|
||||
fmt.Println("No current working project.")
|
||||
}
|
||||
case "help", "h":
|
||||
fmt.Println("./wtt new {projectname}")
|
||||
fmt.Println("./wtt ls")
|
||||
fmt.Println("./wtt ls -a")
|
||||
fmt.Println("./wtt start {projectname}")
|
||||
fmt.Println("./wtt stop")
|
||||
fmt.Println("./wtt rm")
|
||||
fmt.Println("./wtt current")
|
||||
fmt.Println("./wtt help")
|
||||
default:
|
||||
color.Red("no option selected")
|
||||
color.Red("option not exists")
|
||||
os.Exit(1)
|
||||
}
|
||||
} else {
|
||||
color.Red("no option selected")
|
||||
fmt.Println("Can run 'help' for commands information")
|
||||
fmt.Println("./wtt help")
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
56
work.go
56
work.go
@@ -75,7 +75,7 @@ func newProject(name string) error {
|
||||
work.Projects = append(work.Projects, newProject)
|
||||
return nil
|
||||
}
|
||||
func listProjects() {
|
||||
func listProjectsDetails() {
|
||||
fmt.Println("")
|
||||
fmt.Println("")
|
||||
fmt.Println("Listing projects")
|
||||
@@ -94,5 +94,59 @@ func listProjects() {
|
||||
fmt.Println(streak.Duration)
|
||||
}
|
||||
fmt.Println("")
|
||||
showHoursByDays(project.Name)
|
||||
fmt.Println("")
|
||||
}
|
||||
if work.CurrentProjectName != "" {
|
||||
fmt.Print("Current working project: ")
|
||||
color.Blue(work.CurrentProjectName)
|
||||
}
|
||||
}
|
||||
func listProjects() {
|
||||
fmt.Println("")
|
||||
fmt.Println("")
|
||||
fmt.Println("Listing projects")
|
||||
fmt.Println("")
|
||||
for k, project := range work.Projects {
|
||||
fmt.Println("project " + strconv.Itoa(k))
|
||||
fmt.Print("name: ")
|
||||
color.Blue(project.Name)
|
||||
showHoursByDays(project.Name)
|
||||
fmt.Println("")
|
||||
}
|
||||
if work.CurrentProjectName != "" {
|
||||
fmt.Print("Current working project: ")
|
||||
color.Blue(work.CurrentProjectName)
|
||||
}
|
||||
}
|
||||
func deleteProject(name string) {
|
||||
i := getProjectIByName(name)
|
||||
if i < 0 {
|
||||
color.Red("Project name: " + name + ", no exists")
|
||||
return
|
||||
}
|
||||
work.Projects = append(work.Projects[:i], work.Projects[i+1:]...)
|
||||
}
|
||||
func showHoursByDays(name string) {
|
||||
timeFormat := "Mon, 01/02/06"
|
||||
i := getProjectIByName(name)
|
||||
if i < 0 {
|
||||
color.Red("Project name: " + name + ", no exists")
|
||||
return
|
||||
}
|
||||
p := work.Projects[i]
|
||||
days := make(map[string]time.Duration)
|
||||
for _, streak := range p.Streaks {
|
||||
days[streak.Start.Format(timeFormat)] = addDurations(days[streak.Start.Format(timeFormat)], streak.Duration)
|
||||
}
|
||||
for day, hours := range days {
|
||||
fmt.Print(" Day: " + day)
|
||||
fmt.Print(", total time: ")
|
||||
fmt.Println(hours)
|
||||
}
|
||||
}
|
||||
func addDurations(d1 time.Duration, d2 time.Duration) time.Duration {
|
||||
s := d1.Seconds() + d2.Seconds()
|
||||
r := time.Duration(s) * time.Second
|
||||
return r
|
||||
}
|
||||
|
||||
BIN
wtt_demo.gif
Normal file
BIN
wtt_demo.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
Reference in New Issue
Block a user