diff options
Diffstat (limited to 'pkg/tpl/list.templ')
-rw-r--r-- | pkg/tpl/list.templ | 76 |
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)) }>←</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)) }>→</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 +} |