sorter.js (5278B)
1 /* eslint-disable */ 2 var 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 170 window.addEventListener('load', addSorting);