Split app into subpages, persist ingame time, and add 14-month dashboard calendar
This commit is contained in:
87
cmd/server/calendar.go
Normal file
87
cmd/server/calendar.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func buildTasksForDay(plans []Plan, month, day int) []Task {
|
||||
var tasks []Task
|
||||
for _, p := range plans {
|
||||
field := p.TargetName
|
||||
if strings.TrimSpace(field) == "" {
|
||||
field = "Unbekanntes Feld"
|
||||
}
|
||||
if p.StartMonth == month && p.StartDay == day {
|
||||
tasks = append(tasks, Task{Type: "Aussaat", Field: field, Message: fmt.Sprintf("%s auf %s aussaeen", p.CropName, field), SortOrder: 1})
|
||||
}
|
||||
if p.HarvestMonth == month && p.HarvestDay == day {
|
||||
tasks = append(tasks, Task{Type: "Ernte", Field: field, Message: fmt.Sprintf("%s auf %s ernten", p.CropName, field), SortOrder: 2})
|
||||
}
|
||||
}
|
||||
sort.Slice(tasks, func(i, j int) bool {
|
||||
if tasks[i].SortOrder == tasks[j].SortOrder {
|
||||
return tasks[i].Field < tasks[j].Field
|
||||
}
|
||||
return tasks[i].SortOrder < tasks[j].SortOrder
|
||||
})
|
||||
return tasks
|
||||
}
|
||||
|
||||
func buildCalendar(plans []Plan, startMonth, startDay, daysPerMonth, spanMonths int) []CalendarMonth {
|
||||
tasksByKey := make(map[string][]Task)
|
||||
for _, p := range plans {
|
||||
field := p.TargetName
|
||||
if strings.TrimSpace(field) == "" {
|
||||
field = "Unbekanntes Feld"
|
||||
}
|
||||
tasksByKey[fmt.Sprintf("%d-%d", p.StartMonth, p.StartDay)] = append(tasksByKey[fmt.Sprintf("%d-%d", p.StartMonth, p.StartDay)], Task{
|
||||
Type: "Aussaat",
|
||||
Field: field,
|
||||
Message: fmt.Sprintf("%s auf %s", p.CropName, field),
|
||||
SortOrder: 1,
|
||||
})
|
||||
tasksByKey[fmt.Sprintf("%d-%d", p.HarvestMonth, p.HarvestDay)] = append(tasksByKey[fmt.Sprintf("%d-%d", p.HarvestMonth, p.HarvestDay)], Task{
|
||||
Type: "Ernte",
|
||||
Field: field,
|
||||
Message: fmt.Sprintf("%s auf %s", p.CropName, field),
|
||||
SortOrder: 2,
|
||||
})
|
||||
}
|
||||
|
||||
var out []CalendarMonth
|
||||
for offset := 0; offset < spanMonths; offset++ {
|
||||
month := wrapMonth(startMonth + offset)
|
||||
yearOffset := (startMonth - 1 + offset) / 12
|
||||
label := monthNames[month-1]
|
||||
if yearOffset > 0 {
|
||||
label = fmt.Sprintf("%s (+%d Jahr)", label, yearOffset)
|
||||
}
|
||||
|
||||
fromDay := 1
|
||||
if offset == 0 {
|
||||
fromDay = startDay
|
||||
}
|
||||
var days []CalendarDay
|
||||
for day := fromDay; day <= daysPerMonth; day++ {
|
||||
key := fmt.Sprintf("%d-%d", month, day)
|
||||
items := append([]Task(nil), tasksByKey[key]...)
|
||||
sort.Slice(items, func(i, j int) bool {
|
||||
if items[i].SortOrder == items[j].SortOrder {
|
||||
return items[i].Field < items[j].Field
|
||||
}
|
||||
return items[i].SortOrder < items[j].SortOrder
|
||||
})
|
||||
days = append(days, CalendarDay{Day: day, Tasks: items})
|
||||
}
|
||||
out = append(out, CalendarMonth{
|
||||
Offset: offset,
|
||||
Month: month,
|
||||
Label: label,
|
||||
YearOffset: yearOffset,
|
||||
Days: days,
|
||||
})
|
||||
}
|
||||
return out
|
||||
}
|
||||
Reference in New Issue
Block a user