Fix #281. Add mouse-over precise time and on-click switch listener.tags/v0.9.99
@@ -186,6 +186,12 @@ MAX_SIZE = 32 | |||
; Max number of files per upload. Defaults to 10 | |||
MAX_FILES = 10 | |||
[time] | |||
; Specifies the format for fully outputed dates. Defaults to RFC1123 | |||
; Special supported values are ANSIC, UnixDate, RubyDate, RFC822, RFC822Z, RFC850, RFC1123, RFC1123Z, RFC3339, RFC3339Nano, Kitchen, Stamp, StampMilli, StampMicro and StampNano | |||
; For more information about the format see http://golang.org/pkg/time/#pkg-constants | |||
FORMAT = | |||
[log] | |||
ROOT_PATH = | |||
; Either "console", "file", "conn", "smtp" or "database", default is "console" |
@@ -12,6 +12,7 @@ import ( | |||
"encoding/hex" | |||
"fmt" | |||
"hash" | |||
"html/template" | |||
"math" | |||
"strings" | |||
"time" | |||
@@ -241,8 +242,7 @@ func TimeSincePro(then time.Time) string { | |||
return strings.TrimPrefix(timeStr, ", ") | |||
} | |||
// TimeSince calculates the time interval and generate user-friendly string. | |||
func TimeSince(then time.Time, lang string) string { | |||
func timeSince(then time.Time, lang string) string { | |||
now := time.Now() | |||
lbl := i18n.Tr(lang, "tool.ago") | |||
@@ -292,6 +292,11 @@ func TimeSince(then time.Time, lang string) string { | |||
} | |||
} | |||
// TimeSince calculates the time interval and generate user-friendly string. | |||
func TimeSince(t time.Time, lang string) template.HTML { | |||
return template.HTML(fmt.Sprintf(`<span class="time-since" title="%s">%s</span>`, t.Format(setting.TimeFormat), timeSince(t, lang))) | |||
} | |||
const ( | |||
Byte = 1 | |||
KByte = Byte * 1024 |
@@ -11,6 +11,7 @@ import ( | |||
"path" | |||
"path/filepath" | |||
"strings" | |||
"time" | |||
"github.com/Unknwon/com" | |||
"github.com/Unknwon/goconfig" | |||
@@ -77,6 +78,9 @@ var ( | |||
AttachmentMaxFiles int | |||
AttachmentEnabled bool | |||
// Time settings. | |||
TimeFormat string | |||
// Cache settings. | |||
CacheAdapter string | |||
CacheInternal int | |||
@@ -183,6 +187,55 @@ func NewConfigContext() { | |||
AttachmentMaxFiles = Cfg.MustInt("attachment", "MAX_FILES", 10) | |||
AttachmentEnabled = Cfg.MustBool("attachment", "ENABLE", true) | |||
TimeFormat = Cfg.MustValue("time", "FORMAT", time.RFC1123) | |||
switch TimeFormat { | |||
case "ANSIC": | |||
TimeFormat = time.ANSIC | |||
case "UnixDate": | |||
TimeFormat = time.UnixDate | |||
case "RubyDate": | |||
TimeFormat = time.RubyDate | |||
case "RFC822": | |||
TimeFormat = time.RFC822 | |||
case "RFC822Z": | |||
TimeFormat = time.RFC822Z | |||
case "RFC850": | |||
TimeFormat = time.RFC850 | |||
case "RFC1123": | |||
TimeFormat = time.RFC1123 | |||
case "RFC1123Z": | |||
TimeFormat = time.RFC1123Z | |||
case "RFC3339": | |||
TimeFormat = time.RFC3339 | |||
case "RFC3339Nano": | |||
TimeFormat = time.RFC3339Nano | |||
case "Kitchen": | |||
TimeFormat = time.Kitchen | |||
case "Stamp": | |||
TimeFormat = time.Stamp | |||
case "StampMilli": | |||
TimeFormat = time.StampMilli | |||
case "StampMicro": | |||
TimeFormat = time.StampMicro | |||
case "StampNano": | |||
TimeFormat = time.StampNano | |||
} | |||
if err = os.MkdirAll(AttachmentPath, os.ModePerm); err != nil { | |||
log.Fatal(4, "Could not create directory %s: %s", AttachmentPath, err) | |||
} |
@@ -1120,6 +1120,18 @@ function initOrganization() { | |||
console.log("init script : organization done"); | |||
} | |||
function initTimeSwitch() { | |||
$(".time-since[title]").on("click", function() { | |||
var $this = $(this); | |||
var title = $this.attr("title"); | |||
var text = $this.text(); | |||
$this.text(title); | |||
$this.attr("title", text); | |||
}); | |||
} | |||
(function ($) { | |||
$(function () { | |||
initCore(); | |||
@@ -1148,6 +1160,8 @@ function initOrganization() { | |||
if ($('#body-nav').hasClass("org-nav")) { | |||
initOrganization(); | |||
} | |||
initTimeSwitch(); | |||
}); | |||
})(jQuery); | |||