task sorting might work

master
bel 2020-01-20 21:14:02 -07:00
parent cb73169eeb
commit 6319c18ddd
1 changed files with 27 additions and 30 deletions

View File

@ -7,10 +7,16 @@ import (
"local/todo-server/server/ajax/form" "local/todo-server/server/ajax/form"
"local/todo-server/server/ajax/task" "local/todo-server/server/ajax/task"
"net/http" "net/http"
"sort"
"strconv" "strconv"
"strings" "strings"
) )
type taskWithDelta struct {
task *task.Task
delta int
}
func (a *Ajax) loadTasks(w http.ResponseWriter, r *http.Request) error { func (a *Ajax) loadTasks(w http.ResponseWriter, r *http.Request) error {
listID, _, _ := a.Cur(r) listID, _, _ := a.Cur(r)
filterComplete := filterComplete(form.Get(r, "compl")) 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 { func (a *Ajax) changeOrder(w http.ResponseWriter, r *http.Request) error {
order := form.Get(r, "order") order := form.Get(r, "order")
orders := strings.Split(order, "&") orders := strings.Split(order, "&")
sum := 0 modified := make([]taskWithDelta, 0)
zero := "" indices := make([]int, 0)
for _, order := range orders { for _, order := range orders {
taskIDDelta := strings.Split(order, "=") taskIDDelta := strings.Split(order, "=")
if len(taskIDDelta) < 2 { if len(taskIDDelta) < 2 {
@ -167,43 +173,34 @@ func (a *Ajax) changeOrder(w http.ResponseWriter, r *http.Request) error {
} }
taskID := taskIDDelta[0] taskID := taskIDDelta[0]
delta, _ := strconv.Atoi(taskIDDelta[1]) delta, _ := strconv.Atoi(taskIDDelta[1])
if delta < 0 {
delta = -1
} else {
delta = 0
}
task, err := a.storageGetTask(taskID) task, err := a.storageGetTask(taskID)
if err != nil { if err != nil {
return err 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 { if err != nil {
return err return err
} }
task.Index += delta if err := a.storageSetTask(listID, &task); err != nil {
if err := a.storageSetTask(listID, task); err != nil {
return err return err
} }
if delta == 0 {
zero = taskID
}
sum += delta
} }
if zero == "" || sum == 0 {
return nil fmt.Fprintf(w, `{"total":1}`)
}
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 return nil
} }