freifunkmanager/webroot/js/gui_list.js

240 lines
7.1 KiB
JavaScript
Raw Normal View History

2017-05-16 16:00:32 +02:00
/* exported guiList */
/* global domlib,store,router */
2017-05-09 20:40:18 +02:00
var guiList = {};
(function(){
2017-05-15 21:59:48 +02:00
var view = guiList;
var container, el;
2017-05-09 20:40:18 +02:00
var tbody;
var sortReverse = false;
var sortIndex;
2017-05-15 21:59:48 +02:00
var hostnameFilter, nodeidFilter;
2017-05-12 21:32:10 +02:00
2017-05-09 20:40:18 +02:00
function sort(a,b){
2017-05-12 21:32:10 +02:00
function sortNumber(a,b){
return a - b;
}
2017-05-09 20:40:18 +02:00
if(sortIndex === undefined)
return a.node_id.localeCompare(b.node_id);
switch (sortIndex.innerHTML) {
2017-05-12 21:32:10 +02:00
case "Lastseen":
return a.lastseen - b.lastseen;
case "CurPower":
return a._wireless.txpower24 - b._wireless.txpower24;
case "Power":
return a.wireless.txpower24 - b.wireless.txpower24;
case "CurChannel":
return a._wireless.channel24 - b._wireless.channel24;
case "Channel":
return a.wireless.channel24 - b.wireless.channel24;
case "Clients":
return a.statistics.clients.wifi24 - b.statistics.clients.wifi24;
case "ChanUtil":
var aMax = a.statistics.wireless.map(function(d){
2017-05-16 16:00:32 +02:00
return d.ChanUtil;
2017-05-12 21:32:10 +02:00
}).sort(sortNumber);
var bMax = b.statistics.wireless.map(function(d){
2017-05-16 16:00:32 +02:00
return d.ChanUtil;
2017-05-12 21:32:10 +02:00
}).sort(sortNumber);
if(!sortReverse){
aMax = aMax.reverse();
bMax = bMax.reverse();
}
return bMax[0] - aMax[0];
2017-05-09 20:40:18 +02:00
case "Hostname":
return a.hostname.localeCompare(b.hostname);
default:
return a.node_id.localeCompare(b.node_id);
}
}
2017-05-15 21:59:48 +02:00
function renderRow(node){
2017-05-09 20:40:18 +02:00
var tr = document.createElement('tr');
2017-05-12 21:32:10 +02:00
var startdate = new Date();
startdate.setMinutes(startdate.getMinutes() - 1);
2017-05-15 21:59:48 +02:00
if(new Date(node.lastseen) < startdate)
2017-05-16 16:00:32 +02:00
tr.classList.add('offline');
2017-05-09 20:40:18 +02:00
2017-05-15 21:59:48 +02:00
domlib.newAt(tr,'td').innerHTML = moment(node.lastseen).fromNow(true);
domlib.newAt(tr,'td').innerHTML = node.node_id;
2017-05-09 20:40:18 +02:00
2017-05-15 21:59:48 +02:00
domlib.newAt(tr,'td').innerHTML = node.hostname;
2017-05-12 21:32:10 +02:00
var freq = domlib.newAt(tr,'td');
domlib.newAt(freq,'span').innerHTML = '2.4 Ghz';
domlib.newAt(freq,'span').innerHTML = '5 Ghz';
var curchannel = domlib.newAt(tr,'td');
2017-05-15 21:59:48 +02:00
domlib.newAt(curchannel,'span').innerHTML = node._wireless.channel24||'-';
domlib.newAt(curchannel,'span').innerHTML = node._wireless.channel5||'-';
2017-05-12 21:32:10 +02:00
var channel = domlib.newAt(tr,'td');
2017-05-15 21:59:48 +02:00
domlib.newAt(channel,'span').innerHTML = node.wireless.channel24||'-';
domlib.newAt(channel,'span').innerHTML = node.wireless.channel5||'-';
2017-05-12 21:32:10 +02:00
var curpower = domlib.newAt(tr,'td');
2017-05-15 21:59:48 +02:00
domlib.newAt(curpower,'span').innerHTML = node._wireless.txpower24||'-';
domlib.newAt(curpower,'span').innerHTML = node._wireless.txpower5||'-';
2017-05-12 21:32:10 +02:00
var power = domlib.newAt(tr,'td');
2017-05-15 21:59:48 +02:00
domlib.newAt(power,'span').innerHTML = node.wireless.txpower24||'-';
domlib.newAt(power,'span').innerHTML = node.wireless.txpower5||'-';
2017-05-12 21:32:10 +02:00
var client = domlib.newAt(tr,'td');
2017-05-15 21:59:48 +02:00
domlib.newAt(client,'span').innerHTML = node.statistics.clients.wifi24;
domlib.newAt(client,'span').innerHTML = node.statistics.clients.wifi5;
2017-05-12 21:32:10 +02:00
var chanUtil = domlib.newAt(tr,'td');
2017-05-15 21:59:48 +02:00
var chanUtil24 = node.statistics.wireless.filter(function(d){
2017-05-12 21:32:10 +02:00
return d.frequency < 5000;
2017-05-15 21:59:48 +02:00
})[0] || {};
var chanUtil5 = node.statistics.wireless.filter(function(d){
2017-05-12 21:32:10 +02:00
return d.frequency > 5000;
2017-05-15 21:59:48 +02:00
})[0] || {};
2017-05-12 21:32:10 +02:00
domlib.newAt(chanUtil,'span').innerHTML = chanUtil24.ChanUtil||'-';
domlib.newAt(chanUtil,'span').innerHTML = chanUtil5.ChanUtil||'-';
var option = domlib.newAt(tr,'td');
2017-05-16 16:00:32 +02:00
var edit = domlib.newAt(option,'div');
2017-05-12 21:32:10 +02:00
edit.classList.add('btn');
edit.innerHTML = 'Edit';
edit.addEventListener('click',function(){
2017-05-15 21:59:48 +02:00
router.navigate(router.generate('node', { nodeID: node.node_id }));
2017-05-09 20:40:18 +02:00
});
return tr;
}
2017-05-15 21:59:48 +02:00
function update(){
2017-05-09 20:40:18 +02:00
domlib.removeChildren(tbody);
2017-05-15 21:59:48 +02:00
var nodes = store.getNodes();
2017-05-09 20:40:18 +02:00
2017-05-12 21:32:10 +02:00
if(hostnameFilter && hostnameFilter.value != "")
2017-05-15 21:59:48 +02:00
nodes = nodes.filter(function(d){
2017-05-12 21:32:10 +02:00
return d.hostname.toLowerCase().indexOf(hostnameFilter.value) > -1;
2017-05-16 16:00:32 +02:00
});
2017-05-12 21:32:10 +02:00
if(nodeidFilter && nodeidFilter.value != "")
2017-05-15 21:59:48 +02:00
nodes = nodes.filter(function(d){
2017-05-12 21:32:10 +02:00
return d.node_id.indexOf(nodeidFilter.value) > -1;
2017-05-16 16:00:32 +02:00
});
2017-05-12 21:32:10 +02:00
2017-05-15 21:59:48 +02:00
nodes = nodes.sort(sort);
2017-05-12 21:32:10 +02:00
2017-05-09 20:40:18 +02:00
if(sortReverse)
2017-05-15 21:59:48 +02:00
nodes = nodes.reverse();
2017-05-09 20:40:18 +02:00
2017-05-15 21:59:48 +02:00
for(var i=0; i<nodes.length; i++){
var row = renderRow(nodes[i]);
2017-05-09 20:40:18 +02:00
tbody.appendChild(row);
}
}
function sortTable(head) {
if(sortIndex)
sortIndex.classList.remove("sort-up","sort-down");
sortReverse = head === sortIndex ? !sortReverse : false;
sortIndex = head;
sortIndex.classList.add(sortReverse ? 'sort-up' : 'sort-down');
2017-05-15 21:59:48 +02:00
update();
2017-05-09 20:40:18 +02:00
}
2017-05-15 21:59:48 +02:00
view.bind = function(el) {
2017-05-09 20:40:18 +02:00
container = el;
};
2017-05-15 21:59:48 +02:00
view.render = function(){
2017-05-09 20:40:18 +02:00
if (container === undefined){
return;
2017-05-15 21:59:48 +02:00
} else if (el !== undefined){
container.appendChild(el);
update();
2017-05-09 20:40:18 +02:00
return;
}
2017-05-15 21:59:48 +02:00
console.log("generate new view for list");
el = domlib.newAt(container,'div');
var table = domlib.newAt(el,'table');
2017-05-09 20:40:18 +02:00
var thead = domlib.newAt(table,'thead');
tbody = domlib.newAt(table,'tbody');
var tr = domlib.newAt(thead,'tr');
var cell1 = domlib.newAt(tr,'th');
2017-05-12 21:32:10 +02:00
cell1.innerHTML = "Lastseen";
2017-05-09 20:40:18 +02:00
cell1.addEventListener('click', function(){
sortTable(cell1);
});
var cell2 = domlib.newAt(tr,'th');
2017-05-12 21:32:10 +02:00
cell2.classList.add('sortable');
nodeidFilter = domlib.newAt(cell2,'input');
nodeidFilter.setAttribute("placeholder","NodeID");
nodeidFilter.setAttribute("size","9");
2017-05-15 21:59:48 +02:00
nodeidFilter.addEventListener('keyup', update);
2017-05-12 21:32:10 +02:00
cell2.addEventListener('dblclick', function(){
2017-05-09 20:40:18 +02:00
sortTable(cell2);
});
2017-05-12 21:32:10 +02:00
var cell3 = domlib.newAt(tr,'th');
cell3.classList.add('sortable');
hostnameFilter = domlib.newAt(cell3,'input');
hostnameFilter.setAttribute("placeholder","Hostname");
2017-05-15 21:59:48 +02:00
hostnameFilter.addEventListener('keyup', update);
2017-05-12 21:32:10 +02:00
cell3.addEventListener('dblclick', function(){
sortTable(cell3);
});
domlib.newAt(tr,'th').innerHTML = 'Freq';
var cell4 = domlib.newAt(tr,'th');
cell4.innerHTML = "CurChannel";
cell4.classList.add('sortable');
cell4.addEventListener('click', function(){
sortTable(cell4);
});
var cell5 = domlib.newAt(tr,'th');
cell5.innerHTML = "Channel";
cell5.classList.add('sortable');
cell5.addEventListener('click', function(){
sortTable(cell5);
});
var cell6 = domlib.newAt(tr,'th');
cell6.innerHTML = "CurPower";
cell6.classList.add('sortable');
cell6.addEventListener('click', function(){
sortTable(cell6);
});
var cell7 = domlib.newAt(tr,'th');
cell7.innerHTML = "Power";
cell7.classList.add('sortable');
cell7.addEventListener('click', function(){
sortTable(cell7);
});
var cell8 = domlib.newAt(tr,'th');
cell8.innerHTML = "Clients";
cell8.classList.add('sortable');
cell8.addEventListener('click', function(){
sortTable(cell8);
});
var cell9 = domlib.newAt(tr,'th');
cell9.innerHTML = "ChanUtil";
cell9.classList.add('sortable');
cell9.addEventListener('click', function(){
sortTable(cell9);
});
domlib.newAt(tr,'th').innerHTML = "Option";
table.classList.add('nodes');
2017-05-09 20:40:18 +02:00
2017-05-15 21:59:48 +02:00
update();
2017-05-09 20:40:18 +02:00
};
})();