| @@ -192,6 +192,12 @@ MAX_SIZE | |||
| ; Max number of files per upload. Defaults to 10 | |||
| MAX_FILES = | |||
| [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" | |||
| "strconv" | |||
| "strings" | |||
| @@ -239,8 +240,8 @@ 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) string { | |||
| // timeSince calculates the time interval and generate user-friendly string. | |||
| func timeSince(then time.Time) string { | |||
| now := time.Now() | |||
| lbl := "ago" | |||
| @@ -290,6 +291,11 @@ func TimeSince(then time.Time) string { | |||
| } | |||
| } | |||
| // TimeSince calculates the time interval and generate user-friendly string. | |||
| func TimeSince(t time.Time) template.HTML { | |||
| return template.HTML(fmt.Sprintf(`<span class="time-since" title="%s">%s</span>`, t.Format(setting.TimeFormat), timeSince(t))) | |||
| } | |||
| const ( | |||
| Byte = 1 | |||
| KByte = Byte * 1024 | |||
| @@ -11,6 +11,7 @@ import ( | |||
| "path" | |||
| "path/filepath" | |||
| "strings" | |||
| "time" | |||
| "github.com/Unknwon/com" | |||
| "github.com/Unknwon/goconfig" | |||
| @@ -78,6 +79,9 @@ var ( | |||
| AttachmentMaxFiles int | |||
| AttachmentEnabled bool | |||
| // Time settings. | |||
| TimeFormat string | |||
| // Cache settings. | |||
| Cache cache.Cache | |||
| CacheAdapter string | |||
| @@ -179,6 +183,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("Could not create directory %s: %s", AttachmentPath, err) | |||
| } | |||
| @@ -960,6 +960,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(); | |||
| @@ -988,6 +1000,8 @@ function initOrganization() { | |||
| if ($('#body-nav').hasClass("org-nav")) { | |||
| initOrganization(); | |||
| } | |||
| initTimeSwitch(); | |||
| }); | |||
| })(jQuery); | |||