+
+
+
{{ selectedNodeToShowPositionHistory.short_name }} Position History
+
@@ -1812,8 +1820,9 @@
selectedNodeMqttMetrics: [],
selectedNodeTraceroutes: [],
- positionHistoryFromTimeDate: new Date(new Date().getTime() - 3600 * 1000).toISOString().slice(0, 16),
- positionHistoryToTimeDate: new Date().toISOString().slice(0, 16),
+ // YYYY-MM-DDTHH:mm is the format expected by the datetime-local input type
+ positionHistoryDateTimeFrom: moment().subtract(1, "hours").format('YYYY-MM-DDTHH:mm'),
+ positionHistoryDateTimeTo: moment().format('YYYY-MM-DDTHH:mm'),
selectedNodePositionHistory: [],
selectedNodeToShowPositionHistory: null,
selectedNodePositionHistoryMarkers: [],
@@ -1847,7 +1856,7 @@
this.loadNodePowerMetrics(node.node_id);
this.loadNodeMqttMetrics(node.node_id);
this.loadNodeTraceroutes(node.node_id);
- this.loadNodePositionHistory(node.node_id);
+ //this.loadNodePositionHistory(node.node_id);
};
// handle node callback from outside of vue
@@ -1944,12 +1953,15 @@
},
loadNodePositionHistory: function(nodeId) {
this.selectedNodePositionHistory = [];
- window.axios.get(`/api/v1/nodes/${nodeId}/position-history?time_from=${new Date(this.positionHistoryFromTimeDate).getTime()}&time_to=${new Date(this.positionHistoryToTimeDate).getTime()}`).then((response) => {
+ window.axios.get(`/api/v1/nodes/${nodeId}/position-history`, {
+ params: {
+ // parse from datetime-local format, and send as unix timestamp in milliseconds
+ time_from: moment(this.positionHistoryDateTimeFrom, "YYYY-MM-DDTHH:mm").format("x"),
+ time_to: moment(this.positionHistoryDateTimeTo, "YYYY-MM-DDTHH:mm").format("x"),
+ },
+ }).then((response) => {
this.selectedNodePositionHistory = response.data.position_history;
-
- console.log(this.selectedNodePositionHistory);
-
- if (this.selectedNodeToShowPositionHistory != null) {
+ if(this.selectedNodeToShowPositionHistory != null){
clearAllPositionHistory();
onPositionHistoryUpdated(response.data.position_history);
}
@@ -2570,10 +2582,21 @@
getRegionFrequencyRange: function(regionName) {
return window.getRegionFrequencyRange(regionName);
},
- handleNodePositionHistory: function(nodeId) {
- this.selectedNodeToShowPositionHistory = this.selectedNode
- this.selectedNode = null
- onPositionHistoryUpdated(this.selectedNodePositionHistory)
+ showNodePositionHistory: function(nodeId) {
+
+ // find node
+ const node = findNodeById(nodeId);
+ if(!node){
+ return;
+ }
+
+ // update ui
+ this.selectedNode = null;
+ this.selectedNodeToShowPositionHistory = node;
+
+ // load position history
+ this.loadNodePositionHistory(nodeId);
+
},
getShareLinkForNode: function(nodeId) {
return window.location.origin + `/?node_id=${nodeId}`;
@@ -2599,11 +2622,11 @@
this.selectedNodeToShowNeighbours = null;
},
dismissShowingNodePositionHistory: function() {
- this.selectedNodePositionHistory = [],
- this.selectedNodeToShowPositionHistory = null
- this.selectedNodePositionHistoryMarkers = [],
- this.selectedNodePositionHistoryPolyLines = [],
- cleanUpPositionHistory()
+ this.selectedNodePositionHistory = [];
+ this.selectedNodeToShowPositionHistory = null;
+ this.selectedNodePositionHistoryMarkers = [];
+ this.selectedNodePositionHistoryPolyLines = [];
+ cleanUpPositionHistory();
},
formatUptimeSeconds: function(secondsToFormat) {
secondsToFormat = Number(secondsToFormat);
@@ -2792,6 +2815,11 @@
iconSize: [16, 16], // increase from 12px to 16px to make hover easier
});
+ var iconPositionHistory = L.divIcon({
+ className: 'icon-position-history',
+ iconSize: [16, 16], // increase from 12px to 16px to make hover easier
+ });
+
// create legend
var legendLayerGroup = new L.LayerGroup();
var legend = L.control({position: 'bottomleft'});
@@ -3608,14 +3636,13 @@
}
function onPositionHistoryUpdated(updatedPositionHistories) {
- let positionHistoryMarkers = [];
- let positionHistoryLines = [];
+
let positionHistoryLinesCords = [];
// add nodes
for(var positionHistory of updatedPositionHistories) {
- // skip nodes without position
+ // skip position history without position
if(!positionHistory.latitude || !positionHistory.longitude){
continue;
}
@@ -3623,10 +3650,8 @@
// fix lat long
positionHistory.latitude = positionHistory.latitude / 10000000;
positionHistory.longitude = positionHistory.longitude / 10000000;
-
var hasLocation = isValidLatLng(positionHistory.latitude, positionHistory.longitude);
-
if(hasLocation){
// wrap longitude for shortest path, everything to left of australia should be shown on the right
@@ -3635,25 +3660,15 @@
longitude += 360;
}
- positionHistoryLinesCords.push([positionHistory.latitude, longitude])
+ positionHistoryLinesCords.push([positionHistory.latitude, longitude]);
- // determine emoji to show as marker icon
- const emoji = 128205;
- const emojiText = String.fromCodePoint(emoji)
-
- let tooltip = ""
-
- tooltip += `Position: ${positionHistory.latitude}, ${positionHistory.longitude}`
- tooltip += `Heard by: `
- tooltip += `Timestamp: ${new Date(positionHistory.time).toLocaleString()}`
+ let tooltip = "";
+ tooltip += `
${moment(new Date(positionHistory.created_at)).format("DD/MM/YYYY hh:mm A")}`;
+ tooltip += `Position: ${positionHistory.latitude}, ${positionHistory.longitude}`;
// create position history marker
const marker = L.marker([positionHistory.latitude, longitude],{
- icon: L.divIcon({
- className: 'waypoint-label',
- iconSize: [26, 26], // increase from 12px to 26px
- html: emojiText,
- }),
+ icon: iconPositionHistory,
}).bindPopup(tooltip).on('click', function(event) {
// close tooltip on click to prevent tooltip and popup showing at same time
event.target.closeTooltip();
@@ -3662,15 +3677,12 @@
// add marker to position history layer group
marker.addTo(nodePositionHistoryLayerGroup);
- positionHistoryMarkers.push(marker)
-
}
}
- const line = L.polyline(positionHistoryLinesCords).addTo(nodePositionHistoryLayerGroup);
-
- positionHistoryLines.push(line)
+ // show lines between position history markers
+ L.polyline(positionHistoryLinesCords).addTo(nodePositionHistoryLayerGroup);
}