add popup and aliases

This commit is contained in:
Martin Geno 2016-07-02 02:11:17 +02:00
parent 603fff71e3
commit 3499828ed7
12 changed files with 248 additions and 42 deletions

2
build

@ -1 +1 @@
Subproject commit b35d8667a611269a4152a322e635b479bc54df6c Subproject commit e43e6917c3f958ba7b360146110af268705979a7

View File

@ -1,7 +1,7 @@
{ {
"api":"http://localhost:8080/api", "api":"http://ffhb.h.sum7.de/api",
"reload":60000, "reload":60000,
"meshviewer":"http://localhost:8080/meshviewer", "meshviewer":"http://ffhb.h.sum7.de/meshviewer",
"map":{ "map":{
"icon":{ "icon":{
"warn":{"wifi24":20,"wifi5":20}, "warn":{"wifi24":20,"wifi5":20},
@ -9,7 +9,7 @@
}, },
"view":[53.0702,8.815], "view":[53.0702,8.815],
"zoom":16, "zoom":16,
"geojson":"http://localhost:8080/data/meshviewer.geojson", "geojson":"http://ffhb.h.sum7.de/data/meshviewer.geojson",
"tiles":{ "tiles":{
"url":"https://otile{s}-s.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.jpg", "url":"https://otile{s}-s.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.jpg",
"option":{ "option":{

View File

@ -6,13 +6,20 @@
font-style: normal; font-style: normal;
} }
a {
color: orange;
font-weight: bold;
text-decoration: none;
cursor: pointer;
}
body{ body{
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
border: 0px; border: 0px;
outline: 0px; outline: 0px;
background: rgba(0, 0, 0, 0.12); background-color: #f2f2f2;
font-family: Verdana,sans-serif;
} }
button,input{ button,input{
color:black; color:black;
@ -40,12 +47,23 @@ table.table{
text-align: left; text-align: left;
} }
.table tr:nth-child(even){ .table tr:nth-child(even){
background-color: #f2f2f2; background-color: rgba(242, 242, 242, 0.4);;
} }
.table th{ .table th{
background-color: #dc0067; background-color: #dc0067;
background:-webkit-gradient(linear, left top, left bottom, from(#dc0067), to(#dc0050));
background:-moz-linear-gradient(top, #dc0067, #dc0050);
color: white; color: white;
} }
.table small{
display: block;
}
.table i.icon{
margin-right: 15px;
}
.table td.split span{
display: block;
}
.content, .content > .map{ .content, .content > .map{
width:100%; width:100%;
height:100%; height:100%;
@ -62,6 +80,24 @@ header.menu{
height: 99%; height: 99%;
border: none; border: none;
} }
.popup {
position: fixed;
border-radius: 5px 5px 0px 0px;
background-color: grey;
color: white;
bottom: 0px;
width: 70%;
left:15%;
height: 32px;
padding: 10px;
z-index: 3500;
}
.popup.hidden{
bottom: -50px;
}
.popup a {
float: right;
}
i.icon{ i.icon{
font: normal normal normal 12px/1 FontAwesome; font: normal normal normal 12px/1 FontAwesome;
} }

101
js/controller/aliases.js Normal file
View File

@ -0,0 +1,101 @@
define(function(){
var data;
return function(el,map){
var title = document.createElement("h1"),
table = document.createElement("table"),
thead = document.createElement("thead"),
tbody = document.createElement("tbody");
title.textContent = "Undone Changes";
table.appendChild(thead);
table.appendChild(tbody);
table.classList.add("table");
thead.innerHTML = "<tr><th>Node</th><th>Freq</th><th>Channel</th><th>Power</th><th>Location</th></tr>";
var row = function(nodeid,alias,node){
var icon,td,
tr = document.createElement("tr");
//Node
td = document.createElement("td");
td.classList.add("text");
if(alias.hostname && alias.hostname != node.nodeinfo.hostname){
icon = document.createElement("i");
icon.classList.add("icon");
icon.textContent = "\uf096";
td.appendChild(icon);
}
td.appendChild(document.createTextNode((alias.hostname)?alias.hostname:node.nodeinfo.hostname));
var textNodeID = document.createElement("small");
textNodeID.textContent = nodeid;
td.appendChild(textNodeID);
tr.appendChild(td);
td = document.createElement("td");
td.classList.add("split");
var freq24 = document.createTextNode("2.4 Ghz");
var freq5 = document.createTextNode("5 Ghz");
td.appendChild(freq24);
td.appendChild(freq5);
tr.appendChild(td);
td = document.createElement("td");
td.classList.add("split");
var ch24 = document.createTextNode((alias && alias.wireless !== undefined && alias.wireless.channel24)?alias.wireless.channel24:((node.nodeinfo.wireless && node.nodeinfo.wireless.channel24)?node.nodeinfo.wireless.channel24:'-'));
var ch5 = document.createTextNode((alias && alias.wireless !== undefined && alias.wireless.channel5)?alias.wireless.channel5:((node.nodeinfo.wireless && node.nodeinfo.wireless.channel5)?node.nodeinfo.wireless.channel5:'-'));
td.appendChild(ch24);
td.appendChild(ch5);
tr.appendChild(td);
td = document.createElement("td");
tr.appendChild(td);
//Location
td = document.createElement("td");
if(alias.location !== undefined &&
node.nodeinfo.location !== undefined &&
node.nodeinfo.location.latitude != alias.location.latitude &&
node.nodeinfo.location.longitude != alias.location.longitude
){
td.classList.add("text");
icon = document.createElement("i");
icon.classList.add("icon");
icon.textContent = "\uf096";
td.appendChild(icon);
}
td.classList.add("text");
icon = document.createElement("i");
icon.classList.add("icon");
icon.textContent = "\uf124";
icon.onclick = function () {
window.location.href = "#map/"+nodeid;
map.render(nodeid);
};
td.appendChild(icon);
tr.appendChild(td);
tbody.appendChild(tr);
};
var render = function() {
tbody.textContent = "";
if(data !== undefined)
Object.keys(data.aliases).map(function(key){
row(key,data.aliases[key],data.nodes[key]);
});
};
return {
storageNotify: function(d){
data = d;
render();
},
controller: function(){
el.textContent = "";
el.appendChild(title);
el.appendChild(table);
render();
}
};
};
});

View File

@ -3,7 +3,7 @@ define(function(){
var frame = document.createElement("iframe"); var frame = document.createElement("iframe");
frame.src = url; frame.src = url;
return function(){ return function(){
el.innerHTML = ""; el.textContent = "";
el.appendChild(frame); el.appendChild(frame);
}; };
}; };

View File

@ -128,14 +128,18 @@ define(['leaflet','controller/sidebar','leaflet.label'],function(L,Sidebar){
}; };
return { return {
render: function(nodeid){
currentNode = nodeid;
render();
},
storageNotify: function(d){ storageNotify: function(d){
data = d; data = d;
bar.storageNotify(d); bar.storageNotify(d);
render(); render();
}, },
controller: function(){ controller: function(){
currentNode = arguments[0]; currentNode = (arguments[0])?arguments[0].toLowerCase():null;
el.innerHTML = ""; el.textContent = "";
el.appendChild(sideBarEl); el.appendChild(sideBarEl);
el.appendChild(mapEl); el.appendChild(mapEl);
} }

View File

@ -1,12 +1,12 @@
define(function(){ define(function(){
var data; var data;
return function(el,config){ return function(el){
return { return {
storageNotify: function(d){ storageNotify: function(d){
data = d; data = d;
}, },
controller: function(){ controller: function(){
el.innerHTML = "Not implemented"; el.textContent = "Not implemented";
} }
}; };
}; };

View File

@ -20,9 +20,9 @@ define(["helper/lib"],function(){
sidebar.appendChild(controll); sidebar.appendChild(controll);
var iconClose = document.createElement('i'); var iconClose = document.createElement('i');
iconClose.innerHTML = "\uf00d"; iconClose.textContent = "\uf00d";
controll.appendChild(iconClose); controll.appendChild(iconClose);
iconClose.addEventListener("click",close); iconClose.onclick = close;
var content = document.createElement("div"); var content = document.createElement("div");
content.classList.add("content"); content.classList.add("content");
@ -64,16 +64,16 @@ define(["helper/lib"],function(){
var btnSave = document.createElement("button"); var btnSave = document.createElement("button");
var saveIcon = document.createElement('i'); var saveIcon = document.createElement('i');
saveIcon.classList.add("icon"); saveIcon.classList.add("icon");
saveIcon.innerHTML = "\uf0c7"; saveIcon.textContent = "\uf0c7";
btnSave.appendChild(saveIcon); btnSave.appendChild(saveIcon);
btnSave.innerHTML += " Save"; btnSave.appendChild(document.createTextNode(" Save"));
content.appendChild(btnSave); content.appendChild(btnSave);
if (navigator.geolocation) { if (navigator.geolocation) {
var btnGps = document.createElement("button"); var btnGps = document.createElement("button");
var gpsIcon = document.createElement('i'); var gpsIcon = document.createElement('i');
gpsIcon.classList.add("icon"); gpsIcon.classList.add("icon");
gpsIcon.innerHTML = "\uf124"; gpsIcon.textContent = "\uf124";
btnGps.appendChild(gpsIcon); btnGps.appendChild(gpsIcon);
content.appendChild(btnGps); content.appendChild(btnGps);
@ -81,13 +81,26 @@ define(["helper/lib"],function(){
var pos = [position.coords.latitude,position.coords.longitude]; var pos = [position.coords.latitude,position.coords.longitude];
marker.setLatLng(pos); marker.setLatLng(pos);
marker._map.setView(pos); marker._map.setView(pos);
if(data.aliases[nodeid] === undefined)
data.aliases[nodeid] = {};
alias = data.aliases[nodeid];
if(alias.location === undefined){
alias.location = {};
}
pos = marker.getLatLng();
alias.location.latitude = pos.lat;
alias.location.longitude = pos.lng;
send('POST',config.api+'/aliases/alias/'+nodeid,alias).then(function(){
close();
});
}; };
btnGps.addEventListener("click",function() { btnGps.onclick = function() {
navigator.geolocation.getCurrentPosition(setToGps); navigator.geolocation.getCurrentPosition(setToGps);
}); };
} }
btnSave.addEventListener("click",function() { btnSave.onclick = function() {
if(data.aliases[nodeid] === undefined) if(data.aliases[nodeid] === undefined)
data.aliases[nodeid] = {}; data.aliases[nodeid] = {};
alias = data.aliases[nodeid]; alias = data.aliases[nodeid];
@ -101,22 +114,22 @@ define(["helper/lib"],function(){
send('POST',config.api+'/aliases/alias/'+nodeid,alias).then(function(){ send('POST',config.api+'/aliases/alias/'+nodeid,alias).then(function(){
close(); close();
}); });
}); };
var render = function(){ var render = function(){
if(nodeid !== undefined){ if(nodeid !== undefined){
var node = data.nodes[nodeid]; var node = data.nodes[nodeid];
var alias = data.aliases[nodeid]; var alias = data.aliases[nodeid];
sidebar.classList.remove("hidden"); sidebar.classList.remove("hidden");
lblNodeid.innerHTML = "Nodeid:"+nodeid; lblNodeid.textContent = "Nodeid:"+nodeid;
inHostname.value = ((alias && alias.hostname)?alias.hostname:node.nodeinfo.hostname); inHostname.value = ((alias && alias.hostname)?alias.hostname:node.nodeinfo.hostname);
cellClient24.innerHTML = (node.statistics !== undefined && node.statistics.clients !== undefined)?node.statistics.clients.wifi24:'-'; cellClient24.textContent = (node.statistics !== undefined && node.statistics.clients !== undefined)?node.statistics.clients.wifi24:'-';
cellClient5.innerHTML = (node.statistics !== undefined && node.statistics.clients !== undefined)?node.statistics.clients.wifi5:'-'; cellClient5.textContent = (node.statistics !== undefined && node.statistics.clients !== undefined)?node.statistics.clients.wifi5:'-';
cellCh24.innerHTML = (alias && alias.wireless && alias.wireless.channel24)?alias.wireless.channel24:((node.nodeinfo.wireless && node.nodeinfo.wireless.channel24)?node.nodeinfo.wireless.channel24:'-'); cellCh24.textContent = (alias && alias.wireless && alias.wireless.channel24)?alias.wireless.channel24:((node.nodeinfo.wireless && node.nodeinfo.wireless.channel24)?node.nodeinfo.wireless.channel24:'-');
cellCh5.innerHTML = (alias && alias.wireless && alias.wireless.channel5)?alias.wireless.channel5:((node.nodeinfo.wireless && node.nodeinfo.wireless.channel5)?node.nodeinfo.wireless.channel5:'-'); cellCh5.textContent = (alias && alias.wireless && alias.wireless.channel5)?alias.wireless.channel5:((node.nodeinfo.wireless && node.nodeinfo.wireless.channel5)?node.nodeinfo.wireless.channel5:'-');
cellTx24.innerHTML = (alias && alias.wireless && alias.wireless.txpower24)?alias.wireless.txpower24:((node.nodeinfo.wireless && node.nodeinfo.wireless.txpower24)?node.nodeinfo.wireless.txpower24:'-'); cellTx24.textContent = (alias && alias.wireless && alias.wireless.txpower24)?alias.wireless.txpower24:((node.nodeinfo.wireless && node.nodeinfo.wireless.txpower24)?node.nodeinfo.wireless.txpower24:'-');
cellTx5.innerHTML = (alias && alias.wireless && alias.wireless.txpower5)?alias.wireless.txpower5:((node.nodeinfo.wireless && node.nodeinfo.wireless.txpower5)?node.nodeinfo.wireless.txpower5:'-'); cellTx5.textContent = (alias && alias.wireless && alias.wireless.txpower5)?alias.wireless.txpower5:((node.nodeinfo.wireless && node.nodeinfo.wireless.txpower5)?node.nodeinfo.wireless.txpower5:'-');
}else{ }else{
sidebar.classList.add("hidden"); sidebar.classList.add("hidden");

View File

@ -5,7 +5,11 @@ define(["helper/lib","moment"],function(lib,moment){
if(localStorageTest()){ if(localStorageTest()){
data.nodes = JSON.parse(localStorage.getItem("nodes")); data.nodes = JSON.parse(localStorage.getItem("nodes"));
if(!data.nodes)
data.nodes = {};
data.aliases = JSON.parse(localStorage.getItem("aliases")); data.aliases = JSON.parse(localStorage.getItem("aliases"));
if(!data.aliases)
data.aliases = {};
} }
var notify = function(){ var notify = function(){
@ -30,8 +34,8 @@ define(["helper/lib","moment"],function(lib,moment){
}); });
send('GET',config.api+"/nodes").then(function(d){ send('GET',config.api+"/nodes").then(function(d){
Object.keys(d).map(function(key){ Object.keys(d).map(function(key){
if(data.nodes === undefined && data.nodes[key] === undefined){ if(data.nodes === undefined || data.nodes[key] === undefined){
notifyNew(key,data[key]); notifyNew(key,d[key]);
} }
data.nodes[key] = d[key]; data.nodes[key] = d[key];
}); });

View File

@ -1,5 +1,5 @@
define(["helper/router","helper/storage","menu","controller/nodes","controller/map","controller/frame"], define(["helper/router","helper/storage","menu","popup","controller/nodes","controller/aliases","controller/map","controller/frame"],
function (Router, storage, menu, controllerNodes, controllerMap, controllerFrame) { function (Router, storage, menu, popup, controllerNodes, controllerAliases, controllerMap, controllerFrame) {
return function(config){ return function(config){
var store = storage(config); var store = storage(config);
store.refresh(); store.refresh();
@ -17,7 +17,13 @@ function (Router, storage, menu, controllerNodes, controllerMap, controllerFrame
var map = controllerMap(el,config); var map = controllerMap(el,config);
store.addNotify(map); store.addNotify(map);
var nodes = controllerNodes(el,config); var aliases = controllerAliases(el,map);
store.addNotify(aliases);
var popupInstance = popup(document.body,map);
store.addNotifyNew(popupInstance);
var nodes = controllerNodes(el);
store.addNotify(nodes); store.addNotify(nodes);
Router.config({ Router.config({
@ -25,7 +31,8 @@ function (Router, storage, menu, controllerNodes, controllerMap, controllerFrame
}) })
.add(/grafana/, controllerFrame(el,config.grafana.all)) .add(/grafana/, controllerFrame(el,config.grafana.all))
.add(/meshviewer/, controllerFrame(el,config.meshviewer)) .add(/meshviewer/, controllerFrame(el,config.meshviewer))
.add(/list/, nodes.controller) .add(/aliases/, aliases.controller)
.add(/nodes/, nodes.controller)
.add(/map\/(.*)/, map.controller) .add(/map\/(.*)/, map.controller)
.add(/map/, map.controller) .add(/map/, map.controller)
.add(nodes.controller) .add(nodes.controller)

View File

@ -7,23 +7,30 @@ define(function(){
menu.appendChild(right); menu.appendChild(right);
el.appendChild(menu); el.appendChild(menu);
var buttonList = document.createElement("i"); var buttonNodes = document.createElement("i");
buttonList.innerHTML = ""; buttonNodes.textContent = "";
buttonList.onclick = function () { buttonNodes.onclick = function () {
window.location.href = "#list"; window.location.href = "#nodes";
}; };
right.appendChild(buttonList); right.appendChild(buttonNodes);
var buttonMap = document.createElement("i"); var buttonMap = document.createElement("i");
buttonMap.innerHTML = '\uf278'; buttonMap.textContent = '\uf278';
buttonMap.onclick = function () { buttonMap.onclick = function () {
window.location.href = "#map"; window.location.href = "#map";
}; };
right.appendChild(buttonMap); right.appendChild(buttonMap);
var buttonAliases = document.createElement("i");
buttonAliases.textContent = "\uf0ec";
buttonAliases.onclick = function () {
window.location.href = "#aliases";
};
right.appendChild(buttonAliases);
var buttonStatistic = document.createElement("i"); var buttonStatistic = document.createElement("i");
buttonStatistic.classList.add("mini"); buttonStatistic.classList.add("mini");
buttonStatistic.innerHTML = ""; buttonStatistic.textContent = "";
buttonStatistic.onclick = function () { buttonStatistic.onclick = function () {
window.location.href = "#grafana"; window.location.href = "#grafana";
}; };
@ -31,7 +38,7 @@ define(function(){
var buttonMeshviewer = document.createElement("i"); var buttonMeshviewer = document.createElement("i");
buttonMeshviewer.classList.add("mini"); buttonMeshviewer.classList.add("mini");
buttonMeshviewer.innerHTML = '\uf279'; buttonMeshviewer.textContent = '\uf279';
buttonMeshviewer.onclick = function () { buttonMeshviewer.onclick = function () {
window.location.href = "#meshviewer"; window.location.href = "#meshviewer";
}; };
@ -39,7 +46,7 @@ define(function(){
var buttonRefresh = document.createElement("i"); var buttonRefresh = document.createElement("i");
buttonRefresh.innerHTML = ""; buttonRefresh.textContent = "";
var refreshtime = document.createElement("span"); var refreshtime = document.createElement("span");
store.setTimeSinceUpdate(refreshtime); store.setTimeSinceUpdate(refreshtime);
buttonRefresh.appendChild(refreshtime); buttonRefresh.appendChild(refreshtime);

34
js/popup.js Normal file
View File

@ -0,0 +1,34 @@
define(function(){
return function(el,controller){
var main = document.createElement("div"),
text = document.createElement("span"),
link = document.createElement("a");
main.classList.add("popup");
main.classList.add("hidden");
main.appendChild(text);
link.textContent = "Edit";
main.appendChild(link);
el.appendChild(main);
var timer;
return {
storageNotifyNew: function(key,data){
main.classList.remove("hidden");
text.textContent = "New Node '"+key+"'!";
window.clearTimeout(timer);
timer = window.setTimeout(function(){
main.classList.add("hidden");
}, 5000);
link.onclick = function(){
window.location.href = "#map/"+key;
controller.render(key);
main.classList.add("hidden");
};
}
};
};
});