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]
|
||||
|
||||
// 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
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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{
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -27,9 +27,11 @@ var webCmd = &cobra.Command{
|
||||
}
|
||||
|
||||
type Query struct {
|
||||
Name string `form:"name"`
|
||||
Set string `form:"set"`
|
||||
Sort string `form:"sort"`
|
||||
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,
|
||||
"version": Version,
|
||||
"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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -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">…</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 -->
|
||||
<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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user