Improve Mantis

To customize and improve our a2w-mantis

当前为 2014-11-10 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Improve Mantis
  3. // @namespace com.aforms2web.ds.ujs
  4. // @description To customize and improve our a2w-mantis
  5. // @include http*://tasks.aforms2web.com/view_all_bug_page.php*
  6. // @author dietmar.stoiber@aforms2web.com
  7. // @version 1.1
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11.  
  12. // Config Begin
  13.  
  14. var countSelection = true;
  15.  
  16. var xForCurIterationCommit = true;
  17. var xForCurIterationCommitStyle = "padding-left: 1em; font-size: 1.5em; font-weight: smaller; color:#333333;";
  18.  
  19. var grayNotCurrentlyCommited = true;
  20. var grayNotCurrentlyCommitedAll = "font-style: italic; color: #555555";
  21. var grayNotCurrentlyCommitedLinks = "color: #555555"
  22.  
  23. var redDeadline = true;
  24. var redDeadlineStyle ="font-weight: bold; color: #dd0000; text-decoration: underline;";
  25.  
  26. var activateFixedTime = true;
  27. var activateFixedTimeShowByDefault = true;
  28. var activateFixedTimeStyle = "border: 1px solid #646474; border-top-width: 0; border-radius: 0 0 5px 5px; background-color: #c8c8e8; position: fixed; top: 0; padding: 0 3px";
  29.  
  30. var selectionOfAllCommited = true;
  31. var selectionOfAllCommitedExceptWaiting = true;
  32.  
  33. // Config End
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. var iterationColNr = null;
  45. var deadlineColNr = null;
  46. var commitmentColNr = null;
  47. var stateColNr = null;
  48.  
  49. var hourColNrs = null;
  50. var hourColSum = null;
  51. var hourColTot = null;
  52.  
  53. var fixedTimeIsDisplayed = false;
  54. init();
  55.  
  56. function init(){
  57. var header = document.getElementsByClassName("row-category")[0];
  58. for(var h = 0; h < header.cells.length; h++){
  59. var curHeaderCell = header.cells[h];
  60. var colLinks = curHeaderCell.getElementsByTagName("a");
  61. if(colLinks.length > 0){
  62. var linkLabel = colLinks[0].innerHTML;
  63. if("Zieltermin" == linkLabel){ deadlineColNr = h; }
  64. if("Zieliteration" == linkLabel){ iterationColNr = h; }
  65. if("Status" == linkLabel){ stateColNr = h; }
  66. if("Commitment in" == linkLabel){
  67. commitmentColNr = h;
  68. colLinks[0].setAttribute("style", "white-space: nowrap;");
  69. }
  70. var pos = linkLabel.search(/.+\sh$/);
  71. if(pos > -1){
  72. if(hourColNrs == null){
  73. hourColNrs = new Array();
  74. hourColSum = new Array();
  75. hourColTot = new Array();
  76. }
  77. var nextIndex = hourColNrs.length;
  78. hourColNrs[nextIndex] = h;
  79. hourColSum[nextIndex] = 0;
  80. var matchTime = curHeaderCell.innerHTML.match(/\((.*)\)$/);
  81. if(countSelection && matchTime){
  82. curHeaderCell.innerHTML =
  83. curHeaderCell.innerHTML.substring(0, curHeaderCell.innerHTML.length - RegExp.$1.length - 2) +
  84. "<span id=\"timeOf" + h + "\" style=\"white-space: nowrap; font-weight: normal;\"><span id=\"selectOf" + h + "\">0</span> / " + RegExp.$1 + "</span>";
  85. hourColTot[nextIndex] = RegExp.$1;
  86. }
  87. colLinks[0].setAttribute("style", "white-space: nowrap;");
  88. }
  89. }
  90. }
  91. if(selectionOfAllCommited){
  92. var selectAllCommits = document.createElement("span");
  93. selectAllCommits.addEventListener ('click', selectAllCommited, true);
  94. selectAllCommits.setAttribute("title", "alle commiteten Tickets selektieren");
  95. selectAllCommits.setAttribute("style", "font-weight: normal; cursor: pointer;");
  96. selectAllCommits.innerHTML = "[x]";
  97. header.cells[0].removeChild(header.cells[0].firstChild);
  98. header.cells[0].appendChild(selectAllCommits);
  99. }
  100.  
  101. var table = document.getElementById("buglist");
  102. for(var r = 0; r < table.rows.length; r++){
  103. var row = table.rows[r];
  104. if(row.getAttribute("bgcolor") != null && row.getAttribute("valign") == "top" && row.getAttribute("border") == "1"){
  105. format(row);
  106. if(countSelection){
  107. var chkbxs = row.getElementsByTagName("input");
  108. for(var i = 0; i < chkbxs.length; i++){
  109. var chkbx = chkbxs[i];
  110. if(chkbx.getAttribute("name") == "bug_arr[]" && chkbx.getAttribute("type") == "checkbox"){
  111. chkbx.addEventListener ('change', changedChkbx, true);
  112. }
  113. }
  114. }
  115. }
  116. }
  117.  
  118. if(countSelection){
  119. var allBugs = document.getElementsByName("all_bugs");
  120. if(allBugs != null && allBugs.length >= 1){
  121. allBugs[0].addEventListener ('change', recalculateChkbxs, true);
  122. }
  123. }
  124.  
  125. if(activateFixedTime){
  126. var showFixed = document.createElement("span");
  127. showFixed.addEventListener ('click', showFixedTime, true);
  128. showFixed.id = "showFixedTime";
  129. showFixed.innerHTML = "Fix positionierte Zeitanzeige aktivieren";
  130. document.body.appendChild(showFixed);
  131. var hideFixed = document.createElement("span");
  132. hideFixed.setAttribute("style", "display: none;");
  133. hideFixed.addEventListener ('click', hideFixedTime, true);
  134. hideFixed.id = "hideFixedTime";
  135. hideFixed.innerHTML = "Fix positionierte Zeitanzeige deaktivieren";
  136. document.body.insertBefore(hideFixed, document.body.firstChild);
  137. var style = document.createElement("style");
  138. style.appendChild(document.createTextNode(""));// WebKit hack
  139. document.head.appendChild(style);
  140. var sheet = style.sheet;
  141. sheet.insertRule(".fixedTime { " + activateFixedTimeStyle + " }", 0);
  142. sheet.insertRule("#showFixedTime, #hideFixedTime { text-decoration: underline; cursor: pointer; }", 0);
  143.  
  144. if(activateFixedTimeShowByDefault){
  145. showFixedTime();
  146. }
  147. }
  148. }
  149.  
  150. function showFixedTime(){
  151. document.getElementById("showFixedTime").setAttribute("style", "display: none;");
  152. document.getElementById("hideFixedTime").setAttribute("style", "display: inline;");
  153. for(i = 0; i < hourColNrs.length; i++){
  154. var newFixed = document.createElement("span");
  155. newFixed.setAttribute ("class", "fixedTime");
  156. newFixed.id = "fixedTime" + hourColNrs[i];
  157. newFixed.innerHTML = "x";
  158. document.body.appendChild(newFixed);
  159. }
  160. fixedTimeIsDisplayed = true;
  161. updateFixedTime();
  162. }
  163.  
  164. function updateFixedTime(){
  165. if(fixedTimeIsDisplayed){
  166. var source; var target;
  167. for(i = 0; i < hourColNrs.length; i++){
  168. source = document.getElementById("timeOf" + hourColNrs[i]);
  169. target = document.getElementById("fixedTime" + hourColNrs[i]);
  170. target.innerHTML = source.innerHTML.replace(/<(?:.|\n)*?>/gm, '');
  171. var rect = source.getBoundingClientRect();
  172. target.setAttribute("style", "left: " + rect.left + "px; width: " + (rect.right-rect.left) + "px;");
  173. }
  174. }
  175. }
  176.  
  177. function hideFixedTime(){
  178. document.getElementById("showFixedTime").setAttribute("style", "display: inline;");
  179. document.getElementById("hideFixedTime").setAttribute("style", "display: none;");
  180. var rmv;
  181. for(i = 0; i < hourColNrs.length; i++){
  182. rmv = document.getElementById("fixedTime" + hourColNrs[i]);
  183. rmv.parentNode.removeChild(rmv);
  184. }
  185. fixedTimeIsDisplayed = false;
  186. }
  187.  
  188. function format(row){
  189. if(deadlineColNr != null && row.cells.length >= deadlineColNr + 1){
  190. var deadline = row.cells[deadlineColNr].innerHTML;
  191. if(redDeadline && deadline != null && deadline != ""){
  192. row.cells[deadlineColNr].setAttribute("style", redDeadlineStyle);
  193. }
  194. }
  195. if(iterationColNr != null && row.cells.length >= iterationColNr + 1 && commitmentColNr != null && row.cells.length >= commitmentColNr + 1){
  196. var iterationat = row.cells[iterationColNr].innerHTML;
  197. var commitment = row.cells[commitmentColNr].innerHTML;
  198. if(grayNotCurrentlyCommited && iterationat != null && iterationat != "" && commitment != null && commitment != "" && iterationat != commitment){
  199. row.setAttribute("style", grayNotCurrentlyCommitedAll);
  200. for(c = 0; c < row.cells.length; c++){
  201. var links = row.cells[c].getElementsByTagName("a");
  202. for(var a = 0; a < links.length; a++){
  203. links[a].setAttribute("style", grayNotCurrentlyCommitedLinks);
  204. }
  205. }
  206. }else if(xForCurIterationCommit && iterationat != null && iterationat != "" && commitment != null && commitment != "" && iterationat == commitment){
  207. row.cells[commitmentColNr].innerHTML = "<div style=\"" + xForCurIterationCommitStyle + "\">x</div>";
  208. }
  209. }
  210. }
  211.  
  212. function changedChkbx(event) {
  213. event = event || window.event
  214. var target = event.target;
  215. var parRow = target;
  216. while(parRow.nodeName != "TR" && parRow.parentNode != null){
  217. parRow = parRow.parentNode
  218. }
  219. calculateChangedChkbx(parRow, target);
  220. }
  221.  
  222. function calculateChangedChkbx(row, checkbox) {
  223. var curVal;
  224. var sumVal;
  225. var curObj;
  226. var display;
  227. for(i = 0; i < hourColNrs.length; i++){
  228. curVal = row.cells[hourColNrs[i]].innerHTML;
  229. sumVal = hourColSum[i];
  230. if(checkbox.checked){
  231. sumVal = Number(sumVal) + Number(curVal);
  232. }else{
  233. sumVal = sumVal - Number(curVal);
  234. }
  235. display = 0;
  236. if(sumVal > 0){
  237. hourColSum[i] = sumVal.toFixed(2);
  238. display = sumVal.toFixed(2);
  239. if(display != 0){
  240. display = display.replace(/0+$/, "").replace(/\.$/, "");
  241. }
  242. }else{
  243. hourColSum[i] = 0;
  244. }
  245. curObj = document.getElementById("selectOf" + hourColNrs[i]).innerHTML = display;
  246. }
  247. updateFixedTime();
  248. }
  249.  
  250. function recalculateChkbxs() {
  251. var checked = false;
  252. var display;
  253. var allBugs = document.getElementsByName("all_bugs");
  254. if(allBugs != null && allBugs.length >= 1){
  255. checked = allBugs[0].checked;
  256. }
  257. for(i = 0; i < hourColNrs.length; i++){
  258. if(checked){
  259. hourColSum[i] = hourColTot[i];
  260. display = hourColSum[i].replace(/0+$/, "").replace(/\.$/, "");
  261. }else{
  262. hourColSum[i] = 0;
  263. display = 0;
  264. }
  265. document.getElementById("selectOf" + hourColNrs[i]).innerHTML = display;
  266. }
  267. updateFixedTime();
  268. }
  269.  
  270. function selectAllCommited(){
  271. var allBugs = document.getElementsByName("all_bugs");
  272. if(allBugs != null && allBugs.length >= 1){
  273. allBugs[0].checked = false;
  274. }
  275. for(i = 0; i < hourColNrs.length; i++){
  276. hourColSum[i] = 0;
  277. display = 0;
  278. document.getElementById("selectOf" + hourColNrs[i]).innerHTML = display;
  279. }
  280. var table = document.getElementById("buglist");
  281. var iteration;
  282. var commitment;
  283. var checkbox;
  284. var curState
  285. for(var r = 0; r < table.rows.length; r++){
  286. var row = table.rows[r];
  287. if(row.getAttribute("bgcolor") != null && row.getAttribute("valign") == "top" && row.getAttribute("border") == "1"){
  288. if(iterationColNr != null && commitmentColNr != null && row.cells.length >= commitmentColNr + 1){
  289. iteration = row.cells[iterationColNr].innerHTML;
  290. commitment = row.cells[commitmentColNr].innerHTML;
  291. checkbox = row.getElementsByTagName("input");
  292. if(checkbox.length > 0){
  293. checkbox[0].checked = false;
  294. if(iteration != null && iteration != "" && commitment != null && commitment != "" && (iteration == commitment || commitment.indexOf(">x<") > 0)){
  295. if(!selectionOfAllCommitedExceptWaiting || "Warten" != row.cells[stateColNr].getElementsByTagName("span")[0].innerHTML){
  296. checkbox[0].checked = true;
  297. calculateChangedChkbx(row, checkbox[0]);
  298. }
  299. }
  300. }
  301. }
  302. }
  303. }
  304.  
  305.  
  306.  
  307.  
  308. }