[TASK] add tablesort and routing
This commit is contained in:
parent
3e1242c5cf
commit
ac87050fa0
|
@ -3,7 +3,7 @@ body {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
color: #333;
|
color: #333;
|
||||||
line-height: 1;
|
line-height: 1.3;
|
||||||
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||||
}
|
}
|
||||||
.status {
|
.status {
|
||||||
|
@ -52,7 +52,6 @@ nav li a, nav li span {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: 1.1em .5em;
|
padding: 1.1em .5em;
|
||||||
min-width: 10em;
|
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
nav > ul > .item-1 {
|
nav > ul > .item-1 {
|
||||||
|
@ -97,6 +96,22 @@ nav > ul > .item-3 {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
font-size: 1.3em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
thead tr th{
|
||||||
|
border-bottom: 4px solid #dc0067;
|
||||||
|
}
|
||||||
|
|
||||||
|
table th.sort-down:after {
|
||||||
|
content: " \25BE"
|
||||||
|
}
|
||||||
|
table th.sort-up:after {
|
||||||
|
content: " \25B4"
|
||||||
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: .5em 1em;
|
padding: .5em 1em;
|
||||||
|
|
|
@ -5,9 +5,12 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||||
<title>FreifunkManager</title>
|
<title>FreifunkManager</title>
|
||||||
<link rel="stylesheet" href="/css/main.css">
|
<link rel="stylesheet" href="/css/main.css">
|
||||||
|
<script src="/js/navigo.js"></script>
|
||||||
<script src="/js/config.js"></script>
|
<script src="/js/config.js"></script>
|
||||||
|
<script src="/js/domlib.js"></script>
|
||||||
<script src="/js/store.js"></script>
|
<script src="/js/store.js"></script>
|
||||||
<script src="/js/notify.js"></script>
|
<script src="/js/notify.js"></script>
|
||||||
|
<script src="/js/gui_list.js"></script>
|
||||||
<script src="/js/gui.js"></script>
|
<script src="/js/gui.js"></script>
|
||||||
<script src="/js/socket.js"></script>
|
<script src="/js/socket.js"></script>
|
||||||
<script src="/js/app.js"></script>
|
<script src="/js/app.js"></script>
|
||||||
|
@ -18,16 +21,15 @@
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li class="logo"><img src="/img/logo.jpg"></li>
|
<li class="logo"><img src="/img/logo.jpg"></li>
|
||||||
<li class="item-1"><a href="#/list/">List</a></li>
|
<li class="item-1"><a href="#/list">List</a></li>
|
||||||
<li class="item-2"><a href="#/map/">Map</a></li>
|
<li class="item-2"><a href="#/map">Map</a></li>
|
||||||
<li class="item-3"><a href="#/statistics/">Statistics</a></li>
|
<li class="item-3"><a href="#/statistics">Statistics</a></li>
|
||||||
<li class="status"><span onclick="location.reload(true)"></span></li>
|
<li class="status offline"><span onclick="location.reload(true)"></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<main>
|
|
||||||
</main>
|
|
||||||
<div class="notifications"></div>
|
<div class="notifications"></div>
|
||||||
|
<main></main>
|
||||||
<noscript>
|
<noscript>
|
||||||
<strong>JavaScript required</strong>
|
<strong>JavaScript required</strong>
|
||||||
</noscript>
|
</noscript>
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
var domlib = {};
|
||||||
|
(function(){
|
||||||
|
domlib.newAt = function(at,eltype) {
|
||||||
|
var el = document.createElement(eltype);
|
||||||
|
at.appendChild(el);
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
domlib.removeChildren = function(el) {
|
||||||
|
if(el)
|
||||||
|
while(el.firstChild) {
|
||||||
|
el.removeChild(el.firstChild);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})()
|
|
@ -1,7 +1,43 @@
|
||||||
var gui = {};
|
var gui = {};
|
||||||
|
var router = new Navigo(null, true, '#');
|
||||||
|
|
||||||
(function(){
|
(function(){
|
||||||
|
function clean(){
|
||||||
|
domlib.removeChildren(document.querySelector('main'));
|
||||||
|
}
|
||||||
|
router.on({
|
||||||
|
'/list': function () {
|
||||||
|
clean();
|
||||||
|
console.log("list view");
|
||||||
|
guiList.bind(document.querySelector('main'));
|
||||||
|
guiList.render();
|
||||||
|
},
|
||||||
|
'/map':function(){
|
||||||
|
clean();
|
||||||
|
console.log("map view");
|
||||||
|
domlib.newAt(main,"div").innerHTML = "Map";
|
||||||
|
},
|
||||||
|
'/statistics':function(){
|
||||||
|
clean();
|
||||||
|
console.log("stats view");
|
||||||
|
domlib.newAt(document.querySelector('main'),"div").innerHTML = "Stats";
|
||||||
|
},
|
||||||
|
'/n/:nodeID': {
|
||||||
|
as: 'node',
|
||||||
|
uses: function (params) {
|
||||||
|
clean();
|
||||||
|
console.log("node view");
|
||||||
|
var nodeid = params['nodeID'].toLowerCase();
|
||||||
|
domlib.newAt(document.querySelector('main'),"div").innerHTML = "Nodeid: "+nodeid;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
router.on(function () {
|
||||||
|
router.navigate('/list');
|
||||||
|
});
|
||||||
|
|
||||||
gui.render = function render(){
|
gui.render = function render(){
|
||||||
|
main = document.querySelector('main');
|
||||||
var status = document.getElementsByClassName('status')[0];
|
var status = document.getElementsByClassName('status')[0];
|
||||||
if (status === undefined){
|
if (status === undefined){
|
||||||
console.log("unable to render");
|
console.log("unable to render");
|
||||||
|
@ -12,10 +48,10 @@ var gui = {};
|
||||||
status.classList.add(((socket.readyState===0 || socket.readyState===2)?'connecting':(socket.readyState===1)?'':'offline'));
|
status.classList.add(((socket.readyState===0 || socket.readyState===2)?'connecting':(socket.readyState===1)?'':'offline'));
|
||||||
}
|
}
|
||||||
|
|
||||||
notify.container = document.getElementsByClassName('notifications')[0];
|
notify.bind(document.getElementsByClassName('notifications')[0]);
|
||||||
};
|
|
||||||
gui.update = function update(){
|
guiList.render();
|
||||||
// console.log(store.will());
|
router.resolve();
|
||||||
};
|
};
|
||||||
|
|
||||||
gui.render();
|
gui.render();
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
var guiList = {};
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
var container;
|
||||||
|
var tbody;
|
||||||
|
var sortReverse = false;
|
||||||
|
var sortIndex;
|
||||||
|
|
||||||
|
function sort(a,b){
|
||||||
|
if(sortIndex === undefined)
|
||||||
|
return a.node_id.localeCompare(b.node_id);
|
||||||
|
switch (sortIndex.innerHTML) {
|
||||||
|
case "Hostname":
|
||||||
|
return a.hostname.localeCompare(b.hostname);
|
||||||
|
default:
|
||||||
|
return a.node_id.localeCompare(b.node_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderRow(data){
|
||||||
|
var tr = document.createElement('tr');
|
||||||
|
var td;
|
||||||
|
|
||||||
|
domlib.newAt(tr,'td').innerHTML = data.node_id;
|
||||||
|
|
||||||
|
var cell1 = domlib.newAt(tr,'td');
|
||||||
|
cell1.innerHTML = data.hostname;
|
||||||
|
cell1.addEventListener('click',function(){
|
||||||
|
router.navigate(router.generate('node', { nodeID: data.node_id }));
|
||||||
|
});
|
||||||
|
|
||||||
|
return tr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateTable(){
|
||||||
|
domlib.removeChildren(tbody);
|
||||||
|
var data = store.will();
|
||||||
|
|
||||||
|
if(sortReverse)
|
||||||
|
data = data.reverse(sort);
|
||||||
|
else
|
||||||
|
data = data.sort(sort);
|
||||||
|
|
||||||
|
for(var i=0; i<data.length; i++){
|
||||||
|
var row = renderRow(data[i]);
|
||||||
|
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');
|
||||||
|
|
||||||
|
updateTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
guiList.bind = function(el) {
|
||||||
|
container = el;
|
||||||
|
};
|
||||||
|
|
||||||
|
guiList.render = function render(){
|
||||||
|
if (container === undefined){
|
||||||
|
console.log("unable to render guiList");
|
||||||
|
return;
|
||||||
|
} else if (tbody !== undefined){
|
||||||
|
container.appendChild(tbody.parentNode);
|
||||||
|
updateTable();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
domlib.removeChildren(container);
|
||||||
|
var table = domlib.newAt(container,'table');
|
||||||
|
var thead = domlib.newAt(table,'thead');
|
||||||
|
tbody = domlib.newAt(table,'tbody');
|
||||||
|
|
||||||
|
var tr = domlib.newAt(thead,'tr');
|
||||||
|
|
||||||
|
var cell1 = domlib.newAt(tr,'th');
|
||||||
|
cell1.innerHTML = "NodeID";
|
||||||
|
cell1.addEventListener('click', function(){
|
||||||
|
sortTable(cell1);
|
||||||
|
});
|
||||||
|
|
||||||
|
var cell2 = domlib.newAt(tr,'th');
|
||||||
|
cell2.innerHTML = "Hostname";
|
||||||
|
cell2.addEventListener('click', function(){
|
||||||
|
sortTable(cell2);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.classList.add('sorttable');
|
||||||
|
|
||||||
|
updateTable();
|
||||||
|
};
|
||||||
|
})();
|
File diff suppressed because one or more lines are too long
|
@ -1,42 +1,49 @@
|
||||||
var notify = {container:{},messages:[]};
|
var notify = {};
|
||||||
|
|
||||||
|
|
||||||
(function(){
|
(function(){
|
||||||
|
var container;
|
||||||
|
var messages = [];
|
||||||
|
|
||||||
if ("Notification" in window) {
|
if ("Notification" in window) {
|
||||||
Notification.requestPermission();
|
Notification.requestPermission();
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeLast (){
|
function removeLast (){
|
||||||
notify.messages.splice(0, 1);
|
messages.splice(0, 1);
|
||||||
if(notify.container.firstElementChild)
|
if(container!==undefined && container.firstElementChild)
|
||||||
notify.container.removeChild(notify.container.firstElementChild);
|
container.removeChild(container.firstElementChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderMsg(msg){
|
function renderMsg(msg){
|
||||||
var msgBox = document.createElement('div');
|
var msgBox = document.createElement('div');
|
||||||
msgBox.classList.add("notify",msg.type);
|
msgBox.classList.add("notify",msg.type);
|
||||||
msgBox.innerHTML = msg.text;
|
msgBox.innerHTML = msg.text;
|
||||||
notify.container.appendChild(msgBox);
|
container.appendChild(msgBox);
|
||||||
msgBox.addEventListener('click', function(){
|
msgBox.addEventListener('click', function(){
|
||||||
notify.container.removeChild(msgBox);
|
container.removeChild(msgBox);
|
||||||
if (notify.messages.indexOf(msg) !== -1) {
|
if (messages.indexOf(msg) !== -1) {
|
||||||
notify.messages.splice(notify.messages.indexOf(msg), 1);
|
messages.splice(messages.indexOf(msg), 1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(removeLast,15000);
|
setInterval(removeLast,15000);
|
||||||
|
|
||||||
|
notify.bind = function(el) {
|
||||||
|
container = el;
|
||||||
|
};
|
||||||
|
|
||||||
notify.send = function(type, text){
|
notify.send = function(type, text){
|
||||||
if("Notification" in window && Notification.permission === "granted") {
|
if("Notification" in window && Notification.permission === "granted") {
|
||||||
new Notification(text,{body:type,icon:'/img/logo.jpg'});
|
new Notification(text,{body:type,icon:'/img/logo.jpg'});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(notify.messages.length > 10){
|
if(messages.length > 10){
|
||||||
removeLast();
|
removeLast();
|
||||||
}
|
}
|
||||||
var msg = {type:type,text:text};
|
var msg = {type:type,text:text};
|
||||||
notify.messages.push(msg);
|
messages.push(msg);
|
||||||
renderMsg(msg);
|
renderMsg(msg);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,8 @@ var socket = {readyState:0};
|
||||||
|
|
||||||
if(msg.type === "current") {
|
if(msg.type === "current") {
|
||||||
store.updateReal(msg.node);
|
store.updateReal(msg.node);
|
||||||
gui.update();
|
|
||||||
} else if (msg.type === "to-update") {
|
} else if (msg.type === "to-update") {
|
||||||
store.update(msg.node);
|
store.update(msg.node);
|
||||||
gui.update();
|
|
||||||
} else {
|
} else {
|
||||||
gui.disable(e);
|
gui.disable(e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue