aboutsummaryrefslogtreecommitdiff
path: root/www/cgit.js
blob: 52a8c3c3e908959db7e5645c5b7a2cbd3a9ebc98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* cgit.js: javacript functions for cgit
 *
 * Copyright (C) 2006-2018 cgit Development Team <cgit@lists.zx2c4.com>
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

(function () {
  /* This follows the logic and suffixes used in ui-shared.c */

  var age_classes = ["age-mins", "age-hours", "age-days", "age-weeks", "age-months", "age-years"];
  var age_suffix = ["min.", "hours", "days", "weeks", "months", "years", "years"];
  var age_next = [
    60,
    3600,
    24 * 3600,
    7 * 24 * 3600,
    30 * 24 * 3600,
    365 * 24 * 3600,
    365 * 24 * 3600,
  ];
  var age_limit = [
    7200,
    24 * 7200,
    7 * 24 * 7200,
    30 * 24 * 7200,
    365 * 25 * 7200,
    365 * 25 * 7200,
  ];
  var update_next = [10, 5 * 60, 1800, 24 * 3600, 24 * 3600, 24 * 3600, 24 * 3600];

  function render_age(e, age) {
    var t, n;

    for (n = 0; n < age_classes.length; n++) if (age < age_limit[n]) break;

    t = Math.round(age / age_next[n]) + " " + age_suffix[n];

    if (e.textContent != t) {
      e.textContent = t;
      if (n == age_classes.length) n--;
      if (e.className != age_classes[n]) e.className = age_classes[n];
    }
  }

  function aging() {
    var n,
      next = 24 * 3600,
      now_ut = Math.round(new Date().getTime() / 1000);

    for (n = 0; n < age_classes.length; n++) {
      var m,
        elems = document.getElementsByClassName(age_classes[n]);

      if (elems.length && update_next[n] < next) next = update_next[n];

      for (m = 0; m < elems.length; m++) {
        var age = now_ut - elems[m].getAttribute("data-ut");

        render_age(elems[m], age);
      }
    }

    /*
     * We only need to come back when the age might have changed.
     * Eg, if everything is counted in hours already, once per
     * 5 minutes is accurate enough.
     */

    window.setTimeout(aging, next * 1000);
  }

  function wrap_tables() {
    const selectors = [
      "div#cgit table.list",
      "div#cgit table.blob",
      "div#cgit table.bin-blob",
      "div#cgit table.diff",
      "div#cgit table.ssdiff",
      "div#cgit table.commit-info",
    ];

    const tables = document.querySelectorAll(selectors.join(", "));

    tables.forEach((table) => {
      if (table.parentNode.classList.contains("scrollable")) {
        return;
      }

      const wrapper = document.createElement("div");
      wrapper.className = "scrollable";

      table.parentNode.insertBefore(wrapper, table);
      wrapper.appendChild(table);
    });
  }

  document.addEventListener(
    "DOMContentLoaded",
    function () {
      /* we can do the aging on DOM content load since no layout dependency */
      aging();
      wrap_tables();
    },
    false,
  );
})();