4.2.1: Изменена сортировка желаний
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m31s

This commit is contained in:
poignatov
2026-01-29 15:54:04 +03:00
parent ba0f34c91b
commit 4e270cb322
3 changed files with 53 additions and 39 deletions

View File

@@ -1 +1 @@
4.2.0 4.2.1

View File

@@ -11900,6 +11900,26 @@ func (a *App) getBoardItemsHandler(w http.ResponseWriter, r *http.Request) {
} }
} }
// Сортируем unlocked по возрастанию суммы баллов (от меньшего к большему)
sort.Slice(unlocked, func(i, j int) bool {
valueI := calculateUnlockedSortValue(unlocked[i])
valueJ := calculateUnlockedSortValue(unlocked[j])
if valueI == valueJ {
return unlocked[i].ID < unlocked[j].ID
}
return valueI < valueJ
})
// Сортируем locked по возрастанию суммы оставшихся баллов (от меньшего к большему)
sort.Slice(locked, func(i, j int) bool {
valueI := calculateLockedSortValue(locked[i])
valueJ := calculateLockedSortValue(locked[j])
if valueI == valueJ {
return locked[i].ID < locked[j].ID
}
return valueI < valueJ
})
// Считаем завершённые // Считаем завершённые
var completedCount int var completedCount int
a.DB.QueryRow(`SELECT COUNT(*) FROM wishlist_items WHERE board_id = $1 AND completed = TRUE AND deleted = FALSE`, a.DB.QueryRow(`SELECT COUNT(*) FROM wishlist_items WHERE board_id = $1 AND completed = TRUE AND deleted = FALSE`,
@@ -12130,24 +12150,32 @@ func (a *App) getBoardCompletedHandler(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(completed) json.NewEncoder(w).Encode(completed)
} }
// getWishlistItemsByBoard загружает желания конкретной доски // calculateUnlockedSortValue считает сумму баллов, которые были нужны для разблокировки
// calculateUnlockValue вычисляет значение для сортировки желаний // Задача считается как 1 балл, project_points как required_points
// Возвращает значение, где: func calculateUnlockedSortValue(item WishlistItem) float64 {
// - Отрицательные значения: unlocked элементы (ставим в начало) var totalRequired float64 = 0.0
// - Положительные значения: сумма оставшихся баллов для locked элементов (меньше = выше в списке) for _, condition := range item.UnlockConditions {
func calculateUnlockValue(item WishlistItem) float64 { if condition.Type == "task_completion" {
// Если элемент уже unlocked, ставим его в начало (отрицательное значение) totalRequired += 1.0
if item.Unlocked { } else if condition.Type == "project_points" {
return -1.0 if condition.RequiredPoints != nil {
totalRequired += *condition.RequiredPoints
}
}
}
return totalRequired
} }
// Суммируем оставшиеся баллы по всем условиям project_points // calculateLockedSortValue считает сумму оставшихся баллов для разблокировки
// Задача считается как 1 балл (если не выполнена), project_points как remaining баллы
func calculateLockedSortValue(item WishlistItem) float64 {
var totalRemaining float64 = 0.0 var totalRemaining float64 = 0.0
var hasProjectPointsConditions bool = false
for _, condition := range item.UnlockConditions { for _, condition := range item.UnlockConditions {
if condition.Type == "project_points" { if condition.Type == "task_completion" {
hasProjectPointsConditions = true if condition.TaskCompleted == nil || !*condition.TaskCompleted {
totalRemaining += 1.0
}
} else if condition.Type == "project_points" {
if condition.CurrentPoints != nil && condition.RequiredPoints != nil { if condition.CurrentPoints != nil && condition.RequiredPoints != nil {
remaining := *condition.RequiredPoints - *condition.CurrentPoints remaining := *condition.RequiredPoints - *condition.CurrentPoints
if remaining > 0 { if remaining > 0 {
@@ -12156,15 +12184,14 @@ func calculateUnlockValue(item WishlistItem) float64 {
} }
} }
} }
// Если нет условий или все условия выполнены, ставим в конец
// Если есть условия project_points, возвращаем сумму оставшихся баллов if totalRemaining == 0.0 && len(item.UnlockConditions) > 0 {
if hasProjectPointsConditions { return 999999.0
}
return totalRemaining return totalRemaining
} }
// Элементы без условий project_points ставим в конец (большое значение) // getWishlistItemsByBoard загружает желания конкретной доски
return 999999.0
}
func (a *App) getWishlistItemsByBoard(boardID int, userID int) ([]WishlistItem, error) { func (a *App) getWishlistItemsByBoard(boardID int, userID int) ([]WishlistItem, error) {
query := ` query := `
@@ -12341,19 +12368,6 @@ func (a *App) getWishlistItemsByBoard(boardID int, userID int) ([]WishlistItem,
items = append(items, *item) items = append(items, *item)
} }
// Сортируем: сначала unlocked, затем по сумме оставшихся баллов (от меньшего к большему)
sort.Slice(items, func(i, j int) bool {
valueI := calculateUnlockValue(items[i])
valueJ := calculateUnlockValue(items[j])
// Если значения равны, сортируем по ID для стабильного порядка
if valueI == valueJ {
return items[i].ID < items[j].ID
}
return valueI < valueJ
})
return items, nil return items, nil
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "play-life-web", "name": "play-life-web",
"version": "4.2.0", "version": "4.2.1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",