[add] pagination
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

This commit is contained in:
Evan Reichard 2023-11-17 23:10:59 -05:00
parent af41946a65
commit 1403bae036
5 changed files with 62 additions and 3 deletions

View File

@ -5,6 +5,7 @@ import (
"database/sql" "database/sql"
"fmt" "fmt"
"io" "io"
"math"
"mime/multipart" "mime/multipart"
"net/http" "net/http"
"os" "os"
@ -130,10 +131,30 @@ func (api *API) createAppResourcesRoute(routeName string, args ...map[string]any
return return
} }
length, err := api.DB.Queries.GetDocumentsSize(api.DB.Ctx, query)
if err != nil {
log.Error("[createAppResourcesRoute] GetDocumentsSize DB Error:", err)
errorPage(c, http.StatusInternalServerError, fmt.Sprintf("GetDocumentsSize DB Error: %v", err))
return
}
if err = api.getDocumentsWordCount(documents); err != nil { if err = api.getDocumentsWordCount(documents); err != nil {
log.Error("[createAppResourcesRoute] Unable to Get Word Counts: ", err) log.Error("[createAppResourcesRoute] Unable to Get Word Counts: ", err)
} }
totalPages := int64(math.Ceil(float64(length) / float64(*qParams.Limit)))
nextPage := *qParams.Page + 1
previousPage := *qParams.Page - 1
if nextPage <= totalPages {
templateVars["NextPage"] = nextPage
}
if previousPage >= 0 {
templateVars["PreviousPage"] = previousPage
}
templateVars["PageLimit"] = *qParams.Limit
templateVars["Data"] = documents templateVars["Data"] = documents
} else if routeName == "document" { } else if routeName == "document" {
var rDocID requestDocumentID var rDocID requestDocumentID
@ -983,7 +1004,7 @@ func bindQueryParams(c *gin.Context) queryParams {
c.BindQuery(&qParams) c.BindQuery(&qParams)
if qParams.Limit == nil { if qParams.Limit == nil {
var defaultValue int64 = 50 var defaultValue int64 = 9
qParams.Limit = &defaultValue qParams.Limit = &defaultValue
} else if *qParams.Limit < 0 { } else if *qParams.Limit < 0 {
var zeroValue int64 = 0 var zeroValue int64 = 0
@ -991,7 +1012,7 @@ func bindQueryParams(c *gin.Context) queryParams {
} }
if qParams.Page == nil || *qParams.Page < 1 { if qParams.Page == nil || *qParams.Page < 1 {
var oneValue int64 = 0 var oneValue int64 = 1
qParams.Page = &oneValue qParams.Page = &oneValue
} }

File diff suppressed because one or more lines are too long

View File

@ -182,6 +182,16 @@ ORDER BY created_at DESC
LIMIT $limit LIMIT $limit
OFFSET $offset; OFFSET $offset;
-- name: GetDocumentsSize :one
SELECT
COUNT(rowid) AS length
FROM documents AS docs
WHERE $query IS NULL OR (
docs.title LIKE $query OR
docs.author LIKE $query
)
LIMIT 1;
-- name: GetDocumentsWithStats :many -- name: GetDocumentsWithStats :many
SELECT SELECT
docs.id, docs.id,

View File

@ -596,6 +596,24 @@ func (q *Queries) GetDocuments(ctx context.Context, arg GetDocumentsParams) ([]D
return items, nil return items, nil
} }
const getDocumentsSize = `-- name: GetDocumentsSize :one
SELECT
COUNT(rowid) AS length
FROM documents AS docs
WHERE ?1 IS NULL OR (
docs.title LIKE ?1 OR
docs.author LIKE ?1
)
LIMIT 1
`
func (q *Queries) GetDocumentsSize(ctx context.Context, query interface{}) (int64, error) {
row := q.db.QueryRowContext(ctx, getDocumentsSize, query)
var length int64
err := row.Scan(&length)
return length, err
}
const getDocumentsWithStats = `-- name: GetDocumentsWithStats :many const getDocumentsWithStats = `-- name: GetDocumentsWithStats :many
SELECT SELECT
docs.id, docs.id,

View File

@ -147,6 +147,16 @@
{{end}} {{end}}
</div> </div>
<div class="w-full flex gap-4 justify-center mt-4 text-black dark:text-white">
{{ if .PreviousPage }}
<a href="./documents?page={{ .PreviousPage }}&limit={{ .PageLimit }}" class="bg-white shadow-lg dark:bg-gray-600 hover:bg-gray-400 font-medium rounded text-sm text-center p-2 w-24 dark:hover:bg-gray-700 focus:outline-none"></a>
{{ end }}
{{ if .NextPage }}
<a href="./documents?page={{ .NextPage }}&limit={{ .PageLimit }}" class="bg-white shadow-lg dark:bg-gray-600 hover:bg-gray-400 font-medium rounded text-sm text-center p-2 w-24 dark:hover:bg-gray-700 focus:outline-none"></a>
{{ end }}
</div>
<div class="fixed bottom-6 right-6 rounded-full flex items-center justify-center"> <div class="fixed bottom-6 right-6 rounded-full flex items-center justify-center">
<input type="checkbox" id="upload-file-button" class="hidden css-button"/> <input type="checkbox" id="upload-file-button" class="hidden css-button"/>
<div class="rounded p-4 bg-gray-800 dark:bg-gray-200 text-white dark:text-black w-72 text-sm flex flex-col gap-2"> <div class="rounded p-4 bg-gray-800 dark:bg-gray-200 text-white dark:text-black w-72 text-sm flex flex-col gap-2">