mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-29 17:15:31 +00:00
view changes
This commit is contained in:
@@ -1,23 +1,32 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/app"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/app"
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
MINYEAR = 1764
|
||||||
|
MAXYEAR = 1779
|
||||||
|
)
|
||||||
|
|
||||||
func GetIssue(kgpz *app.KGPZ) fiber.Handler {
|
func GetIssue(kgpz *app.KGPZ) fiber.Handler {
|
||||||
return func(c *fiber.Ctx) error {
|
return func(c *fiber.Ctx) error {
|
||||||
y := c.Params("year")
|
y := c.Params("year")
|
||||||
if len(y) != 4 {
|
yi, err := strconv.Atoi(y)
|
||||||
logging.Error(nil, "Year is not 4 characters long")
|
if err != nil || yi < MINYEAR || yi > MAXYEAR {
|
||||||
|
logging.Error(err, "Year is not a valid number")
|
||||||
return c.SendStatus(fiber.StatusNotFound)
|
return c.SendStatus(fiber.StatusNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
d := c.Params("issue")
|
d := c.Params("issue")
|
||||||
if d == "" {
|
di, err := strconv.Atoi(d)
|
||||||
logging.Error(nil, "Issue number is empty")
|
if err != nil || di < 1 {
|
||||||
|
logging.Error(err, "Issue is not a valid number")
|
||||||
return c.SendStatus(fiber.StatusNotFound)
|
return c.SendStatus(fiber.StatusNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,6 +37,6 @@ func GetIssue(kgpz *app.KGPZ) fiber.Handler {
|
|||||||
return c.SendStatus(fiber.StatusNotFound)
|
return c.SendStatus(fiber.StatusNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Render("/issue/", fiber.Map{"model": issue})
|
return c.Render("/issue/", fiber.Map{"model": issue, "year": yi, "issue": di})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/app"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/app"
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels"
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
START_YEAR = "1764"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetYear(kgpz *app.KGPZ) fiber.Handler {
|
func GetYear(kgpz *app.KGPZ) fiber.Handler {
|
||||||
return func(c *fiber.Ctx) error {
|
return func(c *fiber.Ctx) error {
|
||||||
y := c.Params("year", START_YEAR)
|
y := c.Params("year", strconv.Itoa(MINYEAR))
|
||||||
if len(y) != 4 {
|
yi, err := strconv.Atoi(y)
|
||||||
return c.SendStatus(fiber.StatusBadRequest)
|
if err != nil || yi < MINYEAR || yi > MAXYEAR {
|
||||||
|
logging.Error(err, "Year is not a valid number")
|
||||||
|
return c.SendStatus(fiber.StatusNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
issues, err := viewmodels.YearView(y, kgpz.Library)
|
issues, err := viewmodels.YearView(y, kgpz.Library)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package xmlprovider
|
|||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
@@ -38,11 +39,11 @@ func (p Piece) GetIDs() []string {
|
|||||||
uid := uuid.New()
|
uid := uuid.New()
|
||||||
|
|
||||||
for _, i := range p.IssueRefs {
|
for _, i := range p.IssueRefs {
|
||||||
ret = append(ret, i.Datum+"-"+i.Nr+"-"+uid.String())
|
ret = append(ret, i.Datum+"-"+strconv.Itoa(i.Nr)+"-"+uid.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, i := range p.AdditionalRef {
|
for _, i := range p.AdditionalRef {
|
||||||
ret = append(ret, i.Datum+"-"+i.Nr+"-"+uid.String())
|
ret = append(ret, i.Datum+"-"+strconv.Itoa(i.Nr)+"-b-"+uid.String())
|
||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,19 +11,19 @@ type AdditionalRef struct {
|
|||||||
XMLName xml.Name `xml:"beilage"`
|
XMLName xml.Name `xml:"beilage"`
|
||||||
Reference
|
Reference
|
||||||
Datum string `xml:"datum,attr"`
|
Datum string `xml:"datum,attr"`
|
||||||
Nr string `xml:"nr,attr"`
|
Nr int `xml:"nr,attr"`
|
||||||
AdditionalNo string `xml:"beilage,attr"`
|
AdditionalNo int `xml:"beilage,attr"`
|
||||||
Von string `xml:"von,attr"`
|
Von int `xml:"von,attr"`
|
||||||
Bis string `xml:"bis,attr"`
|
Bis int `xml:"bis,attr"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type IssueRef struct {
|
type IssueRef struct {
|
||||||
XMLName xml.Name `xml:"stueck"`
|
XMLName xml.Name `xml:"stueck"`
|
||||||
Reference
|
Reference
|
||||||
Datum string `xml:"datum,attr"`
|
Datum string `xml:"datum,attr"`
|
||||||
Nr string `xml:"nr,attr"`
|
Nr int `xml:"nr,attr"`
|
||||||
Von string `xml:"von,attr"`
|
Von int `xml:"von,attr"`
|
||||||
Bis string `xml:"bis,attr"`
|
Bis int `xml:"bis,attr"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PlaceRef struct {
|
type PlaceRef struct {
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package viewmodels
|
|
||||||
|
|
||||||
import "github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
|
||||||
|
|
||||||
type PieceViewModel struct {
|
|
||||||
xmlprovider.Piece
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPieceView(p xmlprovider.Piece) (PieceViewModel, error) {
|
|
||||||
return PieceViewModel{Piece: p}, nil
|
|
||||||
}
|
|
||||||
101
viewmodels/piecevm.go
Normal file
101
viewmodels/piecevm.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package viewmodels
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
||||||
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PieceViewModel struct {
|
||||||
|
xmlprovider.Piece
|
||||||
|
// TODO: this is a bit hacky, but it refences the page number of the piece in the issue
|
||||||
|
Von int
|
||||||
|
Bis int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPieceView(p xmlprovider.Piece) (PieceViewModel, error) {
|
||||||
|
return PieceViewModel{Piece: p}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type PieceListViewModel struct {
|
||||||
|
IssuePieces []PieceViewModel
|
||||||
|
AdditionalPieces []PieceViewModel
|
||||||
|
}
|
||||||
|
|
||||||
|
func PieceListViewModelForIssue(lib *xmlprovider.Library, y string, No string) (*PieceListViewModel, error) {
|
||||||
|
p := PieceListViewModel{}
|
||||||
|
err := p.piecesForIsssue(y, No, lib)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (plvm *PieceListViewModel) piecesForIsssue(y string, No string, lib *xmlprovider.Library) error {
|
||||||
|
lookfor := y + "-" + No + "-"
|
||||||
|
noi, err := strconv.Atoi(No)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
lib.Pieces.Items.Range(func(key, value interface{}) bool {
|
||||||
|
k := key.(string)
|
||||||
|
if strings.HasPrefix(k, lookfor) {
|
||||||
|
a := value.(xmlprovider.Piece)
|
||||||
|
p, err := NewPieceView(a)
|
||||||
|
if err != nil {
|
||||||
|
logging.ObjErr(&a, err)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(k, lookfor+"b-") {
|
||||||
|
for _, i := range p.AdditionalRef {
|
||||||
|
if i.Datum == y && i.Nr == noi {
|
||||||
|
p.Von = i.Von
|
||||||
|
p.Bis = i.Bis
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plvm.AdditionalPieces = append(plvm.AdditionalPieces, p)
|
||||||
|
} else {
|
||||||
|
for _, i := range p.IssueRefs {
|
||||||
|
if i.Datum == y && i.Nr == noi {
|
||||||
|
p.Von = i.Von
|
||||||
|
p.Bis = i.Bis
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plvm.IssuePieces = append(plvm.IssuePieces, p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (plvm *PieceListViewModel) Sort(y string, no int) {
|
||||||
|
SortPiecesByPage(&plvm.IssuePieces, y, no)
|
||||||
|
SortPiecesByPage(&plvm.AdditionalPieces, y, no)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SortPiecesByPage(pieces *[]PieceViewModel, y string, no int) {
|
||||||
|
slices.SortFunc(*pieces, func(i, j PieceViewModel) int {
|
||||||
|
if i.Von == j.Von {
|
||||||
|
if i.Bis >= 0 {
|
||||||
|
return 1
|
||||||
|
} else if j.Bis >= 0 {
|
||||||
|
return -1
|
||||||
|
} else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i.Von > j.Von {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package viewmodels
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging"
|
|
||||||
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SingleIssueViewModel struct {
|
|
||||||
IssueViewModel
|
|
||||||
No string
|
|
||||||
Year string
|
|
||||||
Additionals []PieceViewModel
|
|
||||||
Pieces []PieceViewModel
|
|
||||||
Next IssueViewModel
|
|
||||||
Prev IssueViewModel
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewSingleIssueView(y string, No string, lib *xmlprovider.Library) (*SingleIssueViewModel, error) {
|
|
||||||
ivm, err := IssueView(y, No, lib)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
sivm := SingleIssueViewModel{IssueViewModel: *ivm}
|
|
||||||
logging.Info(strconv.Itoa(len(lib.Pieces.Everything())) + "pieces in library")
|
|
||||||
|
|
||||||
lookfor := y + "-" + No
|
|
||||||
lib.Pieces.Items.Range(func(key, value interface{}) bool {
|
|
||||||
k := key.(string)
|
|
||||||
if strings.HasPrefix(k, lookfor) {
|
|
||||||
a := value.(xmlprovider.Piece)
|
|
||||||
p, err := NewPieceView(a)
|
|
||||||
if err != nil {
|
|
||||||
logging.ObjErr(&a, err)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
sivm.Pieces = append(sivm.Pieces, p)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
return &sivm, nil
|
|
||||||
}
|
|
||||||
38
viewmodels/singleissuevm.go
Normal file
38
viewmodels/singleissuevm.go
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package viewmodels
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SingleIssueViewModel struct {
|
||||||
|
IssueViewModel
|
||||||
|
No string
|
||||||
|
Year string
|
||||||
|
Pieces PieceListViewModel
|
||||||
|
Next IssueViewModel
|
||||||
|
Prev IssueViewModel
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSingleIssueView(y string, No string, lib *xmlprovider.Library) (*SingleIssueViewModel, error) {
|
||||||
|
ivm, err := IssueView(y, No, lib)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pl, err := PieceListViewModelForIssue(lib, y, No)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
sivm := SingleIssueViewModel{IssueViewModel: *ivm, No: No, Year: y, Pieces: *pl}
|
||||||
|
|
||||||
|
no, err := strconv.Atoi(No)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sivm.Pieces.Sort(y, no)
|
||||||
|
|
||||||
|
return &sivm, nil
|
||||||
|
}
|
||||||
@@ -1,18 +1,23 @@
|
|||||||
Issue found!
|
Issue found!
|
||||||
|
|
||||||
{{ $model := .model }}
|
{{ $model := .model }}
|
||||||
|
|
||||||
{{ range $piece := .model.Pieces }}
|
{{ $page := 0 }}
|
||||||
|
{{ range $piece := .model.Pieces.IssuePieces }}
|
||||||
<div>
|
<div>
|
||||||
Piece!
|
{{ if (ne $page $piece.Von) }}
|
||||||
|
{{ $page = $piece.Von }}
|
||||||
|
<div>S. {{ $page }}</div>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
Piece!
|
||||||
{{ if gt (len $piece.IssueRefs) 1 }}
|
{{ if gt (len $piece.IssueRefs) 1 }}
|
||||||
{{ len $piece.IssueRefs }} Teile
|
{{ len $piece.IssueRefs }} Teile
|
||||||
<ol>
|
<ol>
|
||||||
{{ range $issue := $piece.IssueRefs }}
|
{{ range $issue := $piece.IssueRefs }}
|
||||||
<li>
|
<li>
|
||||||
<a href="/{{- $issue.Datum -}}/{{- $issue.Nr -}}">
|
<a href="/{{- $issue.Datum -}}/{{- $issue.Nr -}}">
|
||||||
{{- $issue.Datum }} Nr. {{ $issue.Nr -}}
|
{{- $issue.Datum }} Nr.
|
||||||
|
{{ $issue.Nr -}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|||||||
Reference in New Issue
Block a user