UNPKG

5.28 kBJavaScriptView Raw
1/* eslint-disable */
2var addSorting = (function() {
3 'use strict';
4 var cols,
5 currentSort = {
6 index: 0,
7 desc: false
8 };
9
10 // returns the summary table element
11 function getTable() {
12 return document.querySelector('.coverage-summary');
13 }
14 // returns the thead element of the summary table
15 function getTableHeader() {
16 return getTable().querySelector('thead tr');
17 }
18 // returns the tbody element of the summary table
19 function getTableBody() {
20 return getTable().querySelector('tbody');
21 }
22 // returns the th element for nth column
23 function getNthColumn(n) {
24 return getTableHeader().querySelectorAll('th')[n];
25 }
26
27 // loads all columns
28 function loadColumns() {
29 var colNodes = getTableHeader().querySelectorAll('th'),
30 colNode,
31 cols = [],
32 col,
33 i;
34
35 for (i = 0; i < colNodes.length; i += 1) {
36 colNode = colNodes[i];
37 col = {
38 key: colNode.getAttribute('data-col'),
39 sortable: !colNode.getAttribute('data-nosort'),
40 type: colNode.getAttribute('data-type') || 'string'
41 };
42 cols.push(col);
43 if (col.sortable) {
44 col.defaultDescSort = col.type === 'number';
45 colNode.innerHTML =
46 colNode.innerHTML + '<span class="sorter"></span>';
47 }
48 }
49 return cols;
50 }
51 // attaches a data attribute to every tr element with an object
52 // of data values keyed by column name
53 function loadRowData(tableRow) {
54 var tableCols = tableRow.querySelectorAll('td'),
55 colNode,
56 col,
57 data = {},
58 i,
59 val;
60 for (i = 0; i < tableCols.length; i += 1) {
61 colNode = tableCols[i];
62 col = cols[i];
63 val = colNode.getAttribute('data-value');
64 if (col.type === 'number') {
65 val = Number(val);
66 }
67 data[col.key] = val;
68 }
69 return data;
70 }
71 // loads all row data
72 function loadData() {
73 var rows = getTableBody().querySelectorAll('tr'),
74 i;
75
76 for (i = 0; i < rows.length; i += 1) {
77 rows[i].data = loadRowData(rows[i]);
78 }
79 }
80 // sorts the table using the data for the ith column
81 function sortByIndex(index, desc) {
82 var key = cols[index].key,
83 sorter = function(a, b) {
84 a = a.data[key];
85 b = b.data[key];
86 return a < b ? -1 : a > b ? 1 : 0;
87 },
88 finalSorter = sorter,
89 tableBody = document.querySelector('.coverage-summary tbody'),
90 rowNodes = tableBody.querySelectorAll('tr'),
91 rows = [],
92 i;
93
94 if (desc) {
95 finalSorter = function(a, b) {
96 return -1 * sorter(a, b);
97 };
98 }
99
100 for (i = 0; i < rowNodes.length; i += 1) {
101 rows.push(rowNodes[i]);
102 tableBody.removeChild(rowNodes[i]);
103 }
104
105 rows.sort(finalSorter);
106
107 for (i = 0; i < rows.length; i += 1) {
108 tableBody.appendChild(rows[i]);
109 }
110 }
111 // removes sort indicators for current column being sorted
112 function removeSortIndicators() {
113 var col = getNthColumn(currentSort.index),
114 cls = col.className;
115
116 cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
117 col.className = cls;
118 }
119 // adds sort indicators for current column being sorted
120 function addSortIndicators() {
121 getNthColumn(currentSort.index).className += currentSort.desc
122 ? ' sorted-desc'
123 : ' sorted';
124 }
125 // adds event listeners for all sorter widgets
126 function enableUI() {
127 var i,
128 el,
129 ithSorter = function ithSorter(i) {
130 var col = cols[i];
131
132 return function() {
133 var desc = col.defaultDescSort;
134
135 if (currentSort.index === i) {
136 desc = !currentSort.desc;
137 }
138 sortByIndex(i, desc);
139 removeSortIndicators();
140 currentSort.index = i;
141 currentSort.desc = desc;
142 addSortIndicators();
143 };
144 };
145 for (i = 0; i < cols.length; i += 1) {
146 if (cols[i].sortable) {
147 // add the click event handler on the th so users
148 // dont have to click on those tiny arrows
149 el = getNthColumn(i).querySelector('.sorter').parentElement;
150 if (el.addEventListener) {
151 el.addEventListener('click', ithSorter(i));
152 } else {
153 el.attachEvent('onclick', ithSorter(i));
154 }
155 }
156 }
157 }
158 // adds sorting functionality to the UI
159 return function() {
160 if (!getTable()) {
161 return;
162 }
163 cols = loadColumns();
164 loadData();
165 addSortIndicators();
166 enableUI();
167 };
168})();
169
170window.addEventListener('load', addSorting);