diff --git a/internal/provider/providers/porkbun/provider.go b/internal/provider/providers/porkbun/provider.go
index 45d32534a..a2702fde4 100644
--- a/internal/provider/providers/porkbun/provider.go
+++ b/internal/provider/providers/porkbun/provider.go
@@ -103,7 +103,7 @@ func (p *Provider) HTML() models.HTMLRow {
return models.HTMLRow{
Domain: fmt.Sprintf("%s", p.BuildDomainName(), p.BuildDomainName()),
Owner: p.Owner(),
- Provider: "Porkbun DNS",
+ Provider: "Porkbun",
IPVersion: p.ipVersion.String(),
}
}
diff --git a/internal/records/html.go b/internal/records/html.go
index e0c6b033e..f09072862 100644
--- a/internal/records/html.go
+++ b/internal/records/html.go
@@ -14,22 +14,34 @@ func (r *Record) HTML(now time.Time) models.HTMLRow {
row := r.Provider.HTML()
message := r.Message
if r.Status == constants.UPTODATE {
- message = "no IP change for " + r.History.GetDurationSinceSuccess(now)
- }
- if message != "" {
- message = fmt.Sprintf("(%s)", message)
+ message = "No changes needed - IP stable for " + r.History.GetDurationSinceSuccess(now)
}
if r.Status == "" {
row.Status = NotAvailable
} else {
- row.Status = fmt.Sprintf("%s %s, %s",
- convertStatus(r.Status),
- message,
- time.Since(r.Time).Round(time.Second).String()+" ago")
+ timeSince := time.Since(r.Time).Round(time.Second)
+ var timeDisplay string
+ if timeSince < time.Minute {
+ timeDisplay = "Just now"
+ } else if timeSince < time.Hour {
+ timeDisplay = fmt.Sprintf("%d min ago", int(timeSince.Minutes()))
+ } else if timeSince < 24*time.Hour {
+ timeDisplay = fmt.Sprintf("%d hrs ago", int(timeSince.Hours()))
+ } else {
+ timeDisplay = fmt.Sprintf("%d days ago", int(timeSince.Hours()/24))
+ }
+
+ statusBadge := convertStatus(r.Status)
+ if message != "" {
+ statusBadge = convertStatusWithTooltip(r.Status, message)
+ }
+
+ statusHTML := fmt.Sprintf(`%s %s`, statusBadge, timeDisplay)
+ row.Status = statusHTML
}
currentIP := r.History.GetCurrentIP()
if currentIP.IsValid() {
- row.CurrentIP = `` + currentIP.String() + ""
+ row.CurrentIP = `` + currentIP.String() + ` `
} else {
row.CurrentIP = NotAvailable
}
@@ -53,15 +65,32 @@ func (r *Record) HTML(now time.Time) models.HTMLRow {
func convertStatus(status models.Status) string {
switch status {
case constants.SUCCESS:
- return `Success`
+ return `Updated`
+ case constants.FAIL:
+ return `Failed`
+ case constants.UPTODATE:
+ return `Current`
+ case constants.UPDATING:
+ return `Syncing`
+ case constants.UNSET:
+ return `Pending`
+ default:
+ return "Unknown status"
+ }
+}
+
+func convertStatusWithTooltip(status models.Status, message string) string {
+ switch status {
+ case constants.SUCCESS:
+ return fmt.Sprintf(`Updated`, message)
case constants.FAIL:
- return `Failure`
+ return fmt.Sprintf(`Failed`, message)
case constants.UPTODATE:
- return `Up to date`
+ return fmt.Sprintf(`Current`, message)
case constants.UPDATING:
- return `Updating`
+ return fmt.Sprintf(`Syncing`, message)
case constants.UNSET:
- return `Unset`
+ return fmt.Sprintf(`Pending`, message)
default:
return "Unknown status"
}
diff --git a/internal/server/index.go b/internal/server/index.go
index 090721572..cb0397f20 100644
--- a/internal/server/index.go
+++ b/internal/server/index.go
@@ -6,12 +6,14 @@ import (
"github.com/qdm12/ddns-updater/internal/models"
)
-func (h *handlers) index(w http.ResponseWriter, _ *http.Request) {
+func (h *handlers) index(w http.ResponseWriter, r *http.Request) {
var htmlData models.HTMLData
for _, record := range h.db.SelectAll() {
row := record.HTML(h.timeNow())
htmlData.Rows = append(htmlData.Rows, row)
}
+
+
err := h.indexTemplate.ExecuteTemplate(w, "index.html", htmlData)
if err != nil {
httpError(w, http.StatusInternalServerError, "failed generating webpage: "+err.Error())
diff --git a/internal/server/ui/index.html b/internal/server/ui/index.html
index 92c88fbfb..fba594b9c 100644
--- a/internal/server/ui/index.html
+++ b/internal/server/ui/index.html
@@ -11,46 +11,125 @@
-
-
-
- Domain |
- Owner |
- Provider |
- IP Version |
- Update Status |
- Current IP |
- Previous IPs (reverse chronological order) |
-
-
-
- {{range .Rows}}
-
- {{.Domain}} |
- {{.Owner}} |
- {{.Provider}} |
- {{.IPVersion}} |
- {{.Status}} |
- {{.CurrentIP}} |
- {{.PreviousIPs}} |
-
- {{end}}
-
-
-
+
+
+
+
+
+
+
+
+ Domain |
+ Owner |
+ Provider |
+ IP Version |
+ Status |
+ Current IP |
+ Previous IPs |
+
+
+
+ {{range .Rows}}
+
+ {{.Domain}} |
+ {{.Owner}} |
+ {{.Provider}} |
+
+ {{if eq .IPVersion "ipv4 or ipv6"}}
+ ipv4
+ ipv6
+ {{else}}
+ {{.IPVersion}}
+ {{end}}
+ |
+ {{.Status}} |
+ {{.CurrentIP}} |
+ {{.PreviousIPs}} |
+
+ {{end}}
+
+
+
+
+
+
+
+