diff options
-rw-r--r-- | cgit.h | 1 | ||||
-rw-r--r-- | cgit.js | 61 | ||||
-rw-r--r-- | ui-shared.c | 2 |
3 files changed, 63 insertions, 1 deletions
@@ -25,6 +25,7 @@ | |||
25 | #include <utf8.h> | 25 | #include <utf8.h> |
26 | #include <notes.h> | 26 | #include <notes.h> |
27 | #include <graph.h> | 27 | #include <graph.h> |
28 | #include <inttypes.h> | ||
28 | 29 | ||
29 | /* Add isgraph(x) to Git's sane ctype support (see git-compat-util.h) */ | 30 | /* Add isgraph(x) to Git's sane ctype support (see git-compat-util.h) */ |
30 | #undef isgraph | 31 | #undef isgraph |
@@ -5,3 +5,64 @@ | |||
5 | * Licensed under GNU General Public License v2 | 5 | * Licensed under GNU General Public License v2 |
6 | * (see COPYING for full license text) | 6 | * (see COPYING for full license text) |
7 | */ | 7 | */ |
8 | |||
9 | (function () { | ||
10 | |||
11 | /* This follows the logic and suffixes used in ui-shared.c */ | ||
12 | |||
13 | var age_classes = [ "age-mins", "age-hours", "age-days", "age-weeks", "age-months", "age-years" ]; | ||
14 | var age_suffix = [ "min.", "hours", "days", "weeks", "months", "years", "years" ]; | ||
15 | var age_next = [ 60, 3600, 24 * 3600, 7 * 24 * 3600, 30 * 24 * 3600, 365 * 24 * 3600, 365 * 24 * 3600 ]; | ||
16 | var age_limit = [ 7200, 24 * 7200, 7 * 24 * 7200, 30 * 24 * 7200, 365 * 25 * 7200, 365 * 25 * 7200 ]; | ||
17 | var update_next = [ 10, 5 * 60, 1800, 24 * 3600, 24 * 3600, 24 * 3600, 24 * 3600 ]; | ||
18 | |||
19 | function render_age(e, age) { | ||
20 | var t, n; | ||
21 | |||
22 | for (n = 0; n < age_classes.length; n++) | ||
23 | if (age < age_limit[n]) | ||
24 | break; | ||
25 | |||
26 | t = Math.round(age / age_next[n]) + " " + age_suffix[n]; | ||
27 | |||
28 | if (e.textContent != t) { | ||
29 | e.textContent = t; | ||
30 | if (n == age_classes.length) | ||
31 | n--; | ||
32 | if (e.className != age_classes[n]) | ||
33 | e.className = age_classes[n]; | ||
34 | } | ||
35 | } | ||
36 | |||
37 | function aging() { | ||
38 | var n, next = 24 * 3600, | ||
39 | now_ut = Math.round((new Date().getTime() / 1000)); | ||
40 | |||
41 | for (n = 0; n < age_classes.length; n++) { | ||
42 | var m, elems = document.getElementsByClassName(age_classes[n]); | ||
43 | |||
44 | if (elems.length && update_next[n] < next) | ||
45 | next = update_next[n]; | ||
46 | |||
47 | for (m = 0; m < elems.length; m++) { | ||
48 | var age = now_ut - elems[m].getAttribute("data-ut"); | ||
49 | |||
50 | render_age(elems[m], age); | ||
51 | } | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * We only need to come back when the age might have changed. | ||
56 | * Eg, if everything is counted in hours already, once per | ||
57 | * 5 minutes is accurate enough. | ||
58 | */ | ||
59 | |||
60 | window.setTimeout(aging, next * 1000); | ||
61 | } | ||
62 | |||
63 | document.addEventListener("DOMContentLoaded", function() { | ||
64 | /* we can do the aging on DOM content load since no layout dependency */ | ||
65 | aging(); | ||
66 | }, false); | ||
67 | |||
68 | })(); | ||
diff --git a/ui-shared.c b/ui-shared.c index bc76a6e..959ed8b 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
@@ -673,7 +673,7 @@ const struct date_mode *cgit_date_mode(enum date_mode_type type) | |||
673 | static void print_rel_date(time_t t, int tz, double value, | 673 | static void print_rel_date(time_t t, int tz, double value, |
674 | const char *class, const char *suffix) | 674 | const char *class, const char *suffix) |
675 | { | 675 | { |
676 | htmlf("<span class='%s' title='", class); | 676 | htmlf("<span class='%s' data-ut='%" PRIu64 "' title='", class, (uint64_t)t); |
677 | html_attr(show_date(t, tz, cgit_date_mode(DATE_ISO8601))); | 677 | html_attr(show_date(t, tz, cgit_date_mode(DATE_ISO8601))); |
678 | htmlf("'>%.0f %s</span>", value, suffix); | 678 | htmlf("'>%.0f %s</span>", value, suffix); |
679 | } | 679 | } |