feat: replace ranking pages input with Top 100/300/500/All buttons
This commit is contained in:
@@ -268,7 +268,7 @@ const rankingTmpl = `
|
||||
<p class="text-zinc-400 mt-1">Top novels from novelfire.net</p>
|
||||
{{if .CachedAt}}<p class="text-xs text-zinc-500 mt-1">Cached {{.CachedAt}}</p>{{end}}
|
||||
</div>
|
||||
<div class="flex gap-2 mt-1">
|
||||
<div class="flex gap-2 mt-1 flex-wrap items-center">
|
||||
<a href="/ranking/view"
|
||||
hx-get="/ranking/view"
|
||||
hx-target="#main-content"
|
||||
@@ -277,21 +277,18 @@ const rankingTmpl = `
|
||||
class="text-sm px-3 py-1.5 rounded-lg bg-zinc-700 hover:bg-zinc-600 text-white inline-flex items-center gap-1">
|
||||
View Markdown
|
||||
</a>
|
||||
<form
|
||||
hx-post="/ranking/refresh"
|
||||
hx-target="#ranking-refresh-status"
|
||||
hx-swap="innerHTML"
|
||||
class="flex items-center gap-2">
|
||||
<label class="flex items-center gap-1.5">
|
||||
<span class="text-xs text-zinc-400 whitespace-nowrap">Pages</span>
|
||||
<input type="number" name="pages" value="1" min="1"
|
||||
class="w-16 rounded-lg bg-zinc-800 border border-zinc-700 px-2 py-1 text-sm text-zinc-100 text-center focus:outline-none focus:border-amber-500 transition-colors" />
|
||||
</label>
|
||||
<span class="text-xs text-zinc-500 ml-1">Refresh:</span>
|
||||
{{range .RefreshPages}}
|
||||
<form hx-post="/ranking/refresh"
|
||||
hx-target="#ranking-refresh-status"
|
||||
hx-swap="innerHTML">
|
||||
<input type="hidden" name="pages" value="{{.Pages}}">
|
||||
<button type="submit"
|
||||
class="text-sm px-3 py-1.5 rounded-lg bg-amber-700 hover:bg-amber-600 text-white inline-flex items-center gap-2">
|
||||
Refresh Rankings
|
||||
class="text-sm px-3 py-1.5 rounded-lg bg-amber-800 hover:bg-amber-600 text-white transition-colors">
|
||||
{{.Label}}
|
||||
</button>
|
||||
</form>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div id="ranking-refresh-status" class="mt-2"></div>
|
||||
@@ -391,6 +388,21 @@ func toRankingViewItems(items []writer.RankingItem, localSlugs map[string]bool)
|
||||
return out
|
||||
}
|
||||
|
||||
// refreshPage is one entry in the ranking refresh pagination bar.
|
||||
type refreshPage struct {
|
||||
Label string
|
||||
Pages int // 0 means "all pages"
|
||||
}
|
||||
|
||||
// rankingRefreshPages defines the ordered set of refresh buttons shown on the
|
||||
// ranking page. Pages == 0 means "fetch all pages".
|
||||
var rankingRefreshPages = []refreshPage{
|
||||
{"Top 100", 1},
|
||||
{"Top 300", 3},
|
||||
{"Top 500", 5},
|
||||
{"All", 0},
|
||||
}
|
||||
|
||||
// handleRanking serves the ranking page from the cached ranking.md file.
|
||||
// It does NOT trigger a live scrape; use POST /ranking/refresh for that.
|
||||
func (s *Server) handleRanking(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -407,9 +419,14 @@ func (s *Server) handleRanking(w http.ResponseWriter, r *http.Request) {
|
||||
t := template.Must(template.New("ranking").Parse(rankingTmpl))
|
||||
var buf bytes.Buffer
|
||||
_ = t.Execute(&buf, struct {
|
||||
Books interface{}
|
||||
CachedAt string
|
||||
}{Books: toRankingViewItems(rankingItems, s.writer.LocalSlugs()), CachedAt: cachedAt})
|
||||
Books interface{}
|
||||
CachedAt string
|
||||
RefreshPages []refreshPage
|
||||
}{
|
||||
Books: toRankingViewItems(rankingItems, s.writer.LocalSlugs()),
|
||||
CachedAt: cachedAt,
|
||||
RefreshPages: rankingRefreshPages,
|
||||
})
|
||||
s.respond(w, r, "Rankings", buf.String())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user