Add Pagination
This commit is contained in:
parent
0140463e09
commit
8ccaafc140
@ -93,7 +93,7 @@ func addCards(cards []string, unique bool, count int64) error {
|
|||||||
setName := strings.Split(card, "/")[0]
|
setName := strings.Split(card, "/")[0]
|
||||||
|
|
||||||
// Check if card is already in collection
|
// 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 {
|
if err != nil {
|
||||||
LogMessage(fmt.Sprintf("%v", err), "red")
|
LogMessage(fmt.Sprintf("%v", err), "red")
|
||||||
continue
|
continue
|
||||||
|
|||||||
@ -33,7 +33,7 @@ otherwise you'll get a list of cards as a search result.`,
|
|||||||
SilenceErrors: true,
|
SilenceErrors: true,
|
||||||
RunE: func(cmd *cobra.Command, cards []string) error {
|
RunE: func(cmd *cobra.Command, cards []string) error {
|
||||||
if len(cards) == 0 {
|
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)
|
showCardList(cardList, detail)
|
||||||
} else {
|
} else {
|
||||||
ShowCard(cards)
|
ShowCard(cards)
|
||||||
@ -53,7 +53,7 @@ func ShowCard(cardids []string) {
|
|||||||
continue
|
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 {
|
for _, card := range cards {
|
||||||
showCardDetails(&card)
|
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()
|
client := storageConnect()
|
||||||
coll := &Collection{client.Database("serra").Collection("cards")}
|
coll := &Collection{client.Database("serra").Collection("cards")}
|
||||||
defer storageDisconnect(client)
|
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}}})
|
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
|
// This is needed because collectornumbers are strings (ie. "23a") but still we
|
||||||
// want it to be sorted numerically ... 1,2,3,10,11,100.
|
// want it to be sorted numerically ... 1,2,3,10,11,100.
|
||||||
|
|||||||
@ -21,7 +21,7 @@ func modifyCardCount(coll *Collection, c *Card, amount int64, foil bool) error {
|
|||||||
// find already existing card
|
// find already existing card
|
||||||
sort := bson.D{{"_id", 1}}
|
sort := bson.D{{"_id", 1}}
|
||||||
searchFilter := bson.D{{"_id", c.ID}}
|
searchFilter := bson.D{{"_id", c.ID}}
|
||||||
storedCards, err := coll.storageFind(searchFilter, sort)
|
storedCards, err := coll.storageFind(searchFilter, sort, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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) {
|
func findCardByCollectorNumber(coll *Collection, setCode string, collectorNumber string) (*Card, error) {
|
||||||
sort := bson.D{{"_id", 1}}
|
sort := bson.D{{"_id", 1}}
|
||||||
searchFilter := bson.D{{"set", setCode}, {"collectornumber", collectorNumber}}
|
searchFilter := bson.D{{"set", setCode}, {"collectornumber", collectorNumber}}
|
||||||
storedCards, err := coll.storageFind(searchFilter, sort)
|
storedCards, err := coll.storageFind(searchFilter, sort, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &Card{}, err
|
return &Card{}, err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ cards you dont own (yet) :)`,
|
|||||||
defer storageDisconnect(client)
|
defer storageDisconnect(client)
|
||||||
|
|
||||||
// fetch all cards in set
|
// 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 {
|
if (err != nil) || len(cards) == 0 {
|
||||||
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setName[0]), "red")
|
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setName[0]), "red")
|
||||||
return err
|
return err
|
||||||
|
|||||||
@ -95,7 +95,7 @@ func ShowSet(setname string) error {
|
|||||||
if getCurrency() == "EUR" {
|
if getCurrency() == "EUR" {
|
||||||
cardSortCurrency = bson.D{{"prices.eur", -1}}
|
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 {
|
if (err != nil) || len(cards) == 0 {
|
||||||
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setname), "red")
|
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setname), "red")
|
||||||
return err
|
return err
|
||||||
|
|||||||
@ -25,7 +25,7 @@ var statsCmd = &cobra.Command{
|
|||||||
totalcoll := &Collection{client.Database("serra").Collection("total")}
|
totalcoll := &Collection{client.Database("serra").Collection("total")}
|
||||||
defer storageDisconnect(client)
|
defer storageDisconnect(client)
|
||||||
|
|
||||||
// Generate list of Sets
|
// Colors
|
||||||
sets, _ := coll.storageAggregate(mongo.Pipeline{
|
sets, _ := coll.storageAggregate(mongo.Pipeline{
|
||||||
bson.D{
|
bson.D{
|
||||||
{"$match", bson.D{
|
{"$match", bson.D{
|
||||||
|
|||||||
@ -101,8 +101,8 @@ func (coll Collection) storageAddTotal(p PriceEntry) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (coll Collection) storageFind(filter, sort bson.D) ([]Card, error) {
|
func (coll Collection) storageFind(filter, sort bson.D, skip, limit int64) ([]Card, error) {
|
||||||
opts := options.Find().SetSort(sort)
|
opts := options.Find().SetSort(sort).SetSkip(skip).SetLimit(limit)
|
||||||
cursor, err := coll.Find(context.TODO(), filter, opts)
|
cursor, err := coll.Find(context.TODO(), filter, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LogMessage(fmt.Sprintf("Could not query data due to connection errors to database: %s", err.Error()), "red")
|
LogMessage(fmt.Sprintf("Could not query data due to connection errors to database: %s", err.Error()), "red")
|
||||||
|
|||||||
@ -55,7 +55,7 @@ var updateCmd = &cobra.Command{
|
|||||||
set.SerraPrices = []PriceEntry{}
|
set.SerraPrices = []PriceEntry{}
|
||||||
setscoll.storageAddSet(&set)
|
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 no cards in collection for this set, skip it
|
||||||
if len(cards) == 0 {
|
if len(cards) == 0 {
|
||||||
|
|||||||
@ -30,6 +30,8 @@ type Query struct {
|
|||||||
Name string `form:"name"`
|
Name string `form:"name"`
|
||||||
Set string `form:"set"`
|
Set string `form:"set"`
|
||||||
Sort string `form:"sort"`
|
Sort string `form:"sort"`
|
||||||
|
Limit int64 `form:"limit"`
|
||||||
|
Page int64 `form:"page"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func startWeb() error {
|
func startWeb() error {
|
||||||
@ -47,13 +49,25 @@ func startWeb() error {
|
|||||||
func landingPage(c *gin.Context) {
|
func landingPage(c *gin.Context) {
|
||||||
var query Query
|
var query Query
|
||||||
if c.ShouldBind(&query) == nil {
|
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")
|
sets := Sets("release")
|
||||||
|
|
||||||
c.HTML(http.StatusOK, "index.tmpl", gin.H{
|
c.HTML(http.StatusOK, "index.tmpl", gin.H{
|
||||||
"title": "Serra",
|
"title": "Serra",
|
||||||
"cards": cards,
|
"cards": cards,
|
||||||
"sets": sets,
|
"sets": sets,
|
||||||
|
"query": query,
|
||||||
"version": Version,
|
"version": Version,
|
||||||
|
"prevPage": query.Page - 1,
|
||||||
|
"page": query.Page,
|
||||||
|
"nextPage": query.Page + 1,
|
||||||
|
"limit": query.Limit,
|
||||||
|
"numCards": numCards,
|
||||||
|
"numPages": int64(numCards) / query.Limit,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,9 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>Serra</title>
|
<title>Serra</title>
|
||||||
<!-- <link rel="stylesheet" href="https://unpkg.com/bulma-dracula"> -->
|
<link rel="stylesheet" href="https://jenil.github.io/bulmaswatch/cosmo/bulmaswatch.min.css">
|
||||||
<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/lumen/bulmaswatch.min.css"> -->
|
||||||
|
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css"> -->
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.cardpreview {
|
.cardpreview {
|
||||||
@ -63,7 +64,7 @@
|
|||||||
<body>
|
<body>
|
||||||
|
|
||||||
<!-- Site Title -->
|
<!-- Site Title -->
|
||||||
<section class="hero is-primary">
|
<section class="hero is-black">
|
||||||
<div class="hero-body">
|
<div class="hero-body">
|
||||||
<p class="title">
|
<p class="title">
|
||||||
{{ .title }}
|
{{ .title }}
|
||||||
@ -84,7 +85,7 @@
|
|||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label">Set</label>
|
<label class="label">Set</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<div class="select is-primary">
|
<div class="select">
|
||||||
<select name="set" id="set" form="searchform">
|
<select name="set" id="set" form="searchform">
|
||||||
<option value="">-</option>
|
<option value="">-</option>
|
||||||
{{range .sets}}
|
{{range .sets}}
|
||||||
@ -110,7 +111,7 @@
|
|||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label">Sort</label>
|
<label class="label">Sort</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<div class="select is-primary">
|
<div class="select">
|
||||||
<select name="sort" id="sort" form="searchform">
|
<select name="sort" id="sort" form="searchform">
|
||||||
<option value="name" selected>Name</option>
|
<option value="name" selected>Name</option>
|
||||||
<option value="value">Value</option>
|
<option value="value">Value</option>
|
||||||
@ -184,9 +185,54 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
</section>
|
</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">…</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">…</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 -->
|
<!-- Select set from last search -->
|
||||||
<script>
|
<script>
|
||||||
function getParam(paramName) {
|
function getParam(paramName) {
|
||||||
@ -197,6 +243,12 @@
|
|||||||
var selectedSetVal = getParam("set");
|
var selectedSetVal = getParam("set");
|
||||||
document.getElementById("set").value = selectedSetVal;
|
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");
|
var selectedSortVal = getParam("sort");
|
||||||
document.getElementById("sort").value = selectedSortVal;
|
document.getElementById("sort").value = selectedSortVal;
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user