Show ages on the AS and prefix pages in words (closes #163)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The Age column printed Go's duration format for every plural age, such as "5m0s ago" or "360h0m0s ago". The templates now register humanize.Time from go-humanize, which the server already uses, as the timeSince function, and the hand-written function is gone. Ages read "5 minutes ago", "3 hours ago" or "2 weeks ago". An age under a minute reads "now" or in seconds instead of "just now". An age over a month reads in months or years instead of a date. Model: opus-5-5
This commit was merged in pull request #171.
This commit is contained in:
@@ -7,9 +7,9 @@ import (
|
||||
"net/url"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.eeqj.de/sneak/routewatch/internal/version"
|
||||
"github.com/dustin/go-humanize"
|
||||
)
|
||||
|
||||
//go:embed index.html
|
||||
@@ -48,48 +48,7 @@ var (
|
||||
once sync.Once
|
||||
)
|
||||
|
||||
const (
|
||||
hoursPerDay = 24
|
||||
daysPerMonth = 30
|
||||
cidrPartCount = 2 // A CIDR has two parts: prefix and length
|
||||
)
|
||||
|
||||
// timeSince returns a human-readable duration since the given time
|
||||
func timeSince(t time.Time) string {
|
||||
duration := time.Since(t)
|
||||
if duration < time.Minute {
|
||||
return "just now"
|
||||
}
|
||||
|
||||
if duration < time.Hour {
|
||||
minutes := int(duration.Minutes())
|
||||
if minutes == 1 {
|
||||
return "1 minute ago"
|
||||
}
|
||||
|
||||
return duration.Truncate(time.Minute).String() + " ago"
|
||||
}
|
||||
|
||||
if duration < hoursPerDay*time.Hour {
|
||||
hours := int(duration.Hours())
|
||||
if hours == 1 {
|
||||
return "1 hour ago"
|
||||
}
|
||||
|
||||
return duration.Truncate(time.Hour).String() + " ago"
|
||||
}
|
||||
|
||||
days := int(duration.Hours() / hoursPerDay)
|
||||
if days == 1 {
|
||||
return "1 day ago"
|
||||
}
|
||||
|
||||
if days < daysPerMonth {
|
||||
return duration.Truncate(hoursPerDay*time.Hour).String() + " ago"
|
||||
}
|
||||
|
||||
return t.Format("2006-01-02")
|
||||
}
|
||||
const cidrPartCount = 2 // A CIDR has two parts: prefix and length
|
||||
|
||||
// prefixURL generates a URL path for a prefix in CIDR notation.
|
||||
// Takes a prefix like "192.168.1.0/24" and returns "/prefix/192.168.1.0/24"
|
||||
@@ -113,7 +72,7 @@ func initTemplates() {
|
||||
|
||||
// Create common template functions
|
||||
funcs := template.FuncMap{
|
||||
"timeSince": timeSince,
|
||||
"timeSince": humanize.Time,
|
||||
"urlEncode": url.QueryEscape,
|
||||
"prefixURL": prefixURL,
|
||||
"appName": func() string { return version.Name },
|
||||
|
||||
Reference in New Issue
Block a user