aboutsummaryrefslogtreecommitdiff
path: root/pkg/tpl/list.templ
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/tpl/list.templ')
-rw-r--r--pkg/tpl/list.templ76
1 files changed, 76 insertions, 0 deletions
diff --git a/pkg/tpl/list.templ b/pkg/tpl/list.templ
new file mode 100644
index 0000000..014a2db
--- /dev/null
+++ b/pkg/tpl/list.templ
@@ -0,0 +1,76 @@
+package tpl
+
+import (
+ "fmt"
+ "sh.org.ru/pkg/config"
+ "sh.org.ru/pkg/model"
+ "strconv"
+ "sh.org.ru/pkg/middleware"
+)
+
+templ List(quotes []model.Quote, page, count int) {
+ {{ host := ctx.Value(middleware.ContextKey("config")).(*config.Config).Host }}
+ @Layout(HeaderParams{
+ Title: "Цитатник Рунета",
+ Description: "Новый цитатник Рунета",
+ URL: host,
+ }) {
+ for _, q := range quotes {
+ @Quote(&q)
+ }
+ <span aria-busy="true" class="loader htmx-indicator">Загрузка...</span>
+ <nav>
+ <ul hx-boost="true" hx-indicator=".loader">
+ if page > 0 {
+ <li><a href={ templ.URL(fmt.Sprintf("/?page=%d", page-1)) }>&larr;</a></li>
+ }
+ for _, p := range generatePagination(page, count/20) {
+ if p == "..." {
+ <li>...</li>
+ } else if p == strconv.Itoa(page) {
+ <li>[{ p }]</li>
+ } else {
+ <li><a href={ templ.URL(fmt.Sprintf("/?page=%s", p)) }>{ p }</a></li>
+ }
+ }
+
+ if page < count/20 {
+ <li><a href={ templ.URL(fmt.Sprintf("/?page=%d", page+1)) }>&rarr;</a></li>
+ }
+ </ul>
+ </nav>
+ Всего { strconv.Itoa(count) } цитат.
+ }
+}
+
+func generatePagination(currentPage, totalPages int) []string {
+ pagination := make([]string, 0, 11)
+
+ if currentPage <= 3 {
+ for i := 0; i <= currentPage+3; i++ {
+ pagination = append(pagination, strconv.Itoa(i))
+ }
+ pagination = append(pagination, "...")
+ pagination = append(pagination, strconv.Itoa(totalPages-2))
+ pagination = append(pagination, strconv.Itoa(totalPages-1))
+ pagination = append(pagination, strconv.Itoa(totalPages))
+ } else if currentPage >= totalPages-3 {
+ pagination = append(pagination, "0")
+ pagination = append(pagination, "1")
+ pagination = append(pagination, "2")
+ pagination = append(pagination, "...")
+ for i := currentPage - 3; i <= totalPages; i++ {
+ pagination = append(pagination, strconv.Itoa(i))
+ }
+ } else {
+ pagination = append(pagination, "0")
+ pagination = append(pagination, "...")
+ for i := currentPage - 2; i <= currentPage+2; i++ {
+ pagination = append(pagination, strconv.Itoa(i))
+ }
+ pagination = append(pagination, "...")
+ pagination = append(pagination, strconv.Itoa(totalPages))
+ }
+
+ return pagination
+}