| @@ -192,6 +192,12 @@ MAX_SIZE | |||||
| ; Max number of files per upload. Defaults to 10 | ; Max number of files per upload. Defaults to 10 | ||||
| MAX_FILES = | 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] | [log] | ||||
| ROOT_PATH = | ROOT_PATH = | ||||
| ; Either "console", "file", "conn", "smtp" or "database", default is "console" | ; Either "console", "file", "conn", "smtp" or "database", default is "console" | ||||
| @@ -12,6 +12,7 @@ import ( | |||||
| "encoding/hex" | "encoding/hex" | ||||
| "fmt" | "fmt" | ||||
| "hash" | "hash" | ||||
| "html/template" | |||||
| "math" | "math" | ||||
| "strconv" | "strconv" | ||||
| "strings" | "strings" | ||||
| @@ -239,8 +240,8 @@ func TimeSincePro(then time.Time) string { | |||||
| return strings.TrimPrefix(timeStr, ", ") | 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() | now := time.Now() | ||||
| lbl := "ago" | 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 ( | const ( | ||||
| Byte = 1 | Byte = 1 | ||||
| KByte = Byte * 1024 | KByte = Byte * 1024 | ||||
| @@ -11,6 +11,7 @@ import ( | |||||
| "path" | "path" | ||||
| "path/filepath" | "path/filepath" | ||||
| "strings" | "strings" | ||||
| "time" | |||||
| "github.com/Unknwon/com" | "github.com/Unknwon/com" | ||||
| "github.com/Unknwon/goconfig" | "github.com/Unknwon/goconfig" | ||||
| @@ -78,6 +79,9 @@ var ( | |||||
| AttachmentMaxFiles int | AttachmentMaxFiles int | ||||
| AttachmentEnabled bool | AttachmentEnabled bool | ||||
| // Time settings. | |||||
| TimeFormat string | |||||
| // Cache settings. | // Cache settings. | ||||
| Cache cache.Cache | Cache cache.Cache | ||||
| CacheAdapter string | CacheAdapter string | ||||
| @@ -179,6 +183,55 @@ func NewConfigContext() { | |||||
| AttachmentMaxFiles = Cfg.MustInt("attachment", "MAX_FILES", 10) | AttachmentMaxFiles = Cfg.MustInt("attachment", "MAX_FILES", 10) | ||||
| AttachmentEnabled = Cfg.MustBool("attachment", "ENABLE", true) | 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 { | if err = os.MkdirAll(AttachmentPath, os.ModePerm); err != nil { | ||||
| log.Fatal("Could not create directory %s: %s", AttachmentPath, err) | log.Fatal("Could not create directory %s: %s", AttachmentPath, err) | ||||
| } | } | ||||
| @@ -960,6 +960,18 @@ function initOrganization() { | |||||
| console.log("init script : organization done"); | 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 ($) { | ||||
| $(function () { | $(function () { | ||||
| initCore(); | initCore(); | ||||
| @@ -988,6 +1000,8 @@ function initOrganization() { | |||||
| if ($('#body-nav').hasClass("org-nav")) { | if ($('#body-nav').hasClass("org-nav")) { | ||||
| initOrganization(); | initOrganization(); | ||||
| } | } | ||||
| initTimeSwitch(); | |||||
| }); | }); | ||||
| })(jQuery); | })(jQuery); | ||||