fix: standard pagination with ellipsis (1 … cur±2 … N)

This commit is contained in:
tian 2026-05-12 17:12:45 +08:00
parent 0f4c75fe26
commit bc085533a1
2 changed files with 25 additions and 9 deletions

View File

@ -1958,20 +1958,32 @@ func (u *UI) pageAlarms(w http.ResponseWriter, r *http.Request) {
if u.alarmCollector != nil {
data.AlarmRecords, data.TotalAlarmCount = u.alarmCollector.GetFiltered(from, to, perPage, (page-1)*perPage)
}
// Calculate total pages and visible page range (current ± 3)
// Calculate total pages and build page list: 1, ..., cur-2, cur-1, cur, cur+1, cur+2, ..., N
if data.TotalAlarmCount > 0 {
data.TotalAlarmPages = (data.TotalAlarmCount + perPage - 1) / perPage
start := page - 3
if start < 1 {
start = 1
tp := data.TotalAlarmPages
// Always include first and last; include current ±2; fill gaps with -1 (ellipsis).
seen := map[int]bool{}
add := func(p int) {
if p >= 1 && p <= tp && !seen[p] {
seen[p] = true
data.PageNumbers = append(data.PageNumbers, p)
}
}
end := page + 3
if end > data.TotalAlarmPages {
end = data.TotalAlarmPages
add(1)
for p := page - 2; p <= page+2; p++ {
add(p)
}
for p := start; p <= end; p++ {
data.PageNumbers = append(data.PageNumbers, p)
add(tp)
// Insert -1 for gaps > 1.
compact := make([]int, 0, len(data.PageNumbers))
for i, p := range data.PageNumbers {
if i > 0 && p > data.PageNumbers[i-1]+1 {
compact = append(compact, -1)
}
compact = append(compact, p)
}
data.PageNumbers = compact
}
u.render(w, r, "alarms", data)
}

View File

@ -64,8 +64,12 @@
<a href="/ui/alarms?from={{$from}}&to={{$to}}&per_page={{$pp}}&page={{sub .CurrentPage 1}}" class="btn ghost" style="font-size:11px;padding:2px 6px"></a>
{{end}}
{{range .PageNumbers}}
{{if eq . -1}}
<span class="muted small" style="padding:2px 4px"></span>
{{else}}
<a href="/ui/alarms?from={{$from}}&to={{$to}}&per_page={{$pp}}&page={{.}}" class="btn {{if eq . $.CurrentPage}}primary{{else}}ghost{{end}}" style="font-size:11px;padding:2px 8px">{{.}}</a>
{{end}}
{{end}}
{{if lt .CurrentPage .TotalAlarmPages}}
<a href="/ui/alarms?from={{$from}}&to={{$to}}&per_page={{$pp}}&page={{add .CurrentPage 1}}" class="btn ghost" style="font-size:11px;padding:2px 6px"></a>
<a href="/ui/alarms?from={{$from}}&to={{$to}}&per_page={{$pp}}&page={{.TotalAlarmPages}}" class="btn ghost" style="font-size:11px;padding:2px 6px">»</a>