Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. (function(){
  2.  
  3. function openEffortEntry(taskId, cb) {
  4. getFrame('Submit').location.href = '/usr/submit/Effort.asp?cmd=submit&tid=' + taskId;
  5. setTimeout(cb, 1000);
  6. }
  7.  
  8. function fillEffort(taskId, date, log, cb) {
  9. openEffortEntry(taskId, function() {
  10. var DRDate = toDRDate(date);
  11. var docAll = getFrame('Submit').document.all;
  12. var startEl = docAll.Start;
  13. startEl.previousElementSibling.checked = true;
  14. docAll.End.value = DRDate;
  15. startEl.value = DRDate;
  16. docAll.W1004.value = log.hours;
  17. docAll.A1004.value = log.desc;
  18. cb();
  19. });
  20. }
  21.  
  22. function submitEffort(taskId, date, log, cb) {
  23. fillEffort(taskId, date, log, function() {
  24. getFrame('Submit').document.all.SubmitForm.submit();
  25. setTimeout(cb, 1000);
  26. });
  27. }
  28.  
  29. function submitNextEffort(dateEntries) {
  30. var first = dateEntries[0];
  31. if (first) {
  32. var log = first.entries.shift();
  33. var next = function() {
  34. submitNextEffort(dateEntries);
  35. };
  36. if (log) {
  37. submitEffort(getTaskId(), first.date, log, next);
  38. } else {
  39. dateEntries.shift();
  40. next();
  41. }
  42. } else {
  43. console.log('finished');
  44. }
  45. }
  46.  
  47. function getLogEntries(log, options) {
  48. if (options.groupIssues) {
  49. return [{
  50. desc: reduceLogDesc(log, options.showParent),
  51. hours: reduceLogHours(log)
  52. }];
  53. } else {
  54. return log.map(function(entry) {
  55. return {
  56. desc: getLogEntryIssue(entry, options.showParent),
  57. hours: entry.hours
  58. }
  59. });
  60. }
  61. }
  62.  
  63. function displayTimesheet(data, options) {
  64. var html = '<label title="Group by date"><input type=checkbox name=group> Group</label> \u00A0 <label title="Show story instead of a sub-task"><input type=checkbox name=parent>Show parent</label>';
  65. html += '<table border=1 style="margin:0 auto 10px auto">';
  66. html += '<tr><th><input type=checkbox name=toggleAll checked></th><th>Date</th><th>Tasks</th><th>Hours</th></tr>';
  67. var dates = Object.keys(data);
  68. dates.sort();
  69. var allEntries = dates.map(function(date) {
  70. return {
  71. date: date,
  72. entries: getLogEntries(data[date], options)
  73. };
  74. });
  75. allEntries.forEach(function(dateEntries) {
  76. var date = dateEntries.date;
  77. dateEntries.entries.forEach(function(entry, i) {
  78. html += '<tr><td><input type=checkbox checked data-date="' + date + '" data-entrynum=' + i + '></td><td>' + toDRDate(date) + '</td><td>' +
  79. entry.desc + '</td><td>' + entry.hours + '</td></tr>\n';
  80. });
  81. });
  82. html += '</table><span class="dr_close" style="text-decoration:underline;margin-right:10px">close</span><input type="button" value=Submit>';
  83. var doc = getFrame('Submit').document;
  84. var body = doc.body;
  85. var timeSheetCt = doc.createElement('div');
  86. timeSheetCt.style.margin = '0 0 20px';
  87. timeSheetCt.style.textAlign = 'center';
  88. timeSheetCt.innerHTML = html;
  89. // toggle checkboxes
  90. var toggleCheckbox = timeSheetCt.querySelector('th input[name=toggleAll]');
  91. var groupCheckbox = timeSheetCt.querySelector('input[name=group]');
  92. var parentCheckbox = timeSheetCt.querySelector('input[name=parent]');
  93. toggleCheckbox.onchange = function() {
  94. toArr(timeSheetCt.querySelectorAll('td input')).forEach(function(node) {
  95. node.checked = toggleCheckbox.checked;
  96. });
  97. };
  98. function close() {
  99. timeSheetCt.parentNode.removeChild(timeSheetCt);
  100. }
  101. function syncOptions(node, key) {
  102. node.checked = options[key];
  103. node.onchange = function() {
  104. options[key] = node.checked;
  105. close();
  106. displayTimesheet(data, options);
  107. };
  108. }
  109. syncOptions(groupCheckbox, 'groupIssues');
  110. syncOptions(parentCheckbox, 'showParent');
  111.  
  112. // remove button
  113. timeSheetCt.querySelector('.dr_close').onclick = close;
  114. // submit button
  115. timeSheetCt.querySelector('input[value="Submit"]').onclick = function() {
  116. var toRemove = {};
  117. toArr(timeSheetCt.querySelectorAll('input[data-date]:not(:checked)')).forEach(function(node) {
  118. var date = node.dataset.date;
  119. toRemove[date] = toRemove[date] || [];
  120. toRemove[date].push(node.dataset.entrynum);
  121. });
  122. allEntries.forEach(function(dateEntries) {
  123. var remove = toRemove[dateEntries.date];
  124. if (remove) {
  125. dateEntries.entries = dateEntries.entries.filter(function(entry, i) {
  126. return remove.indexOf('' + i) === -1;
  127. });
  128. }
  129. })
  130. submitNextEffort(allEntries);
  131. };
  132. body.insertBefore(timeSheetCt, body.firstChild);
  133. }
  134.  
  135. var getFrame;
  136. var getTaskId;
  137. function main(global) {
  138. var frames = {};
  139.  
  140. (function getFrames(window) {
  141. toArr(window.frames).forEach(function(win) {
  142. if (win.name) {
  143. frames[win.name] = win;
  144. }
  145. getFrames(win);
  146. });
  147. })(global);
  148.  
  149. getFrame = function(name) {
  150. return frames[name];
  151. };
  152.  
  153. var DRTaskId = localStorage.DRTaskId;
  154. var pageTaskId = getFrame('Submit').location.href.match(/Effort\.asp\?cmd=submit&tid=(\d+)/);
  155. pageTaskId = pageTaskId && pageTaskId[1];
  156.  
  157. if (DRTaskId && pageTaskId && DRTaskId !== pageTaskId) {
  158. alert('Task id mismatch, using ' + pageTaskId);
  159. DRTaskId = pageTaskId;
  160. } else if (!DRTaskId) {
  161. if (pageTaskId) {
  162. DRTaskId = pageTaskId;
  163. } else {
  164. DRTaskId = prompt('Enter DR task id');
  165. }
  166. if (!DRTaskId) {
  167. alert('failed');
  168. return;
  169. }
  170. }
  171. localStorage.DRTaskId = DRTaskId;
  172.  
  173. getTaskId = function() {
  174. return DRTaskId;
  175. };
  176.  
  177. var data = prompt('Paste data from JIRA timesheet');
  178. if (data) {
  179. try {
  180. displayTimesheet(JSON.parse(data), {
  181. groupIssues: false,
  182. showParent: true
  183. });
  184. } catch(e) {
  185. console.error(e);
  186. }
  187. }
  188. }
  189.  
  190. function toArr(obj) {
  191. return Array.prototype.slice.call(obj);
  192. }
  193.  
  194. function toDRDate(date) {
  195. return date.slice(0, 2) + '.' + date.slice(2, 4) + '.' + date.slice(4);
  196. }
  197.  
  198. function reduceLogHours(log) {
  199. return log.reduce(function(total, log) {
  200. return total + log.hours;
  201. }, 0);
  202. }
  203.  
  204. function reduceLogDesc(log, parent) {
  205. return log.reduce(function(desc, log) {
  206. return (desc ? desc + ' ' : '') + getLogEntryIssue(log, parent);
  207. }, '');
  208. }
  209.  
  210. function getLogEntryIssue(entry, parent) {
  211. return parent && entry.parentIssue || entry.issueId;
  212. }
  213.  
  214. main(this);
  215.  
  216. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement