main.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  3. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. function toArray(iter) {
  5. if (iter === null) {
  6. return null;
  7. }
  8. return Array.prototype.slice.call(iter);
  9. }
  10. function find(selector, elem) {
  11. if (!elem) {
  12. elem = document;
  13. }
  14. return elem.querySelector(selector);
  15. }
  16. function find_all(selector, elem) {
  17. if (!elem) {
  18. elem = document;
  19. }
  20. return toArray(elem.querySelectorAll(selector));
  21. }
  22. function sort_column(elem) {
  23. toggle_sort_states(elem);
  24. var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
  25. var key;
  26. if (elem.classList.contains('numeric')) {
  27. key = key_num;
  28. } else if (elem.classList.contains('result')) {
  29. key = key_result;
  30. } else {
  31. key = key_alpha;
  32. }
  33. sort_table(elem, key(colIndex));
  34. }
  35. function show_all_extras() {
  36. find_all('.col-result').forEach(show_extras);
  37. }
  38. function hide_all_extras() {
  39. find_all('.col-result').forEach(hide_extras);
  40. }
  41. function show_extras(colresult_elem) {
  42. var extras = colresult_elem.parentNode.nextElementSibling;
  43. var expandcollapse = colresult_elem.firstElementChild;
  44. extras.classList.remove("collapsed");
  45. expandcollapse.classList.remove("expander");
  46. expandcollapse.classList.add("collapser");
  47. }
  48. function hide_extras(colresult_elem) {
  49. var extras = colresult_elem.parentNode.nextElementSibling;
  50. var expandcollapse = colresult_elem.firstElementChild;
  51. extras.classList.add("collapsed");
  52. expandcollapse.classList.remove("collapser");
  53. expandcollapse.classList.add("expander");
  54. }
  55. function show_filters() {
  56. var filter_items = document.getElementsByClassName('filter');
  57. for (var i = 0; i < filter_items.length; i++)
  58. filter_items[i].hidden = false;
  59. }
  60. function add_collapse() {
  61. // Add links for show/hide all
  62. var resulttable = find('table#results-table');
  63. var showhideall = document.createElement("p");
  64. showhideall.innerHTML = '<a href="javascript:show_all_extras()">Show all details</a> / ' +
  65. '<a href="javascript:hide_all_extras()">Hide all details</a>';
  66. resulttable.parentElement.insertBefore(showhideall, resulttable);
  67. // Add show/hide link to each result
  68. find_all('.col-result').forEach(function(elem) {
  69. var extras = elem.parentNode.nextElementSibling;
  70. var expandcollapse = document.createElement("span");
  71. if (elem.innerHTML === 'Passed') {
  72. extras.classList.add("collapsed");
  73. expandcollapse.classList.add("expander");
  74. } else {
  75. expandcollapse.classList.add("collapser");
  76. }
  77. elem.appendChild(expandcollapse);
  78. elem.addEventListener("click", function(event) {
  79. if (event.currentTarget.parentNode.nextElementSibling.classList.contains("collapsed")) {
  80. show_extras(event.currentTarget);
  81. } else {
  82. hide_extras(event.currentTarget);
  83. }
  84. });
  85. })
  86. }
  87. function init () {
  88. reset_sort_headers();
  89. add_collapse();
  90. show_filters();
  91. toggle_sort_states(find('.initial-sort'));
  92. find_all('.sortable').forEach(function(elem) {
  93. elem.addEventListener("click",
  94. function(event) {
  95. sort_column(elem);
  96. }, false)
  97. });
  98. };
  99. function sort_table(clicked, key_func) {
  100. var rows = find_all('.results-table-row');
  101. var reversed = !clicked.classList.contains('asc');
  102. var sorted_rows = sort(rows, key_func, reversed);
  103. /* Whole table is removed here because browsers acts much slower
  104. * when appending existing elements.
  105. */
  106. var thead = document.getElementById("results-table-head");
  107. document.getElementById('results-table').remove();
  108. var parent = document.createElement("table");
  109. parent.id = "results-table";
  110. parent.appendChild(thead);
  111. sorted_rows.forEach(function(elem) {
  112. parent.appendChild(elem);
  113. });
  114. document.getElementsByTagName("BODY")[0].appendChild(parent);
  115. }
  116. function sort(items, key_func, reversed) {
  117. var sort_array = items.map(function(item, i) {
  118. return [key_func(item), i];
  119. });
  120. var multiplier = reversed ? -1 : 1;
  121. sort_array.sort(function(a, b) {
  122. var key_a = a[0];
  123. var key_b = b[0];
  124. return multiplier * (key_a >= key_b ? 1 : -1);
  125. });
  126. return sort_array.map(function(item) {
  127. var index = item[1];
  128. return items[index];
  129. });
  130. }
  131. function key_alpha(col_index) {
  132. return function(elem) {
  133. return elem.childNodes[1].childNodes[col_index].firstChild.data.toLowerCase();
  134. };
  135. }
  136. function key_num(col_index) {
  137. return function(elem) {
  138. return parseFloat(elem.childNodes[1].childNodes[col_index].firstChild.data);
  139. };
  140. }
  141. function key_result(col_index) {
  142. return function(elem) {
  143. var strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed',
  144. 'Skipped', 'Passed'];
  145. return strings.indexOf(elem.childNodes[1].childNodes[col_index].firstChild.data);
  146. };
  147. }
  148. function reset_sort_headers() {
  149. find_all('.sort-icon').forEach(function(elem) {
  150. elem.parentNode.removeChild(elem);
  151. });
  152. find_all('.sortable').forEach(function(elem) {
  153. var icon = document.createElement("div");
  154. icon.className = "sort-icon";
  155. icon.textContent = "vvv";
  156. elem.insertBefore(icon, elem.firstChild);
  157. elem.classList.remove("desc", "active");
  158. elem.classList.add("asc", "inactive");
  159. });
  160. }
  161. function toggle_sort_states(elem) {
  162. //if active, toggle between asc and desc
  163. if (elem.classList.contains('active')) {
  164. elem.classList.toggle('asc');
  165. elem.classList.toggle('desc');
  166. }
  167. //if inactive, reset all other functions and add ascending active
  168. if (elem.classList.contains('inactive')) {
  169. reset_sort_headers();
  170. elem.classList.remove('inactive');
  171. elem.classList.add('active');
  172. }
  173. }
  174. function is_all_rows_hidden(value) {
  175. return value.hidden == false;
  176. }
  177. function filter_table(elem) {
  178. var outcome_att = "data-test-result";
  179. var outcome = elem.getAttribute(outcome_att);
  180. class_outcome = outcome + " results-table-row";
  181. var outcome_rows = document.getElementsByClassName(class_outcome);
  182. for(var i = 0; i < outcome_rows.length; i++){
  183. outcome_rows[i].hidden = !elem.checked;
  184. }
  185. var rows = find_all('.results-table-row').filter(is_all_rows_hidden);
  186. var all_rows_hidden = rows.length == 0 ? true : false;
  187. var not_found_message = document.getElementById("not-found-message");
  188. not_found_message.hidden = !all_rows_hidden;
  189. }