@andypf/json-viewer
Version:
A javascript library to visualize json nicely
190 lines (175 loc) • 5.16 kB
JavaScript
/* eslint-disable */
var addSorting = (function () {
"use strict"
var cols,
currentSort = {
index: 0,
desc: false,
}
// returns the summary table element
function getTable() {
return document.querySelector(".coverage-summary")
}
// returns the thead element of the summary table
function getTableHeader() {
return getTable().querySelector("thead tr")
}
// returns the tbody element of the summary table
function getTableBody() {
return getTable().querySelector("tbody")
}
// returns the th element for nth column
function getNthColumn(n) {
return getTableHeader().querySelectorAll("th")[n]
}
function onFilterInput() {
const searchValue = document.getElementById("fileSearch").value
const rows = document.getElementsByTagName("tbody")[0].children
for (let i = 0; i < rows.length; i++) {
const row = rows[i]
if (row.textContent.toLowerCase().includes(searchValue.toLowerCase())) {
row.style.display = ""
} else {
row.style.display = "none"
}
}
}
// loads the search box
function addSearchBox() {
var template = document.getElementById("filterTemplate")
var templateClone = template.content.cloneNode(true)
templateClone.getElementById("fileSearch").oninput = onFilterInput
template.parentElement.appendChild(templateClone)
}
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll("th"),
colNode,
cols = [],
col,
i
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i]
col = {
key: colNode.getAttribute("data-col"),
sortable: !colNode.getAttribute("data-nosort"),
type: colNode.getAttribute("data-type") || "string",
}
cols.push(col)
if (col.sortable) {
col.defaultDescSort = col.type === "number"
colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>'
}
}
return cols
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll("td"),
colNode,
col,
data = {},
i,
val
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i]
col = cols[i]
val = colNode.getAttribute("data-value")
if (col.type === "number") {
val = Number(val)
}
data[col.key] = val
}
return data
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll("tr"),
i
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i])
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function (a, b) {
a = a.data[key]
b = b.data[key]
return a < b ? -1 : a > b ? 1 : 0
},
finalSorter = sorter,
tableBody = document.querySelector(".coverage-summary tbody"),
rowNodes = tableBody.querySelectorAll("tr"),
rows = [],
i
if (desc) {
finalSorter = function (a, b) {
return -1 * sorter(a, b)
}
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i])
tableBody.removeChild(rowNodes[i])
}
rows.sort(finalSorter)
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i])
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className
cls = cls.replace(/ sorted$/, "").replace(/ sorted-desc$/, "")
col.className = cls
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc ? " sorted-desc" : " sorted"
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i]
return function () {
var desc = col.defaultDescSort
if (currentSort.index === i) {
desc = !currentSort.desc
}
sortByIndex(i, desc)
removeSortIndicators()
currentSort.index = i
currentSort.desc = desc
addSortIndicators()
}
}
for (i = 0; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector(".sorter").parentElement
if (el.addEventListener) {
el.addEventListener("click", ithSorter(i))
} else {
el.attachEvent("onclick", ithSorter(i))
}
}
}
}
// adds sorting functionality to the UI
return function () {
if (!getTable()) {
return
}
cols = loadColumns()
loadData()
addSearchBox()
addSortIndicators()
enableUI()
}
})()
window.addEventListener("load", addSorting)