diff --git a/modules/timeutil/datetime.go b/modules/timeutil/datetime.go
index 83170b374b..62b94f7cf4 100644
--- a/modules/timeutil/datetime.go
+++ b/modules/timeutil/datetime.go
@@ -7,11 +7,12 @@ import (
"fmt"
"html"
"html/template"
+ "strings"
"time"
)
// DateTime renders an absolute time HTML element by datetime.
-func DateTime(format string, datetime any) template.HTML {
+func DateTime(format string, datetime any, extraAttrs ...string) template.HTML {
if p, ok := datetime.(*time.Time); ok {
datetime = *p
}
@@ -48,13 +49,20 @@ func DateTime(format string, datetime any) template.HTML {
panic(fmt.Sprintf("Unsupported time type %T", datetime))
}
+ attrs := make([]string, 0, 10+len(extraAttrs))
+ attrs = append(attrs, extraAttrs...)
+ attrs = append(attrs, `data-tooltip-content`, `data-tooltip-interactive="true"`)
+ attrs = append(attrs, `format="datetime"`, `weekday=""`, `year="numeric"`)
+
switch format {
case "short":
- return template.HTML(fmt.Sprintf(`%s`, datetimeEscaped, textEscaped))
+ attrs = append(attrs, `month="short"`, `day="numeric"`)
case "long":
- return template.HTML(fmt.Sprintf(`%s`, datetimeEscaped, textEscaped))
+ attrs = append(attrs, `month="long"`, `day="numeric"`)
case "full":
- return template.HTML(fmt.Sprintf(`%s`, datetimeEscaped, textEscaped))
+ attrs = append(attrs, `month="short"`, `day="numeric"`, `hour="numeric"`, `minute="numeric"`, `second="numeric"`)
+ default:
+ panic(fmt.Sprintf("Unsupported format %s", format))
}
- panic(fmt.Sprintf("Unsupported format %s", format))
+ return template.HTML(fmt.Sprintf(`%s`, strings.Join(attrs, " "), datetimeEscaped, textEscaped))
}
diff --git a/modules/timeutil/datetime_test.go b/modules/timeutil/datetime_test.go
index f44b7aaae3..26494b8475 100644
--- a/modules/timeutil/datetime_test.go
+++ b/modules/timeutil/datetime_test.go
@@ -8,16 +8,14 @@ import (
"time"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
)
func TestDateTime(t *testing.T) {
- oldTz := setting.DefaultUILocation
- setting.DefaultUILocation, _ = time.LoadLocation("America/New_York")
- defer func() {
- setting.DefaultUILocation = oldTz
- }()
+ testTz, _ := time.LoadLocation("America/New_York")
+ defer test.MockVariableValue(&setting.DefaultUILocation, testTz)()
refTimeStr := "2018-01-01T00:00:00Z"
refTime, _ := time.Parse(time.RFC3339, refTimeStr)
@@ -29,17 +27,17 @@ func TestDateTime(t *testing.T) {
assert.EqualValues(t, "-", DateTime("short", TimeStamp(0)))
actual := DateTime("short", "invalid")
- assert.EqualValues(t, `invalid`, actual)
+ assert.EqualValues(t, `invalid`, actual)
actual = DateTime("short", refTimeStr)
- assert.EqualValues(t, `2018-01-01T00:00:00Z`, actual)
+ assert.EqualValues(t, `2018-01-01T00:00:00Z`, actual)
actual = DateTime("short", refTime)
- assert.EqualValues(t, `2018-01-01`, actual)
+ assert.EqualValues(t, `2018-01-01`, actual)
actual = DateTime("short", refTimeStamp)
- assert.EqualValues(t, `2017-12-31`, actual)
+ assert.EqualValues(t, `2017-12-31`, actual)
actual = DateTime("full", refTimeStamp)
- assert.EqualValues(t, `2017-12-31 19:00:00 -05:00`, actual)
+ assert.EqualValues(t, `2017-12-31 19:00:00 -05:00`, actual)
}
diff --git a/templates/user/settings/security/webauthn.tmpl b/templates/user/settings/security/webauthn.tmpl
index 28d8511fb4..e0876f4162 100644
--- a/templates/user/settings/security/webauthn.tmpl
+++ b/templates/user/settings/security/webauthn.tmpl
@@ -10,7 +10,9 @@
{{.Name}}
-
{{TimeSinceUnix .CreatedUnix ctx.Locale}}
+
+ {{ctx.Locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}}
+