4.2.1: Изменена сортировка желаний
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m31s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m31s
This commit is contained in:
@@ -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 элементов (меньше = выше в списке)
|
|
||||||
func calculateUnlockValue(item WishlistItem) float64 {
|
|
||||||
// Если элемент уже unlocked, ставим его в начало (отрицательное значение)
|
|
||||||
if item.Unlocked {
|
|
||||||
return -1.0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Суммируем оставшиеся баллы по всем условиям project_points
|
|
||||||
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
|
totalRequired += 1.0
|
||||||
|
} else if condition.Type == "project_points" {
|
||||||
|
if condition.RequiredPoints != nil {
|
||||||
|
totalRequired += *condition.RequiredPoints
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return totalRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculateLockedSortValue считает сумму оставшихся баллов для разблокировки
|
||||||
|
// Задача считается как 1 балл (если не выполнена), project_points как remaining баллы
|
||||||
|
func calculateLockedSortValue(item WishlistItem) float64 {
|
||||||
|
var totalRemaining float64 = 0.0
|
||||||
|
for _, condition := range item.UnlockConditions {
|
||||||
|
if condition.Type == "task_completion" {
|
||||||
|
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,16 +12184,15 @@ 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 ставим в конец (большое значение)
|
|
||||||
return 999999.0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getWishlistItemsByBoard загружает желания конкретной доски
|
||||||
|
|
||||||
func (a *App) getWishlistItemsByBoard(boardID int, userID int) ([]WishlistItem, error) {
|
func (a *App) getWishlistItemsByBoard(boardID int, userID int) ([]WishlistItem, error) {
|
||||||
query := `
|
query := `
|
||||||
SELECT
|
SELECT
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user