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/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
}