freifunkmanager/webroot/js/gui_node.js

143 lines
4.2 KiB
JavaScript
Raw Normal View History

2017-05-16 16:00:32 +02:00
/* exported guiNode */
/* globals store, socket, domlib, config,notify */
2017-05-16 00:22:15 +02:00
var guiNode = {};
2017-05-15 21:59:48 +02:00
(function(){
var view = guiNode;
var container, el;
2017-05-16 00:22:15 +02:00
var titleName,titleID,ago;
2017-05-16 02:27:30 +02:00
var marker, map, geoJsonLayer;
2017-05-16 00:22:15 +02:00
var btnGPS, editLocationGPS, storePosition;
var current_node_id, editing = false;
function updatePosition(lat, lng){
if(!lat || !lng) {
lat = storePosition.latitude || false;
lng = storePosition.longitude || false;
if(!lat || !lng)
return;
}
var node = store.getNode(current_node_id);
node.location = {latitude:lat,longitude:lng};
socket.sendnode(node);
}
2017-05-15 21:59:48 +02:00
function update(){
2017-05-16 02:27:30 +02:00
geoJsonLayer.refresh();
2017-05-16 00:22:15 +02:00
titleID.innerHTML = current_node_id;
var node = store.getNode(current_node_id);
2017-05-15 21:59:48 +02:00
if(node === undefined){
2017-05-16 00:22:15 +02:00
console.log("node not found: "+current_node_id);
return;
}
var startdate = new Date();
startdate.setMinutes(startdate.getMinutes() - 1);
if(new Date(node.lastseen) < startdate){
2017-05-16 16:00:32 +02:00
ago.classList.add('offline');
2017-05-16 00:22:15 +02:00
ago.classList.remove('online');
}else{
2017-05-16 16:00:32 +02:00
ago.classList.remove('offline');
2017-05-16 00:22:15 +02:00
ago.classList.add('online');
}
ago.innerHTML = moment(node.lastseen).fromNow() + ' ('+node.lastseen+')';
if(editLocationGPS || editing || node.location === undefined || node.location.latitude === undefined || node.location.longitude === undefined) {
2017-05-15 21:59:48 +02:00
return;
}
titleName.innerHTML = node.hostname;
2017-05-16 00:22:15 +02:00
var latlng = [node.location.latitude,node.location.longitude];
map.setView(latlng);
marker.setLatLng(latlng);
marker.setOpacity(1);
}
view.setNodeID = function (nodeID){
current_node_id = nodeID;
2017-05-16 16:00:32 +02:00
};
2017-05-15 21:59:48 +02:00
view.bind = function(el) {
container = el;
};
view.render = function render(){
if (container === undefined){
return;
} else if (el !== undefined){
container.appendChild(el);
update();
return;
}
console.log("generate new view for node");
el = domlib.newAt(container,'div');
var title = domlib.newAt(el,'h1');
titleName = domlib.newAt(title,'span');
2017-05-16 16:00:32 +02:00
title.appendChild(document.createTextNode(" - "));
2017-05-15 21:59:48 +02:00
titleID = domlib.newAt(title,'i');
2017-05-16 00:22:15 +02:00
var lastseen = domlib.newAt(el,'p');
domlib.newAt(lastseen,'span').innerHTML = "Lastseen: ";
ago = domlib.newAt(lastseen,'span');
var mapEl = domlib.newAt(el,'div');
2017-05-16 02:27:30 +02:00
mapEl.style.height = '300px';
2017-05-16 00:22:15 +02:00
map = L.map(mapEl).setView(config.map.view.bound, config.map.view.zoom);
L.tileLayer(config.map.tileLayer, {
maxZoom: config.map.maxZoom,
}).addTo(map);
2017-05-16 02:27:30 +02:00
geoJsonLayer = L.geoJson.ajax(config.map.geojson.url, config.map.geojson).addTo(map);
2017-05-16 00:22:15 +02:00
marker = L.marker(config.map.view.bound,{draggable:true,opacity:0.5}).addTo(map);
2017-05-16 16:00:32 +02:00
marker.on('dragstart', function(){
2017-05-16 00:22:15 +02:00
editing = true;
});
2017-05-16 16:00:32 +02:00
marker.on('dragend', function(){
2017-05-16 00:22:15 +02:00
editing = false;
var pos = marker.getLatLng();
updatePosition(pos.lat,pos.lng);
});
btnGPS = domlib.newAt(el,'span');
btnGPS.classList.add('btn');
btnGPS.innerHTML = "Start follow position";
btnGPS.addEventListener('click',function(){
if(editLocationGPS){
if(btnGPS.innerHTML == "Stop following")
updatePosition();
btnGPS.innerHTML = "Start follow position";
navigator.geolocation.clearWatch(editLocationGPS);
editLocationGPS = false;
return;
}
btnGPS.innerHTML = 'Following position';
2017-05-16 16:00:32 +02:00
if (navigator.geolocation !== undefined)
2017-05-16 00:22:15 +02:00
editLocationGPS = navigator.geolocation.watchPosition(
function geo_success(position) {
btnGPS.innerHTML = "Stop following";
storePosition = position.coords;
var latlng = [position.coords.latitude, position.coords.longitude];
marker.setLatLng(latlng);
map.setView(latlng);
},
function geo_error(error) {
switch (error.code) {
case error.TIMEOUT:
notify.send("error","Find Location timeout");
break;
2017-05-16 16:00:32 +02:00
}
2017-05-16 00:22:15 +02:00
},
{
enableHighAccuracy: true,
maximumAge: 30000,
timeout: 27000
});
else
2017-05-16 16:00:32 +02:00
notify.send("error","Browser did not support Location");
2017-05-16 00:22:15 +02:00
});
2017-05-15 21:59:48 +02:00
update();
2017-05-16 16:00:32 +02:00
};
})();