summaryrefslogtreecommitdiff
path: root/tidsreg.go
diff options
context:
space:
mode:
Diffstat (limited to 'tidsreg.go')
-rw-r--r--tidsreg.go160
1 files changed, 141 insertions, 19 deletions
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)