diff --git a/server/ajax/task.go b/server/ajax/task.go index 3750dfa..03afe3a 100755 --- a/server/ajax/task.go +++ b/server/ajax/task.go @@ -7,10 +7,16 @@ import ( "local/todo-server/server/ajax/form" "local/todo-server/server/ajax/task" "net/http" + "sort" "strconv" "strings" ) +type taskWithDelta struct { + task *task.Task + delta int +} + func (a *Ajax) loadTasks(w http.ResponseWriter, r *http.Request) error { listID, _, _ := a.Cur(r) filterComplete := filterComplete(form.Get(r, "compl")) @@ -158,8 +164,8 @@ func (a *Ajax) parseTaskStr(w http.ResponseWriter, r *http.Request) error { func (a *Ajax) changeOrder(w http.ResponseWriter, r *http.Request) error { order := form.Get(r, "order") orders := strings.Split(order, "&") - sum := 0 - zero := "" + modified := make([]taskWithDelta, 0) + indices := make([]int, 0) for _, order := range orders { taskIDDelta := strings.Split(order, "=") if len(taskIDDelta) < 2 { @@ -167,43 +173,34 @@ func (a *Ajax) changeOrder(w http.ResponseWriter, r *http.Request) error { } 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) + modified = append(modified, taskWithDelta{task: task, delta: delta}) + indices = append(indices, task.Index) + } + sort.Slice(modified, func(i, j int) bool { + if modified[i].delta < modified[j].delta { + return true + } else if modified[i].delta > modified[j].delta { + return false + } + return modified[i].task.Index < modified[j].task.Index + }) + sort.Ints(indices) + for i := 0; i < len(modified); i++ { + task := *modified[i].task + task.Index = indices[i] + listID, err := a.taskIDToListID(task.UUID) if err != nil { return err } - task.Index += delta - if err := a.storageSetTask(listID, task); err != nil { + 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}`) + + fmt.Fprintf(w, `{"total":1}`) return nil }