ChiliProject is not maintained anymore. Please be advised that there will be no more updates.
We do not recommend that you setup new ChiliProject instances and we urge all existing users to migrate their data to a maintained system, e.g. Redmine. We will provide a migration script later. In the meantime, you can use the instructions by Christian Daehn.
redmine_totals.user.js
1 | // ==UserScript==
|
---|---|
2 | // @id redmine_totals
|
3 | // @name Redmine Totals
|
4 | // @version 0.1
|
5 | // @namespace http://jamesarobertson.co.nz/
|
6 | // @author James Robertson
|
7 | // @description Redmine issue list totals
|
8 | // @run-at document-end
|
9 | // ==/UserScript==
|
10 | |
11 | function isDate(str) { |
12 | return !isNaN(Date.parse(str));
|
13 | } |
14 | |
15 | function isNumber(n) { |
16 | return !isNaN(parseFloat(n)) && isFinite(n);
|
17 | } |
18 | |
19 | function addRowValuesToTotals(row, totals) { |
20 | var cell_content;
|
21 | var cell_value;
|
22 | var cells = row.getElementsByTagName('td'); |
23 | for (var col_num=2; col_num<cells.length; col_num++) { |
24 | cell_content = cells[col_num].innerHTML; |
25 | if (!isDate(cell_content)) {
|
26 | cell_value = parseFloat(cell_content); |
27 | if (isNumber(cell_value)){
|
28 | if(!totals[col_num].total) {
|
29 | totals[col_num].total = 0;
|
30 | totals[col_num].group_total = 0;
|
31 | } |
32 | totals[col_num].total += cell_value; |
33 | totals[col_num].group_total += cell_value; |
34 | } |
35 | } |
36 | } |
37 | return totals;
|
38 | } |
39 | |
40 | function insertTotalsRow(table_body, totals, is_group_total, before_row) { |
41 | if(is_group_total==null) is_group_total = false; |
42 | |
43 | var totals_row = document.createElement('tr'); |
44 | |
45 | totals_row.style.textAlign = 'center';
|
46 | if (!is_group_total){
|
47 | totals_row.style.borderTop = "1px solid #CCCCCC";
|
48 | totals_row.style.fontWeight = 'bold';
|
49 | } |
50 | |
51 | var cell;
|
52 | for (var col_num=1; col_num<totals.length; col_num++){ |
53 | cell = document.createElement('td');
|
54 | if (col_num == 1) { |
55 | cell.colSpan = 2;
|
56 | if (is_group_total) {
|
57 | cell.innerHTML = ' ';
|
58 | } else {
|
59 | cell.innerHTML = 'Total';
|
60 | } |
61 | } else {
|
62 | if (totals[col_num].total){
|
63 | if(is_group_total) {
|
64 | cell.innerHTML = totals[col_num].group_total; |
65 | cell.style.borderTop = "1px solid #CCCCCC";
|
66 | } else {
|
67 | cell.innerHTML = totals[col_num].total; |
68 | } |
69 | } else {
|
70 | cell.innerHTML = ' ';
|
71 | } |
72 | } |
73 | totals_row.appendChild(cell); |
74 | } |
75 | if(before_row != null){ |
76 | table_body.insertBefore(totals_row, before_row); |
77 | } else {
|
78 | table_body.appendChild(totals_row); |
79 | } |
80 | } |
81 | |
82 | function main() { |
83 | var issues_table = document.getElementsByClassName('list issues')[0]; |
84 | if(!issues_table) return; |
85 | |
86 | var head_cells = issues_table.getElementsByTagName('th'); |
87 | var table_body = issues_table.getElementsByTagName('tbody')[0]; |
88 | var table_rows = table_body.getElementsByTagName('tr'); |
89 | |
90 | var totals = new Array(); |
91 | var has_groups = false; |
92 | var has_multiple_groups = false; |
93 | |
94 | for (var col_num=0; col_num<head_cells.length; col_num++) { |
95 | totals[col_num] = new Object();
|
96 | } |
97 | |
98 | for (var row_num=0; row_num<table_rows.length; row_num++) { |
99 | if(table_rows[row_num].className.indexOf('group') >= 0){ |
100 | if (!has_groups) {
|
101 | has_groups = true;
|
102 | } else {
|
103 | has_multiple_groups = true;
|
104 | insertTotalsRow(table_body, totals, true, table_rows[row_num]);
|
105 | for (var col_num=0; col_num<totals.length; col_num++){ |
106 | if (totals[col_num].total){
|
107 | totals[col_num].group_total = 0;
|
108 | } |
109 | } |
110 | row_num++; |
111 | } |
112 | } else {
|
113 | totals = addRowValuesToTotals(table_rows[row_num], totals); |
114 | } |
115 | } |
116 | |
117 | if (has_multiple_groups) {
|
118 | insertTotalsRow(table_body, totals, true);
|
119 | } |
120 | insertTotalsRow(table_body, totals); |
121 | } |
122 | |
123 | main(); |