package ajax import ( "encoding/json" "errors" "fmt" "local/todo-server/server/ajax/form" "local/todo-server/server/ajax/task" "net/http" "strconv" "strings" ) func (a *Ajax) loadTasks(w http.ResponseWriter, r *http.Request) error { listID, _, _ := a.Cur(r) filterComplete := func(t *task.Task) bool { if form.Get(r, "compl") == "" { return true } return form.Get(r, "compl") == "1" || !t.Complete } filterTags := func(t *task.Task) bool { if form.Get(r, "t") == "" { return true } whitelistTags := form.ToStrArr(form.Get(r, "t")) if len(whitelistTags) == 0 { return true } for _, whitelisted := range whitelistTags { found := false for _, tag := range t.Tags { if whitelisted == tag { found = true } } if !found { return false } } return true } filterSubstr := func(t *task.Task) bool { substr := form.Get(r, "s") return substr == "" || strings.Contains(fmt.Sprintf("%+v", t), substr) } tasks, err := a.storageListTasks(listID, filterComplete, filterTags, filterSubstr) if err != nil { return err } return json.NewEncoder(w).Encode(map[string]interface{}{"list": tasks}) } func (a *Ajax) newTask(w http.ResponseWriter, r *http.Request) error { listID, newTask, err := a.makeTask(r) if err != nil { return err } if err := a.storageSetTask(listID, newTask); err != nil { return err } return json.NewEncoder(w).Encode(map[string]interface{}{ "total": 1, "list": []*task.Task{newTask}, }) } func (a *Ajax) makeTask(r *http.Request) (string, *task.Task, error) { listID, _, tags := a.Cur(r) task, err := task.New(r) if err != nil { return "", nil, err } list, err := a.storageGetList(listID) if err != nil { return "", nil, err } task.Index = list.NextIndex() if err := a.storageSetList(list); err != nil { return "", nil, err } task.AppendTags(tags) return listID, task, nil } func (a *Ajax) deleteTask(w http.ResponseWriter, r *http.Request) error { _, taskID, _ := a.Cur(r) return a.storageDelTask(taskID) } func (a *Ajax) completeTask(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) completedTask, err := a.storageGetTask(taskID) if err != nil { return err } if err := a.storageDelTask(completedTask.UUID); err != nil { return err } completedTask.SetComplete(form.Get(r, "compl") == "1") if err := a.storageSetTask(listID, completedTask); err != nil { return err } return json.NewEncoder(w).Encode(map[string]interface{}{ "total": 1, "list": []*task.Task{completedTask}, }) } func (a *Ajax) editNote(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) task, err := a.storageGetTask(taskID) if err != nil { return err } task.SetNote(form.Get(r, "note")) return a.storageSetTask(listID, task) } func (a *Ajax) editTask(w http.ResponseWriter, r *http.Request) error { listID, task, err := a.makeTask(r) if err != nil { return err } _, taskID, _ := a.Cur(r) task.UUID = taskID return a.storageSetTask(listID, task) } func (a *Ajax) setPrio(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) task, err := a.storageGetTask(taskID) if err != nil { return err } task.SetPrio(form.ToInt(form.Get(r, "prio"))) return a.storageSetTask(listID, task) } func (a *Ajax) moveTask(w http.ResponseWriter, r *http.Request) error { _, taskID, _ := a.Cur(r) toList := form.Get(r, "to") task, err := a.storageGetTask(taskID) if err != nil { return err } if err := a.storageDelTask(taskID); err != nil { return err } return a.storageSetTask(toList, task) } func (a *Ajax) parseTaskStr(w http.ResponseWriter, r *http.Request) error { return errors.New("not impl") } func (a *Ajax) changeOrder(w http.ResponseWriter, r *http.Request) error { order := form.Get(r, "order") orders := strings.Split(order, "&") sum := 0 zero := "" for _, order := range orders { taskIDDelta := strings.Split(order, "=") if len(taskIDDelta) < 2 { continue } taskID := taskIDDelta[0] delta, _ := strconv.Atoi(taskIDDelta[1]) if delta < 0 { delta = -1 } else { delta = 0 } task, err := a.storageGetTask(taskID) if err != nil { return err } listID, err := a.taskIDToListID(taskID) if err != nil { return err } task.Index += delta if err := a.storageSetTask(listID, task); err != nil { return err } if delta == 0 { zero = taskID } sum += delta } if zero == "" || sum == 0 { return nil } task, err := a.storageGetTask(zero) if err != nil { return err } listID, err := a.taskIDToListID(zero) if err != nil { return err } task.Index -= sum if err := a.storageSetTask(listID, task); err != nil { return err } fmt.Fprint(w, `{"total":1}`) return nil }