Skip to content

Commit 8345780

Browse files
authored
Make template DateTime show proper tooltip (#28677) (#28683)
Backport #28677
1 parent 3c79315 commit 8345780

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

modules/timeutil/datetime.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import (
77
"fmt"
88
"html"
99
"html/template"
10+
"strings"
1011
"time"
1112
)
1213

1314
// DateTime renders an absolute time HTML element by datetime.
14-
func DateTime(format string, datetime any) template.HTML {
15+
func DateTime(format string, datetime any, extraAttrs ...string) template.HTML {
1516
if p, ok := datetime.(*time.Time); ok {
1617
datetime = *p
1718
}
@@ -48,13 +49,20 @@ func DateTime(format string, datetime any) template.HTML {
4849
panic(fmt.Sprintf("Unsupported time type %T", datetime))
4950
}
5051

52+
attrs := make([]string, 0, 10+len(extraAttrs))
53+
attrs = append(attrs, extraAttrs...)
54+
attrs = append(attrs, `data-tooltip-content`, `data-tooltip-interactive="true"`)
55+
attrs = append(attrs, `format="datetime"`, `weekday=""`, `year="numeric"`)
56+
5157
switch format {
5258
case "short":
53-
return template.HTML(fmt.Sprintf(`<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="%s">%s</relative-time>`, datetimeEscaped, textEscaped))
59+
attrs = append(attrs, `month="short"`, `day="numeric"`)
5460
case "long":
55-
return template.HTML(fmt.Sprintf(`<relative-time format="datetime" year="numeric" month="long" day="numeric" weekday="" datetime="%s">%s</relative-time>`, datetimeEscaped, textEscaped))
61+
attrs = append(attrs, `month="long"`, `day="numeric"`)
5662
case "full":
57-
return template.HTML(fmt.Sprintf(`<relative-time format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="%s">%s</relative-time>`, datetimeEscaped, textEscaped))
63+
attrs = append(attrs, `month="short"`, `day="numeric"`, `hour="numeric"`, `minute="numeric"`, `second="numeric"`)
64+
default:
65+
panic(fmt.Sprintf("Unsupported format %s", format))
5866
}
59-
panic(fmt.Sprintf("Unsupported format %s", format))
67+
return template.HTML(fmt.Sprintf(`<relative-time %s datetime="%s">%s</relative-time>`, strings.Join(attrs, " "), datetimeEscaped, textEscaped))
6068
}

modules/timeutil/datetime_test.go

+8-10
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@ import (
88
"time"
99

1010
"code.gitea.io/gitea/modules/setting"
11+
"code.gitea.io/gitea/modules/test"
1112

1213
"github.com/stretchr/testify/assert"
1314
)
1415

1516
func TestDateTime(t *testing.T) {
16-
oldTz := setting.DefaultUILocation
17-
setting.DefaultUILocation, _ = time.LoadLocation("America/New_York")
18-
defer func() {
19-
setting.DefaultUILocation = oldTz
20-
}()
17+
testTz, _ := time.LoadLocation("America/New_York")
18+
defer test.MockVariableValue(&setting.DefaultUILocation, testTz)()
2119

2220
refTimeStr := "2018-01-01T00:00:00Z"
2321
refTime, _ := time.Parse(time.RFC3339, refTimeStr)
@@ -29,17 +27,17 @@ func TestDateTime(t *testing.T) {
2927
assert.EqualValues(t, "-", DateTime("short", TimeStamp(0)))
3028

3129
actual := DateTime("short", "invalid")
32-
assert.EqualValues(t, `<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="invalid">invalid</relative-time>`, actual)
30+
assert.EqualValues(t, `<relative-time data-tooltip-content data-tooltip-interactive="true" format="datetime" weekday="" year="numeric" month="short" day="numeric" datetime="invalid">invalid</relative-time>`, actual)
3331

3432
actual = DateTime("short", refTimeStr)
35-
assert.EqualValues(t, `<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="2018-01-01T00:00:00Z">2018-01-01T00:00:00Z</relative-time>`, actual)
33+
assert.EqualValues(t, `<relative-time data-tooltip-content data-tooltip-interactive="true" format="datetime" weekday="" year="numeric" month="short" day="numeric" datetime="2018-01-01T00:00:00Z">2018-01-01T00:00:00Z</relative-time>`, actual)
3634

3735
actual = DateTime("short", refTime)
38-
assert.EqualValues(t, `<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="2018-01-01T00:00:00Z">2018-01-01</relative-time>`, actual)
36+
assert.EqualValues(t, `<relative-time data-tooltip-content data-tooltip-interactive="true" format="datetime" weekday="" year="numeric" month="short" day="numeric" datetime="2018-01-01T00:00:00Z">2018-01-01</relative-time>`, actual)
3937

4038
actual = DateTime("short", refTimeStamp)
41-
assert.EqualValues(t, `<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="2017-12-31T19:00:00-05:00">2017-12-31</relative-time>`, actual)
39+
assert.EqualValues(t, `<relative-time data-tooltip-content data-tooltip-interactive="true" format="datetime" weekday="" year="numeric" month="short" day="numeric" datetime="2017-12-31T19:00:00-05:00">2017-12-31</relative-time>`, actual)
4240

4341
actual = DateTime("full", refTimeStamp)
44-
assert.EqualValues(t, `<relative-time format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="2017-12-31T19:00:00-05:00">2017-12-31 19:00:00 -05:00</relative-time>`, actual)
42+
assert.EqualValues(t, `<relative-time data-tooltip-content data-tooltip-interactive="true" format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="2017-12-31T19:00:00-05:00">2017-12-31 19:00:00 -05:00</relative-time>`, actual)
4543
}

templates/user/settings/security/webauthn.tmpl

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
</div>
1111
<div class="flex-item-main">
1212
<div class="flex-item-title">{{.Name}}</div>
13-
<span class="flex-item-body time">{{TimeSinceUnix .CreatedUnix ctx.Locale}}</span>
13+
<div class="flex-item-body">
14+
<i>{{ctx.Locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix) | Safe}}</i>
15+
</div>
1416
</div>
1517
<div class="flex-item-trailing">
1618
<button class="ui red tiny button delete-button" data-modal-id="delete-registration" data-url="{{$.Link}}/webauthn/delete" data-id="{{.ID}}">

0 commit comments

Comments
 (0)