blob: 41072aae88d4512a194c51af3d0d8d39d83879e2 [file] [log] [blame]
/**
* Copyright (c) 2018 Eurotech and/or its affiliates.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
var DataTable = function (dataUrl, tableId, filtersId, columnsDescriptors) {
this.data = {}
this.items = []
this.activeFilters = []
this.columnsDescriptors = columnsDescriptors
this.table = document.getElementById(tableId)
this.filters = document.getElementById(filtersId)
for (var i = 0; i < columnsDescriptors.length; i++) {
this.items[i] = {}
}
var self = this
var req = new XMLHttpRequest();
req.onload = function () {
self.load(JSON.parse(this.responseText).data)
self.createFilters()
self.render()
};
req.open('get', dataUrl, true);
req.send();
}
DataTable.prototype.createFilter = function (label, index, values) {
var div = document.createElement('div')
div.className = "form-group"
var l = document.createElement('label')
l.innerText = label
div.appendChild(l)
var select = document.createElement('select')
select.className = "custom-select custom-select-sm"
var all = document.createElement('option')
all.innerText = 'all';
all.value = 'all'
select.appendChild(all)
for (var entry in values) {
var option = document.createElement('option')
option.innerText = entry
option.value = entry
select.appendChild(option)
}
var defaultValue = this.columnsDescriptors[index].default
if (defaultValue) {
select.value = defaultValue
this.activeFilters[index] = defaultValue
}
var self = this
select.addEventListener('change', function () {
if (select.value === 'all') {
delete self.activeFilters[index]
} else {
self.activeFilters[index] = select.value
}
self.render()
})
div.appendChild(select)
return div
}
DataTable.prototype.createFilters = function () {
for (var i=0;i<this.columnsDescriptors.length;i++) {
if (this.columnsDescriptors[i].filter) {
this.filters.appendChild(this.createFilter(this.columnsDescriptors[i].name, i, this.items[i]))
}
}
}
DataTable.prototype.indexRow = function (row) {
for (var i=0; i<row.length; i++) {
var data = row[i]
this.items[i][data] = true
}
}
DataTable.prototype.load = function (rows) {
for (var i=0; i<rows.length; i++) {
this.indexRow(rows[i])
}
this.data = rows
}
DataTable.prototype.renderHeader = function () {
var head = document.createElement('tr')
for (var i=0;i<this.columnsDescriptors.length; i++) {
var h = document.createElement('th');
h.className = 'text-center'
h.innerText = this.columnsDescriptors[i].name
head.appendChild(h)
}
this.table.appendChild(head)
}
DataTable.prototype.renderRow = function (row) {
var r = document.createElement('tr')
for (var i=0; i<row.length; i++) {
var col = document.createElement('td')
col.className = 'text-center'
var val = row[i]
if (this.columnsDescriptors[i].renderer) {
col.appendChild(this.columnsDescriptors[i].renderer(val))
} else {
col.innerText = val
}
r.appendChild(col)
}
this.table.appendChild(r)
}
DataTable.prototype.matchesFilter = function (row) {
for (var i=0; i<row.length; i++) {
if (this.activeFilters[i] === undefined) {
continue
}
if (row[i] !== this.activeFilters[i]) {
return false
}
}
return true
}
DataTable.prototype.render = function () {
while (this.table.firstChild) {
this.table.removeChild(this.table.firstChild)
}
this.renderHeader()
for (var i=0; i<this.data.length; i++) {
var row = this.data[i]
if (!this.matchesFilter(row)) {
continue
}
this.renderRow(row)
}
}