Fri, 06 Feb 2026 18:44:47 +0100
add monthly summaries - resolves #699
| 5 | 1 | /* Copyright 2025 Mike Becker. All rights reserved. |
| 2 | * | |
| 3 | * Redistribution and use in source and binary forms, with or without | |
| 4 | * modification, are permitted provided that the following conditions are met: | |
| 5 | * | |
| 6 | * 1. Redistributions of source code must retain the above copyright | |
| 7 | * notice, this list of conditions and the following disclaimer. | |
| 8 | * | |
| 9 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer in the | |
| 11 | * documentation and/or other materials provided with the distribution. | |
| 12 | * | |
| 13 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| 14 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 16 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
| 17 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 18 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| 19 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| 20 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 21 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 22 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 23 | */ | |
| 24 | ||
| 25 | #include "html.h" | |
| 26 | ||
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
27 | #include <ranges> |
| 5 | 28 | #include <cstdio> |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
29 | #include <cassert> |
| 5 | 30 | |
| 13 | 31 | using namespace std::chrono; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
32 | |
| 5 | 33 | namespace html { |
| 7 | 34 | static constexpr const char* weekdays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; |
| 35 | ||
| 5 | 36 | static unsigned indentation; |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
37 | static const char *tabs = " "; |
| 5 | 38 | static void indent(int change = 0) { |
| 39 | indentation += change; | |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
40 | assert(indentation <= max_indentation); |
|
22
a9230f197e61
fix inconsistent use of tabs and spaces in indentation
Mike Becker <universe@uap-core.de>
parents:
20
diff
changeset
|
41 | fwrite(tabs, 4, indentation, stdout); |
| 5 | 42 | } |
| 43 | ||
| 44 | static std::string encode(const std::string &data) { | |
| 45 | std::string buffer; | |
| 46 | buffer.reserve(data.size()+16); | |
| 47 | for (const char &pos: data) { | |
| 48 | switch (pos) { | |
| 49 | case '&': | |
| 50 | buffer.append("&"); | |
| 51 | break; | |
| 52 | case '\"': | |
| 53 | buffer.append("""); | |
| 54 | break; | |
| 55 | case '\'': | |
| 56 | buffer.append("'"); | |
| 57 | break; | |
| 58 | case '<': | |
| 59 | buffer.append("<"); | |
| 60 | break; | |
| 61 | case '>': | |
| 62 | buffer.append(">"); | |
| 63 | break; | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
64 | case '#': |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
65 | buffer.append("#"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
66 | break; |
| 5 | 67 | default: |
| 68 | buffer.append(&pos, 1); | |
| 69 | break; | |
| 70 | } | |
| 71 | } | |
| 72 | return buffer; | |
| 73 | } | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
74 | |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
75 | static std::string escape_json(const std::string &raw) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
76 | using std::string_view_literals::operator ""sv; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
77 | auto replace_all = [](std::string str, char chr, std::string_view repl) static { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
78 | size_t pos = str.find(chr); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
79 | if (pos == std::string::npos) return str; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
80 | std::string result = std::move(str); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
81 | do { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
82 | result.replace(pos, 1, repl); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
83 | pos += repl.length(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
84 | } while ((pos = result.find(chr, pos)) != std::string::npos); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
85 | return result; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
86 | }; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
87 | return replace_all(replace_all(raw, '\\', "\\\\"), '\"', "\\\""sv); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
88 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
89 | |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
90 | static std::string build_tag_list(fm::tag_lists tags, bool hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
91 | std::string tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
92 | if (hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
93 | for (const auto &tags_vector: tags | std::views::values) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
94 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
95 | tags_json += escape_json(tag); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
96 | tags_json += ' '; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
97 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
98 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
99 | if (!tags_json.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
100 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
101 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
102 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
103 | tags_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
104 | for (const auto &[repo, tags_vector] : tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
105 | tags_json += "\"" + escape_json(repo) + "\":\""; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
106 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
107 | tags_json += escape_json(tag); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
108 | tags_json += ' '; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
109 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
110 | if (!tags_vector.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
111 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
112 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
113 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
114 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
115 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
116 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
117 | tags_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
118 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
119 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
120 | return tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
121 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
122 | |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
123 | static std::string build_tag_array(fm::tag_lists tags, bool hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
124 | std::string tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
125 | if (hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
126 | tags_json += '['; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
127 | for (const auto &tags_vector: tags | std::views::values) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
128 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
129 | tags_json += '"'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
130 | tags_json += escape_json(tag); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
131 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
132 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
133 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
134 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
135 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
136 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
137 | tags_json += ']'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
138 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
139 | tags_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
140 | for (const auto &[repo, tags_vector] : tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
141 | tags_json += "\"" + escape_json(repo) + "\":["; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
142 | for (const auto &tag: tags_vector) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
143 | tags_json += '"'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
144 | tags_json += escape_json(tag); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
145 | tags_json += "\","; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
146 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
147 | if (!tags_vector.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
148 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
149 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
150 | tags_json += "],"; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
151 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
152 | tags_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
153 | if (!tags.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
154 | tags_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
155 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
156 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
157 | return tags_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
158 | } |
| 5 | 159 | } |
| 160 | ||
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
161 | void html::styles_and_script() { |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
162 | puts(R"( <style> |
| 5 | 163 | table.heatmap { |
| 164 | table-layout: fixed; | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
165 | border-collapse: separate; |
|
62
89b12ef5e190
improve visuals of the new design
Mike Becker <universe@uap-core.de>
parents:
61
diff
changeset
|
166 | border-spacing: 2px; |
| 5 | 167 | font-family: sans-serif; |
| 168 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
169 | |
| 5 | 170 | table.heatmap td, table.heatmap th { |
| 171 | text-align: center; | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
172 | font-size: 0.75rem; |
|
63
9ed068855450
further improve design by tweaking the borders
Mike Becker <universe@uap-core.de>
parents:
62
diff
changeset
|
173 | border: solid 4px transparent; |
|
9ed068855450
further improve design by tweaking the borders
Mike Becker <universe@uap-core.de>
parents:
62
diff
changeset
|
174 | border-radius: 3px; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
175 | height: 1rem; |
| 5 | 176 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
177 | |
| 5 | 178 | table.heatmap td { |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
179 | width: 1rem; |
| 5 | 180 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
181 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
182 | table.heatmap td:hover, table.heatmap td.popup-open { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
183 | filter: hue-rotate(90deg); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
184 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
185 | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
186 | table.heatmap th:hover[data-total], table.heatmap th.popup-open { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
187 | background-color: #B3E7F2; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
188 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
189 | |
| 5 | 190 | table.heatmap td.out-of-range { |
| 191 | background-color: gray; | |
| 192 | } | |
| 7 | 193 | |
| 194 | table.heatmap td.zero-commits { | |
|
62
89b12ef5e190
improve visuals of the new design
Mike Becker <universe@uap-core.de>
parents:
61
diff
changeset
|
195 | background-color: #E3E3E3; |
| 7 | 196 | } |
| 197 | ||
| 198 | table.heatmap td.one-commit { | |
| 199 | background-color: #80E7A0; | |
| 200 | } | |
| 201 | ||
| 202 | table.heatmap td.up-to-5-commits { | |
| 203 | background-color: #30D350; | |
| 204 | } | |
| 205 | ||
| 206 | table.heatmap td.up-to-10-commits { | |
| 207 | background-color: #00BF00; | |
| 208 | } | |
| 209 | ||
| 210 | table.heatmap td.up-to-20-commits { | |
| 211 | background-color: #00A300; | |
| 212 | } | |
| 213 | ||
| 214 | table.heatmap td.commit-spam { | |
| 215 | background-color: #008000; | |
| 216 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
217 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
218 | table.heatmap td[data-tags]:not([data-tags=""]) { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
219 | border-color: gold; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
220 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
221 | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
222 | /* Popup styles */ |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
223 | .commit-popup { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
224 | position: absolute; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
225 | background-color: #fff; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
226 | border: 1px solid #ccc; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
227 | border-radius: 4px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
228 | box-shadow: 0 2px 10px rgba(0,0,0,0.2); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
229 | padding: .2rem; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
230 | z-index: 1000; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
231 | width: 40ch; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
232 | font-family: sans-serif; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
233 | font-size: smaller; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
234 | display: none; |
|
58
f1093b290fbf
allow long words to break in the commit-popup - fixes #697
Mike Becker <universe@uap-core.de>
parents:
56
diff
changeset
|
235 | word-wrap: break-word; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
236 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
237 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
238 | .commit-popup h3 { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
239 | margin-top: 0; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
240 | border-bottom: 1px solid #eee; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
241 | padding-bottom: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
242 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
243 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
244 | .commit-popup h4 { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
245 | margin-top: .5em; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
246 | margin-bottom: .5em; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
247 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
248 | |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
249 | .commit-popup h5 { |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
250 | margin-top: 0; |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
251 | } |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
252 | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
253 | .commit-popup ul { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
254 | margin: 0; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
255 | padding-left: 20px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
256 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
257 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
258 | .commit-popup li { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
259 | margin-bottom: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
260 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
261 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
262 | .commit-popup .close-btn { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
263 | position: absolute; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
264 | top: 5px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
265 | right: 8px; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
266 | cursor: pointer; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
267 | font-weight: bold; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
268 | } |
| 5 | 269 | </style> |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
270 | <script> |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
271 | document.addEventListener('DOMContentLoaded', function() { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
272 | // Create popup element |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
273 | const popup = document.createElement('div'); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
274 | popup.className = 'commit-popup'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
275 | document.body.appendChild(popup); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
276 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
277 | // Add click event listeners to all commit cells |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
278 | const cells = document.querySelectorAll('table.heatmap td:not(.out-of-range, .zero-commits), table.heatmap th:not(.zero-commits)'); |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
279 | cells.forEach(cell => { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
280 | cell.addEventListener('click', function(e) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
281 | const date = this.dataset.date; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
282 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
283 | // Create popup content |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
284 | let content = '<span class="close-btn">×</span>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
285 | if (date === undefined) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
286 | // monthly summary |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
287 | const total_commits = this.dataset.total; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
288 | content += `<h3>Total: ${total_commits} commit${total_commits !== 1 ? 's' : ''}</h3>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
289 | if (this.dataset.commits === undefined) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
290 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : []; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
291 | if (tags.length === 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
292 | content += 'No tags.'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
293 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
294 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
295 | tags.forEach(tag => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
296 | content += `<li>${tag}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
297 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
298 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
299 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
300 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
301 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
302 | const commits = JSON.parse(this.dataset.commits); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
303 | const repos = Object.keys(commits).sort(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
304 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : {}; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
305 | for (const repo of repos) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
306 | content += `<li>${repo} (${commits[repo]} commit${commits[repo] !== 1 ? 's' : ''})</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
307 | if (tags[repo] && tags[repo].length > 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
308 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
309 | tags[repo].forEach(tag => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
310 | content += `<li>${tag}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
311 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
312 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
313 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
314 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
315 | content += '</ul>'; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
316 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
317 | } else { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
318 | const summaries = JSON.parse(this.dataset.summaries); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
319 | if (Array.isArray(summaries)) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
320 | const summaries = this.dataset.summaries ? JSON.parse(this.dataset.summaries) : undefined; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
321 | content += `<h3>${date}: ${summaries.length} commit${summaries.length !== 1 ? 's' : ''}</h3>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
322 | if (this.dataset.tags) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
323 | content += `<h5>Tags: ${this.dataset.tags}</h5>`; |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
324 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
325 | content += '<ul>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
326 | summaries.forEach(summary => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
327 | content += `<li>${summary}</li>`; |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
328 | }); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
329 | content += '</ul>'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
330 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
331 | const repos = Object.keys(summaries).sort(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
332 | const tags = this.dataset.tags ? JSON.parse(this.dataset.tags) : {}; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
333 | const total_commits = this.dataset.total; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
334 | content += `<h3>${date}: ${total_commits} commit${total_commits !== 1 ? 's' : ''}</h3>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
335 | for (const repo of repos) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
336 | const commits = summaries[repo]; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
337 | if (repos.length > 1) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
338 | content += `<h4>${repo} (${commits.length} commit${commits.length !== 1 ? 's' : ''})</h4>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
339 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
340 | content += `<h4>${repo}</h4>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
341 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
342 | if (tags[repo]) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
343 | content += `<h5>Tags: ${tags[repo]}</h5>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
344 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
345 | content += '<ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
346 | commits.forEach(commit => { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
347 | content += `<li>${commit}</li>`; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
348 | }); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
349 | content += '</ul>'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
350 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
351 | } |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
352 | } |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
353 | popup.innerHTML = content; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
354 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
355 | // Position popup near the cell |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
356 | const rect = this.getBoundingClientRect(); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
357 | popup.style.left = rect.left + window.scrollX + 'px'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
358 | popup.style.top = (rect.bottom + window.scrollY + 5) + 'px'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
359 | popup.style.display = 'block'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
360 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
361 | // Highlight the cell to which the popup belongs |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
362 | document.querySelectorAll('table.heatmap .popup-open').forEach(old_cell => { |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
363 | old_cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
364 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
365 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
366 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
367 | // Add close button handler |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
368 | const closeBtn = popup.querySelector('.close-btn'); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
369 | if (closeBtn) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
370 | closeBtn.addEventListener('click', function() { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
371 | popup.style.display = 'none'; |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
372 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
373 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
374 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
375 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
376 | e.stopPropagation(); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
377 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
378 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
379 | |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
380 | // Close popup when clicking elsewhere |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
381 | document.addEventListener('click', function(e) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
382 | if (!popup.contains(e.target)) { |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
383 | popup.style.display = 'none'; |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
384 | document.querySelectorAll('table.heatmap .popup-open').forEach(cell => { |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
385 | cell.classList.toggle("popup-open"); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
386 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
387 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
388 | }); |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
389 | }); |
|
73
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
390 | </script>)"); |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
391 | } |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
392 | |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
393 | void html::open(bool fragment, unsigned char fragment_indent) { |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
394 | if (fragment) { |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
395 | indent(fragment_indent); |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
396 | puts("<div class=\"heatmap-content\">"); |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
397 | indentation++; |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
398 | } else { |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
399 | puts(R"(<!DOCTYPE html> |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
400 | <html> |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
401 | <head> |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
402 | <meta charset="UTF-8">)"); |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
403 | styles_and_script(); |
|
707f42bb0484
add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents:
71
diff
changeset
|
404 | puts(R"( </head> |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
405 | <body> |
|
41
19cc90878968
fix wrong escape in raw string
Mike Becker <universe@uap-core.de>
parents:
35
diff
changeset
|
406 | <div class="heatmap-content">)"); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
407 | indentation = 3; |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
408 | } |
| 5 | 409 | } |
| 410 | ||
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
411 | void html::close(bool fragment) { |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
412 | if (fragment) { |
|
52
e9edc3bd0301
add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
413 | indent(-1); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
414 | puts("</div>"); |
|
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
415 | } else { |
|
22
a9230f197e61
fix inconsistent use of tabs and spaces in indentation
Mike Becker <universe@uap-core.de>
parents:
20
diff
changeset
|
416 | puts(" </div>\n </body>\n</html>"); |
|
20
8639ccd855ba
implement --fragment option
Mike Becker <universe@uap-core.de>
parents:
15
diff
changeset
|
417 | } |
| 5 | 418 | } |
| 419 | ||
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
420 | void html::chart_begin(const std::string& repo, const std::string& author) { |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
421 | indent(); |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
422 | printf("<div class=\"chart\" data-repo=\"%s\" data-author=\"%s\">\n", |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
423 | encode(repo).c_str(), encode(author).c_str()); |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
424 | indentation++; |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
425 | } |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
426 | |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
427 | void html::chart_end() { |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
428 | indent(-1); |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
429 | puts("</div>"); |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
430 | } |
|
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
431 | |
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
432 | void html::heading_repo(const std::string& repo) { |
| 5 | 433 | indent(); |
|
50
1ebab6df60c2
fix mix of positional and non-positional printf specifiers
Mike Becker <universe@uap-core.de>
parents:
46
diff
changeset
|
434 | printf("<h1 data-repo=\"%1$s\">%1$s</h1>\n", encode(repo).c_str()); |
| 5 | 435 | } |
| 436 | ||
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
437 | void html::heading_author(const std::string& author, unsigned int total_commits) { |
| 5 | 438 | indent(); |
|
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
439 | printf("<h2 title=\"Total commits: %u\">%s</h2>\n", |
|
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
440 | total_commits, |
|
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
42
diff
changeset
|
441 | encode(author).c_str()); |
| 5 | 442 | } |
| 443 | ||
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
444 | void html::table_begin(year y, bool hide_repo_names, const std::array<fm::commit_summary, 12> &commits_per_month) { |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
445 | static constexpr const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
446 | // compute the column spans, first |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
447 | unsigned colspans[12] = {}; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
448 | { |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
449 | unsigned total_cols = 0; |
| 13 | 450 | sys_days day{year_month_day{y, January, 1d}}; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
451 | for (unsigned col = 0; col < 12; ++col) { |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
452 | while (total_cols < columns && year_month_day{day}.month() <= month{col + 1}) { |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
453 | ++total_cols; |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
454 | ++colspans[col]; |
| 13 | 455 | day += days{7}; |
|
6
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
456 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
457 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
458 | } |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
459 | |
|
1040ba37d4c9
improve alignment of month headers
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
460 | // now render the table heading |
| 5 | 461 | indent(); |
| 462 | puts("<table class=\"heatmap\">"); | |
| 463 | indent(1); | |
| 464 | puts("<tr>"); | |
| 465 | indent(1); | |
| 466 | puts("<th></th>"); | |
| 467 | for (unsigned i = 0 ; i < 12 ; i++) { | |
| 468 | indent(); | |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
469 | const fm::commit_summary &summary = commits_per_month[i]; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
470 | const unsigned total = summary.count(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
471 | if (total > 0) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
472 | std::string commit_summary; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
473 | if (!hide_repo_names) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
474 | std::string commit_summary_json; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
475 | commit_summary_json += '{'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
476 | for (const auto &[repo, count] : summary.commits) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
477 | commit_summary_json += std::format("\"{}\": {},", escape_json(repo), count); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
478 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
479 | if (!summary.commits.empty()) { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
480 | commit_summary_json.pop_back(); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
481 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
482 | commit_summary_json += '}'; |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
483 | commit_summary = std::format("data-commits=\"{}\"", encode(commit_summary_json)); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
484 | } |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
485 | std::string tags = build_tag_array(summary.tags_with_date, hide_repo_names); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
486 | printf("<th scope=\"col\" title=\"Total commits: %u\" colspan=\"%d\" data-total=\"%u\" %s data-tags=\"%s\">%s</th>\n", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
487 | total, colspans[i], total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
488 | commit_summary.c_str(), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
489 | encode(tags).c_str(), months[i]); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
490 | } else { |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
491 | printf("<th scope=\"col\" class=\"zero-commits\" colspan=\"%d\">%s</th>\n", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
492 | colspans[i], months[i]); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
493 | } |
| 5 | 494 | } |
| 495 | indent(-1); | |
| 496 | puts("</tr>"); | |
| 497 | } | |
| 498 | ||
| 499 | void html::table_end() { | |
|
46
7e099403e5b0
make charts identifiable with a query - fixes #608
Mike Becker <universe@uap-core.de>
parents:
44
diff
changeset
|
500 | indent(-1); |
| 5 | 501 | puts("</table>"); |
| 502 | } | |
| 503 | ||
| 504 | void html::row_begin(unsigned int row) { | |
| 505 | indent(); | |
| 506 | puts("<tr>"); | |
| 507 | indent(1); | |
| 508 | printf("<th scope=\"row\">%s</th>\n", weekdays[row]); | |
| 509 | } | |
| 510 | ||
| 511 | void html::row_end() { | |
| 512 | indent(-1); | |
| 513 | puts("</tr>"); | |
| 514 | } | |
| 515 | ||
| 516 | void html::cell_out_of_range() { | |
| 517 | indent(); | |
| 518 | puts("<td class=\"out-of-range\"></td>"); | |
| 519 | } | |
| 520 | ||
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
521 | void html::cell(year_month_day ymd, bool hide_repo_names, const fm::commits &commits) { |
| 7 | 522 | const char *color_class; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
523 | if (commits.count() == 0) { |
| 7 | 524 | color_class = "zero-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
525 | } else if (commits.count() == 1) { |
| 7 | 526 | color_class = "one-commit"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
527 | } else if (commits.count() <= 5) { |
| 7 | 528 | color_class = "up-to-5-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
529 | } else if (commits.count() <= 10) { |
| 7 | 530 | color_class = "up-to-10-commits"; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
531 | } else if (commits.count() <= 20) { |
| 7 | 532 | color_class = "up-to-20-commits"; |
| 533 | } else { | |
| 534 | color_class = "commit-spam"; | |
| 535 | } | |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
536 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
537 | // Build a JSON object of commit summaries |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
538 | auto add_summaries = [](std::string &json, const std::vector<std::string> &summaries) static { |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
539 | // We have to iterate in reverse order to sort the summaries chronologically |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
540 | for (const auto &summary : summaries | std::views::reverse) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
541 | json += "\"" + escape_json(summary) + "\","; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
542 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
543 | json.pop_back(); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
544 | }; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
545 | std::string summaries_json; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
546 | if (hide_repo_names) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
547 | summaries_json += '['; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
548 | for (const auto &summaries: commits.summaries | std::views::values) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
549 | add_summaries(summaries_json, summaries); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
550 | } |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
551 | summaries_json += ']'; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
552 | } else { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
553 | summaries_json += '{'; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
554 | for (const auto &[repo, summaries] : commits.summaries) { |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
555 | summaries_json += "\"" + escape_json(repo) + "\":["; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
556 | add_summaries(summaries_json, summaries); |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
557 | summaries_json += "],"; |
|
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
558 | } |
|
60
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
559 | if (!commits.summaries.empty()) { |
|
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
560 | summaries_json.pop_back(); |
|
9b1cbc665851
fix malformed JSON on days without commits in the combined view
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
561 | } |
|
56
3d2720f95cfb
fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents:
54
diff
changeset
|
562 | summaries_json += '}'; |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
563 | } |
|
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
564 | |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
565 | // Build a JSON object of tags |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
566 | std::string tags_json = build_tag_list(commits.tags, hide_repo_names); |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
567 | |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
568 | // Output |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
569 | std::string date_str = std::format("{}, {}-{:02d}-{:02d}", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
570 | weekdays[weekday(ymd).iso_encoding() - 1], |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
571 | static_cast<int>(ymd.year()), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
572 | static_cast<unsigned>(ymd.month()), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
573 | static_cast<unsigned>(ymd.day())); |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
574 | const unsigned total = commits.count(); |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
575 | indent(); |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
576 | printf("<td class=\"%s\" title=\"%s: %u %s\" data-total=\"%u\" data-date=\"%s\" data-summaries=\"%s\" data-tags=\"%s\"></td>\n", |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
577 | color_class, |
|
75
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
578 | date_str.c_str(), |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
579 | total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
580 | total == 1 ? "commit" : "commits", |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
581 | total, |
|
857af79337d5
add monthly summaries - resolves #699
Mike Becker <universe@uap-core.de>
parents:
73
diff
changeset
|
582 | date_str.c_str(), |
|
61
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
583 | encode(summaries_json).c_str(), |
|
d77763d2fdda
highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents:
60
diff
changeset
|
584 | encode(tags_json).c_str() |
|
54
586dcd606e47
add popups with commit summaries - resolves #644
Mike Becker <universe@uap-core.de>
parents:
52
diff
changeset
|
585 | ); |
| 5 | 586 | } |