LENZ BRIEFAUSGABE

This commit is contained in:
Simon Martens
2025-11-17 14:59:32 +01:00
parent 6901989292
commit 938cdeb27b
11 changed files with 842 additions and 413 deletions

View File

@@ -26,11 +26,19 @@ func GetLetter(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusNotFound)
}
html := ""
text := fiber.Map{
"count": "",
"notes": "",
"pages": []*xmlmodels.PageRender{},
"html": "",
}
if state := letterData.HTML.Data(); state != nil {
html = state.String()
text["html"] = state.String()
text["count"] = state.CountHTML()
text["notes"] = state.NotesHTML()
text["pages"] = state.Pages
}
tradition := lib.Traditions.Item(letter)
return c.Render("/brief/", fiber.Map{"meta": meta, "text": html, "tradition": tradition, "next": np.Next, "prev": np.Prev})
return c.Render("/brief/", fiber.Map{"meta": meta, "text": text, "tradition": tradition, "next": np.Next, "prev": np.Prev})
}

View File

@@ -1,14 +1,136 @@
package controllers
import (
"encoding/json"
"sort"
"strconv"
"strings"
"github.com/Theodor-Springmann-Stiftung/lenz-web/xmlmodels"
"github.com/gofiber/fiber/v2"
)
type filterItem struct {
ID int `json:"id"`
Name string `json:"name"`
}
func GetLetters(c *fiber.Ctx) error {
lib := xmlmodels.Get()
_, yearmap := lib.Years()
rangeParam := c.Query("range", "")
personParam := strings.TrimSpace(c.Query("person", ""))
placeParam := strings.TrimSpace(c.Query("ort", ""))
personID := 0
if personParam != "" {
if id, err := strconv.Atoi(personParam); err == nil && id > 0 {
personID = id
} else {
personParam = ""
}
}
placeID := 0
if placeParam != "" {
if id, err := strconv.Atoi(placeParam); err == nil && id > 0 {
placeID = id
} else {
placeParam = ""
}
}
rawQuery := string(c.Context().URI().QueryString())
lastPerson := strings.LastIndex(rawQuery, "person=")
lastPlace := strings.LastIndex(rawQuery, "ort=")
if lastPerson >= 0 && lastPlace >= 0 {
if lastPlace > lastPerson {
personID = 0
personParam = ""
} else {
placeID = 0
placeParam = ""
}
}
if personID > 0 && placeID > 0 {
// Fallback if we couldn't determine query order.
placeID = 0
placeParam = ""
}
personOptions := make(map[int]filterItem)
placeOptions := make(map[int]filterItem)
addPerson := func(id int) {
if id <= 0 {
return
}
if _, ok := personOptions[id]; ok {
return
}
if def := lib.Person(id); def != nil {
name := strings.TrimSpace(def.Name)
if name == "" {
name = strings.TrimSpace(def.FirstName + " " + def.LastName)
}
if name == "" {
name = strings.TrimSpace(def.Ref)
}
if name == "" {
name = "Person " + strconv.Itoa(id)
}
personOptions[id] = filterItem{ID: id, Name: name}
}
}
addPlace := func(id int) {
if id <= 0 {
return
}
if _, ok := placeOptions[id]; ok {
return
}
if def := lib.Place(id); def != nil {
name := strings.TrimSpace(def.Name)
if name == "" {
name = strings.TrimSpace(def.Ref)
}
if name == "" {
name = "Ort " + strconv.Itoa(id)
}
placeOptions[id] = filterItem{ID: id, Name: name}
}
}
collectRefs := func(meta xmlmodels.Meta) {
for _, action := range meta.Sent {
for _, ref := range action.Persons {
addPerson(ref.Reference)
}
for _, ref := range action.Places {
addPlace(ref.Reference)
}
}
for _, action := range meta.Recieved {
for _, ref := range action.Persons {
addPerson(ref.Reference)
}
for _, ref := range action.Places {
addPlace(ref.Reference)
}
}
}
filterLetter := func(meta xmlmodels.Meta) bool {
if personID > 0 && !meta.HasPerson(personID) {
return false
}
if placeID > 0 && !meta.HasPlace(placeID) {
return false
}
return true
}
// TODO: does not work ATM
c.Locals("path", c.Path())
@@ -25,12 +147,21 @@ func GetLetters(c *fiber.Ctx) error {
for year, letters := range yearmap {
for i := range ranges {
if year >= ranges[i].Start && year <= ranges[i].End {
ranges[i].Letters = append(ranges[i].Letters, letters...)
for _, letter := range letters {
collectRefs(letter)
if filterLetter(letter) {
ranges[i].Letters = append(ranges[i].Letters, letter)
}
}
break
}
}
}
if personID > 0 || placeID > 0 {
rangeParam = "all"
}
// Handle specific range selection
selectedRange := -1
for i, r := range ranges {
@@ -40,9 +171,41 @@ func GetLetters(c *fiber.Ctx) error {
}
}
querySuffix := ""
if personParam != "" {
querySuffix += "&person=" + personParam
}
if placeParam != "" {
querySuffix += "&ort=" + placeParam
}
personList := make([]filterItem, 0, len(personOptions))
for _, item := range personOptions {
personList = append(personList, item)
}
sort.Slice(personList, func(i, j int) bool {
return strings.ToLower(personList[i].Name) < strings.ToLower(personList[j].Name)
})
placeList := make([]filterItem, 0, len(placeOptions))
for _, item := range placeOptions {
placeList = append(placeList, item)
}
sort.Slice(placeList, func(i, j int) bool {
return strings.ToLower(placeList[i].Name) < strings.ToLower(placeList[j].Name)
})
personJSON, _ := json.Marshal(personList)
placeJSON, _ := json.Marshal(placeList)
return c.Render(LETTERS_URL+"/", fiber.Map{
"ranges": ranges,
"ranges": ranges,
"selectedRange": selectedRange,
"all": rangeParam == "all",
"all": rangeParam == "all",
"person": personParam,
"ort": placeParam,
"query": querySuffix,
"personJSON": string(personJSON),
"placeJSON": string(placeJSON),
})
}