feat(cards): Generate placeholders for cards without a pair

This commit is contained in:
Nicolai Ort 2024-12-03 19:20:28 +01:00
parent b179541532
commit f880e9f10c
Signed by: niggl
GPG Key ID: 13AFA55AF62F269F
4 changed files with 51 additions and 11 deletions

View File

@ -47,8 +47,7 @@ func GenerateCard(c *fiber.Ctx) error {
} }
genConfig := &models.CardTemplateOptions{ genConfig := &models.CardTemplateOptions{
Cards: cardRequest.Cards, CardSegments: splitCardSegments(cardRequest.Cards),
CardsSwapped: invertCardArrayItems(cardRequest.Cards),
EventName: "Event name", EventName: "Event name",
CardSubtitle: "Card subtitle", CardSubtitle: "Card subtitle",
BarcodeFormat: "ean13", BarcodeFormat: "ean13",
@ -74,10 +73,38 @@ func GenerateCard(c *fiber.Ctx) error {
return c.Send(pdf) return c.Send(pdf)
} }
func invertCardArrayItems(cards []models.Card) []models.Card { func invertCardArrayItemPairs(cards []models.Card) []models.Card {
inverted := make([]models.Card, 0) inverted := make([]models.Card, 0)
for i := len(cards) - 1; i >= 0; i-- { for i := 0; i < len(cards); i += 2 {
if i+1 < len(cards) {
inverted = append(inverted, cards[i+1])
}
inverted = append(inverted, cards[i]) inverted = append(inverted, cards[i])
} }
return inverted return inverted
} }
func splitCardSegments(cards []models.Card) []models.CardTemplateSegment {
cardSegments := make([]models.CardTemplateSegment, 0)
const currentCards = 0
for i := 0; i < len(cards); i += 10 {
segmentLength := 10
if len(cards)-i < 10 {
segmentLength = len(cards) - i
}
segment := cards[i : i+segmentLength]
if segmentLength%2 != 0 {
segment = append(segment, models.Card{
ID: 0,
Enabled: false,
Runner: models.Runner{},
Code: "",
})
}
cardSegments = append(cardSegments, models.CardTemplateSegment{
Cards: segment,
CardsSwapped: invertCardArrayItemPairs(segment),
})
}
return cardSegments
}

View File

@ -13,10 +13,14 @@ type Card struct {
} }
type CardTemplateOptions struct { type CardTemplateOptions struct {
Cards []Card `json:"cards"` CardSegments []CardTemplateSegment `json:"card_segments"`
CardsSwapped []Card `json:"cards_swapped"` EventName string `json:"event_name"`
EventName string `json:"event_name"` CardSubtitle string `json:"card_subtitle"`
CardSubtitle string `json:"card_subtitle"` BarcodeFormat string `json:"barcode_format"`
BarcodeFormat string `json:"barcode_format"` BarcodePrefix string `json:"barcode_prefix"`
BarcodePrefix string `json:"barcode_prefix"` }
type CardTemplateSegment struct {
Cards []Card `json:"cards"`
CardsSwapped []Card `json:"cards_swapped"`
} }

View File

@ -28,10 +28,12 @@
</head> </head>
<body class="A4 landscape"> <body class="A4 landscape">
{{ range .CardSegments }}
<div class="sheet"> <div class="sheet">
<div class="columns is-multiline"> <div class="columns is-multiline">
{{ range .Cards }} {{ range .Cards }}
<div class="column is-half runnercard"> <div class="column is-half runnercard">
{{ if ne .Code "" }}
<p class="title is-5" style="text-align: center; padding-bottom: 0; margin-top: -0.75rem;">{{ $.EventName }}</p> <p class="title is-5" style="text-align: center; padding-bottom: 0; margin-top: -0.75rem;">{{ $.EventName }}</p>
<p style="text-align: center; margin-top: -1.5rem; font-size: small;">{{ $.CardSubtitle }}</p> <p style="text-align: center; margin-top: -1.5rem; font-size: small;">{{ $.CardSubtitle }}</p>
<p style="font-size: small;">Mit Unterstützung von:</p> <p style="font-size: small;">Mit Unterstützung von:</p>
@ -50,6 +52,7 @@
</div> </div>
<p>{{ .Runner.LastName }}, {{ .Runner.FirstName }} {{ .Runner.MiddleName }}</p> <p>{{ .Runner.LastName }}, {{ .Runner.FirstName }} {{ .Runner.MiddleName }}</p>
<p>{{ .Runner.Group.Name }}</p> <p>{{ .Runner.Group.Name }}</p>
{{ end}}
</div> </div>
{{ end }} {{ end }}
</div> </div>
@ -58,16 +61,20 @@
<div class="columns is-multiline"> <div class="columns is-multiline">
{{ range .CardsSwapped }} {{ range .CardsSwapped }}
<div class="column is-half runnercard" style="justify-content: center; align-items: center; text-align: center;"> <div class="column is-half runnercard" style="justify-content: center; align-items: center; text-align: center;">
{{ if ne .Code "" }}
<!--SPONSOR LOGO FIRST--> <!--SPONSOR LOGO FIRST-->
<div style="height: 2cm; padding: 0 0 1cm 0"> <div style="height: 2cm; padding: 0 0 1cm 0">
<img style="object-fit: cover; max-height: 2cm;" src="data:image/png;base64,{{ sponsorLogo .ID }}" /> <img style="object-fit: cover; max-height: 2cm;" src="data:image/png;base64,{{ sponsorLogo .ID }}" />
</div> </div>
<img style="object-fit: cover; max-height: 6rem; position: relative;" src="data:image/png;base64,{{ barcode .Code $.BarcodeFormat $.BarcodePrefix }}" /> <img style="object-fit: cover; max-height: 6rem; position: relative;"
src="data:image/png;base64,{{ barcode .Code $.BarcodeFormat $.BarcodePrefix }}" />
<p style="font-size: 1rem; text-align: center; margin: 0; padding: 0;">{{ .Code }}</p> <p style="font-size: 1rem; text-align: center; margin: 0; padding: 0;">{{ .Code }}</p>
{{ end }}
</div> </div>
{{ end }} {{ end }}
</div> </div>
</div> </div>
{{ end}}
</body> </body>
</html> </html>

View File

@ -28,6 +28,7 @@
</head> </head>
<body class="A4 landscape"> <body class="A4 landscape">
{{ range .CardSegments }}
<div class="sheet"> <div class="sheet">
<div class="columns is-multiline"> <div class="columns is-multiline">
{{ range .Cards }} {{ range .Cards }}
@ -68,6 +69,7 @@
{{ end }} {{ end }}
</div> </div>
</div> </div>
{{ end}}
</body> </body>
</html> </html>