Files
lenz-web/server/letters.go
Simon Martens d7f7571470 more stuff
2026-03-04 16:39:47 +01:00

108 lines
2.5 KiB
Go

package server
import (
"bytes"
"net/http"
"strings"
"github.com/Theodor-Springmann-Stiftung/lenz-web/xmlmodels"
"github.com/labstack/echo/v5"
)
type dateRange struct {
Label string
Start int
End int
Letters []letterHeadModel
}
type lettersPageModel struct {
Ranges []dateRange
SelectedRange string
ShowAll bool
ActiveRanges []dateRange
}
func (s *Server) Home(c *echo.Context) error {
rangeParam := c.Request().URL.Query().Get("range")
if rangeParam == "" {
rangeParam = "all"
}
model := buildLettersPageModel(s.app.Library(), rangeParam)
var out bytes.Buffer
if err := s.tmpl.ExecuteTemplate(&out, "home", model); err != nil {
return c.String(http.StatusInternalServerError, "template render failed: "+err.Error())
}
return c.HTML(http.StatusOK, out.String())
}
func buildLettersPageModel(lib *xmlmodels.Library, rangeParam string) lettersPageModel {
ranges := []dateRange{
{Label: "1756-1770", Start: 1756, End: 1770, Letters: []letterHeadModel{}},
{Label: "1771-1775", Start: 1771, End: 1775, Letters: []letterHeadModel{}},
{Label: "1776", Start: 1776, End: 1776, Letters: []letterHeadModel{}},
{Label: "1777-1779", Start: 1777, End: 1779, Letters: []letterHeadModel{}},
{Label: "1780-1792", Start: 1780, End: 1792, Letters: []letterHeadModel{}},
}
years, yearMap := lib.Years()
for _, year := range years {
letters, ok := yearMap[year]
if !ok {
continue
}
target := -1
for i := range ranges {
if year >= ranges[i].Start && year <= ranges[i].End {
target = i
break
}
}
if target == -1 {
continue
}
for _, meta := range letters {
metaCopy := meta
ranges[target].Letters = append(ranges[target].Letters, buildLetterHead(lib, &metaCopy))
}
}
selected := strings.TrimSpace(rangeParam)
if selected == "" {
selected = "all"
}
model := lettersPageModel{
Ranges: ranges,
SelectedRange: selected,
ShowAll: selected == "all",
ActiveRanges: make([]dateRange, 0, len(ranges)),
}
if model.ShowAll {
for _, r := range ranges {
if len(r.Letters) > 0 {
model.ActiveRanges = append(model.ActiveRanges, r)
}
}
return model
}
for _, r := range ranges {
if r.Label == selected && len(r.Letters) > 0 {
model.ActiveRanges = append(model.ActiveRanges, r)
return model
}
}
model.ShowAll = true
model.SelectedRange = "all"
for _, r := range ranges {
if len(r.Letters) > 0 {
model.ActiveRanges = append(model.ActiveRanges, r)
}
}
return model
}