package ajax import ( "encoding/json" "errors" "fmt" "local/todo-server/server/ajax/form" "local/todo-server/server/ajax/task" "net/http" "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 t.Complete == (form.Get(r, "compl") != "0") } 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 } whitelistTagMap := make(map[string]struct{}) for _, tag := range whitelistTags { whitelistTagMap[tag] = struct{}{} } for _, tag := range t.Tags { if _, ok := whitelistTagMap[tag]; ok { return true } } return false } 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.UUID, newTask); err != nil { return err } // {"total":4,"list":[ // {"id":"3455", // "title":"redo qvolution", // "listId":"18", // "date":"14 Oct 2019 12:56 PM", // "dateInt":1571079392, // "dateInline":"14 Oct", // "dateInlineTitle":"created at 14 Oct 2019 12:56 PM", // "dateEditedInt":1571079401, // "dateCompleted":"", // "dateCompletedInline":"", // "dateCompletedInlineTitle":"Completed at ", // "compl":0, // "prio":"0", // "note":"", // "noteText":"", // "ow":4, // "tags":"work", // "tags_ids":"138", // "duedate":"", // "dueClass":"", // "dueStr":"", // "dueInt":33330000, // "dueTitle":"Due "} // ]} 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 } task.AppendTags(tags) return listID, task, nil } func (a *Ajax) deleteTask(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) return a.storageDelTask(listID, taskID) } func (a *Ajax) completeTask(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) task, err := a.storageGetTask(listID, taskID) if err != nil { return err } task.SetComplete(form.Get(r, "compl") == "1") return a.storageSetTask(listID, taskID, task) } func (a *Ajax) editNote(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) task, err := a.storageGetTask(listID, taskID) if err != nil { return err } task.SetNote(form.Get(r, "note")) return a.storageSetTask(listID, taskID, 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 task.ID = task.UUID return a.storageSetTask(listID, task.UUID, task) } func (a *Ajax) setPrio(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) task, err := a.storageGetTask(listID, taskID) if err != nil { return err } task.SetPrio(form.ToInt(form.Get(r, "prio"))) return a.storageSetTask(listID, taskID, task) } func (a *Ajax) moveTask(w http.ResponseWriter, r *http.Request) error { listID, taskID, _ := a.Cur(r) toList := form.Get(r, "to") task, err := a.storageGetTask(listID, taskID) if err != nil { return err } a.storageDelTask(listID, taskID) return a.storageSetTask(toList, taskID, task) } func (a *Ajax) parseTaskStr(w http.ResponseWriter, r *http.Request) error { return errors.New("not impl") }