From afb0a04fe600575b00d551da7dce6a08679ef7b8 Mon Sep 17 00:00:00 2001 From: Julian T Date: Sun, 26 May 2024 22:20:40 +0200 Subject: Working task selection --- tidsreg.go | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 141 insertions(+), 19 deletions(-) (limited to 'tidsreg.go') diff --git a/tidsreg.go b/tidsreg.go index e327f74..b988ad7 100644 --- a/tidsreg.go +++ b/tidsreg.go @@ -18,20 +18,27 @@ type Server struct { srv *Service } +func parseIdInt(str string) (int, error) { + var id int = -1 + if str != "" { + idLong, err := strconv.ParseInt(str, 10, 32) + if err != nil { + return -1, err + } + id = int(idLong) + } + return id, nil +} + func parseTaskFromForm(r *http.Request) (*Task, error) { err := r.ParseForm() if err != nil { return nil, err } - var id int64 - if r.PostFormValue("id") == "" { - id = -1 - } else { - id, err = strconv.ParseInt(r.PostFormValue("id"), 10, 32) - if err != nil { - return nil, err - } + id, err := parseIdInt(r.PostFormValue("id")) + if err != nil { + return nil, err } var group *string @@ -57,12 +64,59 @@ func parseTaskFromForm(r *http.Request) (*Task, error) { }, nil } +func readTaskSelectFromPost(r *http.Request, index string) (int, *time.Duration, bool, error) { + idS := r.PostFormValue(fmt.Sprintf("task-%s-id", index)) + if idS == "" || idS == "-" { + return -1, nil, false, nil + } + id, err := parseIdInt(idS) + if err != nil { + return -1, nil, false, err + } + + durS := r.PostFormValue(fmt.Sprintf("task-%s-part", index)) + if durS == "" { + return id, nil, true, nil + } + dur, err := time.ParseDuration(durS) + if err != nil { + return -1, nil, false, err + } + + return id, &dur, true, nil +} + func parseEntryFromForm(r *http.Request, useToday bool) (*Entry, error) { err := r.ParseForm() if err != nil { return nil, err } + tasks := map[int]*time.Duration{} + taskCount, err := strconv.ParseInt(r.PostFormValue("task-count"), 10, 32) + if err != nil { + return nil, fmt.Errorf("Error reading task-count: %w", err) + } + for i := 0; i < int(taskCount); i++ { + id, dur, ok, err := readTaskSelectFromPost(r, fmt.Sprintf("%d", i)) + if err != nil { + return nil, err + } + if !ok { + continue + } + tasks[id] = dur + } + { + id, dur, ok, err := readTaskSelectFromPost(r, "new") + if err != nil { + return nil, fmt.Errorf("Error reading new task select: %w", err) + } + if ok { + tasks[id] = dur + } + } + var date Date dateP, err := DateFromString(r.PostFormValue("date")) if err != nil { @@ -85,28 +139,51 @@ func parseEntryFromForm(r *http.Request, useToday bool) (*Entry, error) { if err != nil { return nil, err } - var id int64 - if r.PostFormValue("id") == "" { - id = -1 - } else { - id, err = strconv.ParseInt(r.PostFormValue("id"), 10, 32) - if err != nil { - return nil, err - } + id, err := parseIdInt(r.PostFormValue("id")) + if err != nil { + return nil, err } + log.Printf("hej hej %+v\n", tasks) task := &Entry{ Id: int(id), From: from, Date: date, To: to, + Tasks: tasks, Comment: r.PostFormValue("comment"), } return task, nil } func (s *Server) renderTemplate(w http.ResponseWriter, name string, page interface{}) { - tmpl, err := template.ParseFiles("templates/index.html", "templates/parts/entry.html", "templates/parts/entryRows.html", "templates/parts/task.html", "templates/parts/taskRows.html") + tmpl := template.New("").Funcs(template.FuncMap { + "arr": (func (els ...interface{}) []interface{} { + return els + }), + "taskMapToArr": (func (taskMap map[int]*time.Duration) [](struct {Key int; Id int; Sel *string}) { + res := make([](struct {Key int; Id int; Sel *string}), 0, len(taskMap)) + count := 0 + for taskId, sel := range taskMap { + thing := struct {Key int; Id int; Sel *string}{ + Key: count, + Id: taskId, + Sel: nil, + } + if sel != nil { + formatted := sel.String() + thing.Sel = &formatted + } + res = append(res, thing) + + count += 1 + } + + fmt.Printf("Hej, %+v, lul: %+v\n", res, taskMap) + return res + }), + }) + tmpl, err := tmpl.ParseFiles("templates/index.html", "templates/parts/entry.html", "templates/parts/entryRows.html", "templates/parts/task.html", "templates/parts/taskRows.html", "templates/parts/taskEntry.html") if err != nil { writeError(w, err.Error(), http.StatusInternalServerError) return @@ -269,12 +346,11 @@ func (s *Server) getNew(w http.ResponseWriter, r *http.Request) { } func (s *Server) getEdit(w http.ResponseWriter, r *http.Request) { - idLarge, err := strconv.ParseInt(r.URL.Query().Get("id"), 10, 32) + id, err := parseIdInt(r.URL.Query().Get("id")) if err != nil { writeError(w, err.Error(), http.StatusInternalServerError) return } - id := int(idLarge) entries, err := s.srv.Db.QueryEntry(&id, nil) if err != nil { @@ -359,6 +435,50 @@ func (s *Server) getTaskEmpty(w http.ResponseWriter, _ *http.Request) { s.renderTemplate(w, "task.html", page) } +func (s *Server) getTaskEdit(w http.ResponseWriter, r *http.Request) { + id, err := parseIdInt(r.URL.Query().Get("id")) + if err != nil { + writeError(w, err.Error(), http.StatusBadRequest) + return + } + + page, err := s.srv.GetTaskPage(&id, nil) + if err != nil { + writeError(w, err.Error(), http.StatusInternalServerError) + return + } + + s.renderTemplate(w, "task.html", page) +} + +func (s *Server) getTaskSelect(w http.ResponseWriter, r *http.Request) { + page, err := s.srv.GetTasksPage() + if err != nil { + writeError(w, err.Error(), http.StatusInternalServerError) + return + } + + var selected int = -1 + { + selectedStr := r.URL.Query().Get("selected") + if selectedStr != "" { + selectedLong, err := strconv.ParseInt(selectedStr, 10, 32) + if err != nil { + writeError(w, err.Error(), http.StatusBadRequest) + return + } + selected = int(selectedLong) + } + } + + args := []interface{}{ + &page.GroupToTasks, + selected, + } + + s.renderTemplate(w, "taskEntry.html", args) +} + func main() { fmt.Println("Hello world!") @@ -378,6 +498,8 @@ func main() { r.HandleFunc("/task/list", s.getTasksList).Methods("GET") r.HandleFunc("/task/save", s.postTaskSave).Methods("POST") r.HandleFunc("/task/empty", s.getTaskEmpty).Methods("GET") + r.HandleFunc("/task/edit", s.getTaskEdit).Methods("GET") + r.HandleFunc("/task/select", s.getTaskSelect).Methods("GET") r.HandleFunc("/", s.rootHandle) http.Handle("/", r) -- cgit v1.2.3