mirror of
https://github.com/Theodor-Springmann-Stiftung/lenz-web.git
synced 2026-03-21 05:45:32 +00:00
more stuff
This commit is contained in:
107
server/letters.go
Normal file
107
server/letters.go
Normal file
@@ -0,0 +1,107 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user