Add Pagination

This commit is contained in:
Florian Baumann 2023-06-14 16:04:09 +02:00
parent 0140463e09
commit 8ccaafc140
10 changed files with 93 additions and 27 deletions

View File

@ -93,7 +93,7 @@ func addCards(cards []string, unique bool, count int64) error {
setName := strings.Split(card, "/")[0]
// Check if card is already in collection
co, err := coll.storageFind(bson.D{{"set", setName}, {"collectornumber", collectorNumber}}, bson.D{})
co, err := coll.storageFind(bson.D{{"set", setName}, {"collectornumber", collectorNumber}}, bson.D{}, 0, 0)
if err != nil {
LogMessage(fmt.Sprintf("%v", err), "red")
continue

View File

@ -33,7 +33,7 @@ otherwise you'll get a list of cards as a search result.`,
SilenceErrors: true,
RunE: func(cmd *cobra.Command, cards []string) error {
if len(cards) == 0 {
cardList := Cards(rarity, set, sortby, name, oracle, cardType, reserved, foil)
cardList := Cards(rarity, set, sortby, name, oracle, cardType, reserved, foil, 0, 0)
showCardList(cardList, detail)
} else {
ShowCard(cards)
@ -53,7 +53,7 @@ func ShowCard(cardids []string) {
continue
}
cards, _ := coll.storageFind(bson.D{{"set", strings.Split(v, "/")[0]}, {"collectornumber", strings.Split(v, "/")[1]}}, bson.D{{"name", 1}})
cards, _ := coll.storageFind(bson.D{{"set", strings.Split(v, "/")[0]}, {"collectornumber", strings.Split(v, "/")[1]}}, bson.D{{"name", 1}}, 0, 0)
for _, card := range cards {
showCardDetails(&card)
@ -61,7 +61,7 @@ func ShowCard(cardids []string) {
}
}
func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bool) []Card {
func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bool, skip, limit int64) []Card {
client := storageConnect()
coll := &Collection{client.Database("serra").Collection("cards")}
defer storageDisconnect(client)
@ -123,7 +123,7 @@ func Cards(rarity, set, sortby, name, oracle, cardType string, reserved, foil bo
filter = append(filter, bson.E{"serra_count", bson.D{{"$gte", count}}})
}
cards, _ := coll.storageFind(filter, sortStage)
cards, _ := coll.storageFind(filter, sortStage, skip, limit)
// This is needed because collectornumbers are strings (ie. "23a") but still we
// want it to be sorted numerically ... 1,2,3,10,11,100.

View File

@ -21,7 +21,7 @@ func modifyCardCount(coll *Collection, c *Card, amount int64, foil bool) error {
// find already existing card
sort := bson.D{{"_id", 1}}
searchFilter := bson.D{{"_id", c.ID}}
storedCards, err := coll.storageFind(searchFilter, sort)
storedCards, err := coll.storageFind(searchFilter, sort, 0, 0)
if err != nil {
return err
}
@ -54,7 +54,7 @@ func modifyCardCount(coll *Collection, c *Card, amount int64, foil bool) error {
func findCardByCollectorNumber(coll *Collection, setCode string, collectorNumber string) (*Card, error) {
sort := bson.D{{"_id", 1}}
searchFilter := bson.D{{"set", setCode}, {"collectornumber", collectorNumber}}
storedCards, err := coll.storageFind(searchFilter, sort)
storedCards, err := coll.storageFind(searchFilter, sort, 0, 0)
if err != nil {
return &Card{}, err
}

View File

@ -26,7 +26,7 @@ cards you dont own (yet) :)`,
defer storageDisconnect(client)
// fetch all cards in set
cards, err := coll.storageFind(bson.D{{"set", setName[0]}}, bson.D{{"collectornumber", 1}})
cards, err := coll.storageFind(bson.D{{"set", setName[0]}}, bson.D{{"collectornumber", 1}}, 0, 0)
if (err != nil) || len(cards) == 0 {
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setName[0]), "red")
return err

View File

@ -95,7 +95,7 @@ func ShowSet(setname string) error {
if getCurrency() == "EUR" {
cardSortCurrency = bson.D{{"prices.eur", -1}}
}
cards, err := coll.storageFind(bson.D{{"set", setname}}, cardSortCurrency)
cards, err := coll.storageFind(bson.D{{"set", setname}}, cardSortCurrency, 0, 0)
if (err != nil) || len(cards) == 0 {
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setname), "red")
return err

View File

@ -25,7 +25,7 @@ var statsCmd = &cobra.Command{
totalcoll := &Collection{client.Database("serra").Collection("total")}
defer storageDisconnect(client)
// Generate list of Sets
// Colors
sets, _ := coll.storageAggregate(mongo.Pipeline{
bson.D{
{"$match", bson.D{

View File

@ -101,8 +101,8 @@ func (coll Collection) storageAddTotal(p PriceEntry) error {
return nil
}
func (coll Collection) storageFind(filter, sort bson.D) ([]Card, error) {
opts := options.Find().SetSort(sort)
func (coll Collection) storageFind(filter, sort bson.D, skip, limit int64) ([]Card, error) {
opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit)
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
LogMessage(fmt.Sprintf("Could not query data due to connection errors to database: %s", err.Error()), "red")

View File

@ -55,7 +55,7 @@ var updateCmd = &cobra.Command{
set.SerraPrices = []PriceEntry{}
setscoll.storageAddSet(&set)
cards, _ := coll.storageFind(bson.D{{"set", set.Code}}, bson.D{{"_id", 1}})
cards, _ := coll.storageFind(bson.D{{"set", set.Code}}, bson.D{{"_id", 1}}, 0, 0)
// if no cards in collection for this set, skip it
if len(cards) == 0 {

View File

@ -30,6 +30,8 @@ type Query struct {
Name string `form:"name"`
Set string `form:"set"`
Sort string `form:"sort"`
Limit int64 `form:"limit"`
Page int64 `form:"page"`
}
func startWeb() error {
@ -47,13 +49,25 @@ func startWeb() error {
func landingPage(c *gin.Context) {
var query Query
if c.ShouldBind(&query) == nil {
cards := Cards("", query.Set, query.Sort, query.Name, "", "", false, false)
if query.Limit == 0 {
query.Limit = 500
}
cards := Cards("", query.Set, query.Sort, query.Name, "", "", false, false, query.Page, query.Limit)
numCards := len(Cards("", query.Set, query.Sort, query.Name, "", "", false, false, 0, 0))
sets := Sets("release")
c.HTML(http.StatusOK, "index.tmpl", gin.H{
"title": "Serra",
"cards": cards,
"sets": sets,
"query": query,
"version": Version,
"prevPage": query.Page - 1,
"page": query.Page,
"nextPage": query.Page + 1,
"limit": query.Limit,
"numCards": numCards,
"numPages": int64(numCards) / query.Limit,
})
}
}

View File

@ -5,8 +5,9 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Serra</title>
<!-- <link rel="stylesheet" href="https://unpkg.com/bulma-dracula"> -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
<link rel="stylesheet" href="https://jenil.github.io/bulmaswatch/cosmo/bulmaswatch.min.css">
<!-- <link rel="stylesheet" href="https://jenil.github.io/bulmaswatch/lumen/bulmaswatch.min.css"> -->
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css"> -->
<style>
.cardpreview {
@ -63,7 +64,7 @@
<body>
<!-- Site Title -->
<section class="hero is-primary">
<section class="hero is-black">
<div class="hero-body">
<p class="title">
{{ .title }}
@ -84,7 +85,7 @@
<div class="field">
<label class="label">Set</label>
<div class="control">
<div class="select is-primary">
<div class="select">
<select name="set" id="set" form="searchform">
<option value="">-</option>
{{range .sets}}
@ -110,7 +111,7 @@
<div class="field">
<label class="label">Sort</label>
<div class="control">
<div class="select is-primary">
<div class="select">
<select name="sort" id="sort" form="searchform">
<option value="name" selected>Name</option>
<option value="value">Value</option>
@ -184,9 +185,54 @@
{{end}}
</tbody>
</table>
</section>
{{ if ne .numPages 0 }}
<div class="hero-body">
<nav class="pagination" role="navigation" aria-label="pagination">
<a href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page={{.prevPage}}" class="pagination-previous">Previous</a>
<a href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page={{.nextPage}}" class="pagination-next">Next page</a>
<ul class="pagination-list">
{{ if ne .page 0 }}
<li>
<a class="pagination-link" href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page=0" aria-label="Goto page 0">0</a>
</li>
<li>
<span class="pagination-ellipsis">&hellip;</span>
</li>
{{end}}
{{ if ( gt .prevPage 0 ) }}
<li>
<a href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page={{.prevPage}}" class="pagination-link" aria-label="Goto page {{.prevPage}}">{{.prevPage}}</a>
</li>
{{end}}
<li>
<a class="pagination-link is-current" href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page={{.page}}" aria-label="Page {{ .page }}" aria-current="page">{{.page}}</a>
</li>
{{ if and (ne .nextPage .numPages) ( lt .nextPage .numPages) }}
<li>
<a href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page={{.nextPage}}" class="pagination-link" aria-label="Goto page {{.nextPage}} ">{{.nextPage}}</a>
</li>
{{ end }}
{{ if ne .numPages .page }}
<li>
<span class="pagination-ellipsis">&hellip;</span>
</li>
<li>
<a class="pagination-link" href="/?set={{.query.Set}}&name={{.query.Name}}&sort={{.query.Sort}}&limit={{.query.Limit}}&page={{.numPages}}" aria-label="Goto page {{.numPages}}">{{.numPages}}</a>
</li>
{{end}}
</ul>
</nav>
</div>
{{ end }}
<!-- Select set from last search -->
<script>
function getParam(paramName) {
@ -197,6 +243,12 @@
var selectedSetVal = getParam("set");
document.getElementById("set").value = selectedSetVal;
var selectedSetVal = getParam("page");
document.getElementById("page").value = selectedSetVal;
var selectedSetVal = getParam("limit");
document.getElementById("limit").value = selectedSetVal;
var selectedSortVal = getParam("sort");
document.getElementById("sort").value = selectedSortVal;
</script>