mirror of
https://github.com/Theodor-Springmann-Stiftung/lenz-web.git
synced 2026-03-21 05:45:32 +00:00
108 lines
2.5 KiB
Go
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
|
|
}
|