From 7a6edbf668dd9a19c84df7bd677705991ab92676 Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Fri, 22 Nov 2024 23:47:36 +0100 Subject: [PATCH] view changes --- controllers/issue.go | 19 ++++-- controllers/year.go | 14 ++-- providers/xmlprovider/pieces.go | 5 +- providers/xmlprovider/xmlrefs.go | 14 ++-- viewmodels/{issue.go => issuevm.go} | 0 viewmodels/piece.go | 11 --- viewmodels/piecevm.go | 101 ++++++++++++++++++++++++++++ viewmodels/singleissue.go | 46 ------------- viewmodels/singleissuevm.go | 38 +++++++++++ viewmodels/{year.go => yearvm.go} | 0 views/routes/issue/body.tmpl | 25 ++++--- 11 files changed, 185 insertions(+), 88 deletions(-) rename viewmodels/{issue.go => issuevm.go} (100%) delete mode 100644 viewmodels/piece.go create mode 100644 viewmodels/piecevm.go delete mode 100644 viewmodels/singleissue.go create mode 100644 viewmodels/singleissuevm.go rename viewmodels/{year.go => yearvm.go} (100%) diff --git a/controllers/issue.go b/controllers/issue.go index 494ce69..012b6c3 100644 --- a/controllers/issue.go +++ b/controllers/issue.go @@ -1,23 +1,32 @@ package controllers import ( + "strconv" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/app" "github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging" "github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels" "github.com/gofiber/fiber/v2" ) +const ( + MINYEAR = 1764 + MAXYEAR = 1779 +) + func GetIssue(kgpz *app.KGPZ) fiber.Handler { return func(c *fiber.Ctx) error { y := c.Params("year") - if len(y) != 4 { - logging.Error(nil, "Year is not 4 characters long") + yi, err := strconv.Atoi(y) + if err != nil || yi < MINYEAR || yi > MAXYEAR { + logging.Error(err, "Year is not a valid number") return c.SendStatus(fiber.StatusNotFound) } d := c.Params("issue") - if d == "" { - logging.Error(nil, "Issue number is empty") + di, err := strconv.Atoi(d) + if err != nil || di < 1 { + logging.Error(err, "Issue is not a valid number") return c.SendStatus(fiber.StatusNotFound) } @@ -28,6 +37,6 @@ func GetIssue(kgpz *app.KGPZ) fiber.Handler { 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}) } } diff --git a/controllers/year.go b/controllers/year.go index 073a262..4d06ef7 100644 --- a/controllers/year.go +++ b/controllers/year.go @@ -1,21 +1,21 @@ package controllers import ( + "strconv" + "github.com/Theodor-Springmann-Stiftung/kgpz_web/app" "github.com/Theodor-Springmann-Stiftung/kgpz_web/helpers/logging" "github.com/Theodor-Springmann-Stiftung/kgpz_web/viewmodels" "github.com/gofiber/fiber/v2" ) -const ( - START_YEAR = "1764" -) - func GetYear(kgpz *app.KGPZ) fiber.Handler { return func(c *fiber.Ctx) error { - y := c.Params("year", START_YEAR) - if len(y) != 4 { - return c.SendStatus(fiber.StatusBadRequest) + y := c.Params("year", strconv.Itoa(MINYEAR)) + yi, err := strconv.Atoi(y) + 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) diff --git a/providers/xmlprovider/pieces.go b/providers/xmlprovider/pieces.go index 5cf089f..15b27e5 100644 --- a/providers/xmlprovider/pieces.go +++ b/providers/xmlprovider/pieces.go @@ -3,6 +3,7 @@ package xmlprovider import ( "encoding/xml" "fmt" + "strconv" "github.com/google/uuid" ) @@ -38,11 +39,11 @@ func (p Piece) GetIDs() []string { uid := uuid.New() 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 { - ret = append(ret, i.Datum+"-"+i.Nr+"-"+uid.String()) + ret = append(ret, i.Datum+"-"+strconv.Itoa(i.Nr)+"-b-"+uid.String()) } return ret } diff --git a/providers/xmlprovider/xmlrefs.go b/providers/xmlprovider/xmlrefs.go index ac4f3dc..fb1867e 100644 --- a/providers/xmlprovider/xmlrefs.go +++ b/providers/xmlprovider/xmlrefs.go @@ -11,19 +11,19 @@ type AdditionalRef struct { XMLName xml.Name `xml:"beilage"` Reference Datum string `xml:"datum,attr"` - Nr string `xml:"nr,attr"` - AdditionalNo string `xml:"beilage,attr"` - Von string `xml:"von,attr"` - Bis string `xml:"bis,attr"` + Nr int `xml:"nr,attr"` + AdditionalNo int `xml:"beilage,attr"` + Von int `xml:"von,attr"` + Bis int `xml:"bis,attr"` } type IssueRef struct { XMLName xml.Name `xml:"stueck"` Reference Datum string `xml:"datum,attr"` - Nr string `xml:"nr,attr"` - Von string `xml:"von,attr"` - Bis string `xml:"bis,attr"` + Nr int `xml:"nr,attr"` + Von int `xml:"von,attr"` + Bis int `xml:"bis,attr"` } type PlaceRef struct { diff --git a/viewmodels/issue.go b/viewmodels/issuevm.go similarity index 100% rename from viewmodels/issue.go rename to viewmodels/issuevm.go diff --git a/viewmodels/piece.go b/viewmodels/piece.go deleted file mode 100644 index 057d9dd..0000000 --- a/viewmodels/piece.go +++ /dev/null @@ -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 -} diff --git a/viewmodels/piecevm.go b/viewmodels/piecevm.go new file mode 100644 index 0000000..7efc8e6 --- /dev/null +++ b/viewmodels/piecevm.go @@ -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 + }) +} diff --git a/viewmodels/singleissue.go b/viewmodels/singleissue.go deleted file mode 100644 index 5fed4d5..0000000 --- a/viewmodels/singleissue.go +++ /dev/null @@ -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 -} diff --git a/viewmodels/singleissuevm.go b/viewmodels/singleissuevm.go new file mode 100644 index 0000000..84035c1 --- /dev/null +++ b/viewmodels/singleissuevm.go @@ -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 +} diff --git a/viewmodels/year.go b/viewmodels/yearvm.go similarity index 100% rename from viewmodels/year.go rename to viewmodels/yearvm.go diff --git a/views/routes/issue/body.tmpl b/views/routes/issue/body.tmpl index 9f97263..28479d9 100644 --- a/views/routes/issue/body.tmpl +++ b/views/routes/issue/body.tmpl @@ -1,21 +1,26 @@ Issue found! - {{ $model := .model }} -{{ range $piece := .model.Pieces }} +{{ $page := 0 }} +{{ range $piece := .model.Pieces.IssuePieces }}
- Piece! + {{ if (ne $page $piece.Von) }} + {{ $page = $piece.Von }} +
S. {{ $page }}
+ {{ end }} + Piece! {{ if gt (len $piece.IssueRefs) 1 }} {{ len $piece.IssueRefs }} Teile
    - {{ range $issue := $piece.IssueRefs }} -
  1. - - {{- $issue.Datum }} Nr. {{ $issue.Nr -}} - -
  2. - {{ end }} + {{ range $issue := $piece.IssueRefs }} +
  3. + + {{- $issue.Datum }} Nr. + {{ $issue.Nr -}} + +
  4. + {{ end }}
{{ end }}