package main import ( //"os" "strings" "strconv" "fmt" "github.com/abiosoft/ishell" "github.com/fatih/color" ) func interact() { stdOut() shell := ishell.New() cyan := color.New(color.FgCyan).SprintFunc() yellow := color.New(color.FgYellow).SprintFunc() green := color.New(color.FgGreen).SprintFunc() // boldGreen := color.New(color.FgGreen, color.Bold).SprintFunc() boldRed := color.New(color.FgRed, color.Bold).SprintFunc() // display info. shell.Println("Starting interactive Shell") shell.AddCmd(&ishell.Cmd{ Name: "new", Help: "Start new Project", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") //c.Println(boldGreen("Start New Project")) newProject() showLastProject() }, }) shell.AddCmd(&ishell.Cmd{ Name: "add", Help: "Add new Customer", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") //c.Println(boldGreen("Start New Project")) addCustomer() }, }) shell.AddCmd(&ishell.Cmd{ Name: "startnow", Help: "Start a new Task immediately", Func: func(c *ishell.Context) { //c.Println(boldGreen("New Task")) newTask(projectid) stdOut() }, }) shell.AddCmd(&ishell.Cmd{ Name: "stopnow", Help: "Stop the currently Open Task immediately", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") //c.Println(boldGreen("Stoping Task",opentask.id)) closeTask() stdOut() }, }) shell.AddCmd(&ishell.Cmd{ Name: "deletetask", Help: " Delete a Task with the following id", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") argi,err := strconv.Atoi(arg) if err == nil{ //c.Println(boldGreen("Opening Project",argi)) deleteTask(argi) stdOut() }else{ c.Println(boldRed(arg,"is not a valid id!")) } }else{ c.Println(boldRed("deletetask - Please enter an id")) allProjects() } }, }) shell.AddCmd(&ishell.Cmd{ Name: "project", Help: " Open a Project of the following id", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") argi,err := strconv.Atoi(arg) if err == nil{ //c.Println(boldGreen("Opening Project",argi)) setProject(argi) stdOut() }else{ c.Println(boldRed(arg,"is not a valid id!")) } }else{ c.Println(boldRed("project - Please enter an id")) allProjects() } }, }) shell.AddCmd(&ishell.Cmd{ Name: "edittask", Help: " Edit a Task of the following id", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") argi,err := strconv.Atoi(arg) if err == nil{ //c.Println(boldGreen("Editing Task",argi)) editTask(argi) //stdOut() }else{ c.Println(boldRed(arg,"is not a valid id!")) } }else{ c.Println(boldRed("edittask - Please enter an id")) } }, }) shell.AddCmd(&ishell.Cmd{ Name: "editproject", Help: " Edit the Project of the following id", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") argi,err := strconv.Atoi(arg) if err == nil{ //c.Println(boldGreen("Edit Project",argi)) editProject(argi) allProjects() //stdOut() }else{ c.Println(boldRed(arg,"is not a valid id!")) } }else{ c.Println(boldRed("editproject - Please enter an id")) allProjects() } }, }) shell.AddCmd(&ishell.Cmd{ Name: "editcustomer", Help: " Edit the Customer of the following id", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") argi,err := strconv.Atoi(arg) if err == nil{ //c.Println(boldGreen("Edit Project",argi)) editCustomer(argi) allCustomers() //stdOut() }else{ c.Println(boldRed(arg,"is not a valid id!")) } }else{ c.Println(boldRed("editcustomer - Please enter an id")) allCustomers() } }, }) shell.AddCmd(&ishell.Cmd{ Name: "start", Help: " - Start Task at a specific Time 'YYYY-MM-DD HH:MM' Or 'HH:MM'", Func: func(c *ishell.Context) { arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") //c.Println(boldGreen("Start Project at",arg)) newTaskTime(projectid,arg) // editProject(argi) stdOut() }else{ c.Println(boldRed("start - Please enter a Datetime")) } }, }) shell.AddCmd(&ishell.Cmd{ Name: "stop", Help: " - Stop Open Task at a specific Time 'YYYY-MM-DD HH:MM' Or 'HH:MM'", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") arg := "none" if len(c.Args) > 0 { arg = strings.Join(c.Args, " ") //c.Println(boldGreen("Stop Task at",arg)) closeTaskTime(arg) stdOut() }else{ c.Println(boldRed("stop - Please enter a Datetime")) } }, }) shell.AddCmd(&ishell.Cmd{ Name: "all", Help: "Show all Projects Project", Func: func(c *ishell.Context) { //c.Print("\033[H\033[2J") //c.Println(boldGreen("Start New Project")) allProjects() stdOut() }, }) shell.AddCmd(&ishell.Cmd{ Name: "color", Help: "color print", Func: func(c *ishell.Context) { c.Print(cyan("cyan\n")) c.Print(green("greencyan\n")) c.Println(yellow("yellow")) c.Printf("%s\n", boldRed("bold red")) }, }) // multiple choice shell.AddCmd(&ishell.Cmd{ Name: "choice", Help: "multiple choice prompt", Func: func(c *ishell.Context) { choice := c.MultiChoice([]string{ "Golangers", "Go programmers", "Gophers", "Goers", }, "What are Go programmers called ?") if choice == 2 { c.Println("You got it!") } else { c.Println("Sorry, you're wrong.") } }, }) // multiple choice shell.AddCmd(&ishell.Cmd{ Name: "checklist", Help: "checklist prompt", Func: func(c *ishell.Context) { languages := []string{"Python", "Go", "Haskell", "Rust"} choices := c.Checklist(languages, "What are your favourite programming languages ?", nil) out := func() (c []string) { for _, v := range choices { c = append(c, languages[v]) } return } c.Println("Your choices are", strings.Join(out(), ", ")) }, }) // Gather Tasks For Bills shell.AddCmd(&ishell.Cmd{ Name: "bill", Help: "Select Tasks to be billed", Func: func(c *ishell.Context) { nix := []int{0} ids,str := getTaskList(nix,true) choices := c.Checklist(str, "What Tasks do you want to bill ?", nil) out := func() (c []int) { for _, v := range choices { c = append(c, ids[v]) } return } selids := out() //bids,str2 := getTaskList(selids,false) //c.Println(bids,str2) c.Println(len(out()),"Tasks Selected") multicust, multiproj,projids := checkCustomerProjects(selids) // CHECK IF ONLY ONE CUSTOMER billprojid := 0 if multicust { c.Println("Cannot Write One Bill to multiple Customers! Please Select different Tasks") }else{ // CHECK IF ONLY ONE PROJECT ELSE CHOOSE ONE if multiproj { prid,prstr :=getProjectList(projids) sel := c.MultiChoice(prstr, "What Project Should be Billed ?") billprojid = prid[sel] }else{ billprojid = projids[0] } seltasks := getSelectedTasks(selids) count,hours,dur := analyzeTasks(seltasks) //c.Printf("%v Tasks Selected. Totaling %.2f (h) - Dates: %s\n",count,hours,dur) proj,cust := getProject(billprojid) billid := newBill(billprojid) //prs,cus := getProjectName(billprojid) c.Println("For",cust.company,"-",cust.name) c.Println("Project:",proj.name,"- ID:",proj.id) c.Println("Projected Income:",hours*cust.satz,"€") c.Println("Create New Bill:",billid) c.ReadLine() //Make NEW BILL WITH ID and INV No fullbillinfo := fmt.Sprintf("For: %s - %s - Invoice: %s\nProject: %s - Id:%v\n%v Tasks Selected. Totaling %.2f (h) - Dates: %s\nProjected Income: %.2f(€)\n",cust.company,cust.name,billid,proj.name,proj.id,count,hours,dur,hours*cust.satz) sep := "-------------------------\n" restinfo := "Here some Info about the rest" restids := selids //allaccounted := false //resttasks := seltasks //SELECT SUBSET AND NAME BILLITEM //c.clear()//Println(some,"Str2:",str2) for { if len(restids) == 0 { break } rids,rstr := getTaskList(restids,false) restinfo = "Select Tasks to Group as Billitem" pre := fmt.Sprintf("%s%s%s",fullbillinfo,sep,restinfo) choices2 := c.Checklist(rstr,pre,nil) out = func() (c []int) { for _, v := range choices2 { c = append(c, rids[v]) } return } taskids := out() restids = removeItems(restids,taskids) c.Println("Full",selids,"Your choices are",taskids,"Rest:",removeItems(selids,taskids)) } } }, }) shell.Run() // teardown shell.Close() // when started with "exit" as first argument, assume non-interact ive execution // if len(os.Args) > 1 && os.Args[1] == "exit" { // shell.Process(os.Args[2:]...) // } else { // start shell // shell.Run() // teardown // shell.Close() //} }