mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2025-10-27 08:49:27 +00:00
152 lines
4.5 KiB
JavaScript
152 lines
4.5 KiB
JavaScript
// Map layers
|
|
var markersLayer;
|
|
var terminator;
|
|
|
|
// Load spots and populate the table.
|
|
function loadSpots() {
|
|
$.getJSON('/api/v1/spots' + buildQueryString(), function(jsonData) {
|
|
// Store data
|
|
spots = jsonData;
|
|
// Update map
|
|
updateMap();
|
|
terminator.setTime();
|
|
});
|
|
}
|
|
|
|
// Build a query string for the API, based on the filters that the user has selected.
|
|
function buildQueryString() {
|
|
var str = "?";
|
|
["dx_continent", "de_continent", "mode_type", "source", "band"].forEach(fn => {
|
|
if (!allFilterOptionsSelected(fn)) {
|
|
str = str + getQueryStringFor(fn) + "&";
|
|
}
|
|
});
|
|
str = str + "max_age=" + $("#max-spot-age option:selected").val();
|
|
return str;
|
|
}
|
|
|
|
// Update the spots map
|
|
function updateMap() {
|
|
// Clear existing content
|
|
markersLayer.clearLayers();
|
|
// Make new markers for all spots with a good location
|
|
spots.forEach(function (s) {
|
|
if (s["dx_location_good"]) {
|
|
let m = L.marker([s["dx_latitude"], s["dx_longitude"]], {icon: getIcon(s)});
|
|
markersLayer.addLayer(m);
|
|
}
|
|
});
|
|
}
|
|
|
|
// Get an icon for a spot, based on its band, using PSK Reporter colours, its program etc.
|
|
function getIcon(s) {
|
|
return L.ExtraMarkers.icon({
|
|
icon: "fa-" + s["icon"],
|
|
iconColor: "white", // todo
|
|
markerColor: "black", // todo
|
|
shape: 'circle',
|
|
prefix: 'fa',
|
|
svg: true
|
|
});
|
|
}
|
|
|
|
// Load server options. Once a successful callback is made from this, we then query spots and set up the timer to query
|
|
// spots repeatedly.
|
|
function loadOptions() {
|
|
$.getJSON('/api/v1/options', function(jsonData) {
|
|
// Store options
|
|
options = jsonData;
|
|
|
|
// Add CSS for band bullets and band toggle buttons
|
|
addBandColourCSS(options["bands"]);
|
|
|
|
// Populate the filters panel
|
|
generateBandsMultiToggleFilterCard(options["bands"]);
|
|
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
|
generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]);
|
|
generateMultiToggleFilterCard("#mode-options", "mode_type", options["mode_types"]);
|
|
generateMultiToggleFilterCard("#source-options", "source", options["spot_sources"]);
|
|
|
|
// Load settings from settings storage now all the controls are available
|
|
loadSettings();
|
|
|
|
// Load spots and set up the timer
|
|
loadSpots();
|
|
setInterval(loadSpots, REFRESH_INTERVAL_SEC * 1000);
|
|
});
|
|
}
|
|
|
|
// Method called when any display property is changed to reload the map and persist the display settings.
|
|
function displayUpdated() {
|
|
updateMap();
|
|
saveSettings();
|
|
}
|
|
|
|
// React to toggling/closing panels
|
|
function toggleFiltersPanel() {
|
|
// If we are going to show the filters panel, hide the display panel
|
|
if (!$("#filters-area").is(":visible") && $("#display-area").is(":visible")) {
|
|
$("#display-area").hide();
|
|
$("#display-button").button("toggle");
|
|
}
|
|
$("#filters-area").toggle();
|
|
}
|
|
function closeFiltersPanel() {
|
|
$("#filters-button").button("toggle");
|
|
$("#filters-area").hide();
|
|
}
|
|
|
|
function toggleDisplayPanel() {
|
|
// If we are going to show the display panel, hide the filters panel
|
|
if (!$("#display-area").is(":visible") && $("#filters-area").is(":visible")) {
|
|
$("#filters-area").hide();
|
|
$("#filters-button").button("toggle");
|
|
}
|
|
$("#display-area").toggle();
|
|
}
|
|
function closeDisplayPanel() {
|
|
$("#display-button").button("toggle");
|
|
$("#display-area").hide();
|
|
}
|
|
|
|
// Set up the map
|
|
function setUpMap() {
|
|
// Create map
|
|
map = L.map('map', {
|
|
zoomControl: false,
|
|
minZoom: 2,
|
|
maxZoom: 12
|
|
});
|
|
|
|
// Add basemap
|
|
backgroundTileLayer = L.tileLayer.provider("OpenStreetMap.Mapnik", {
|
|
opacity: 1,
|
|
edgeBufferTiles: 1
|
|
});
|
|
backgroundTileLayer.addTo(map);
|
|
backgroundTileLayer.bringToBack();
|
|
|
|
// Add marker layer
|
|
markersLayer = new L.LayerGroup();
|
|
markersLayer.addTo(map);
|
|
|
|
// Add terminator/greyline
|
|
terminator = L.terminator({
|
|
interactive: false
|
|
});
|
|
terminator.setStyle({fillColor: '#00000050'});
|
|
terminator.addTo(map);
|
|
|
|
// Display a default view.
|
|
map.setView([30, 0], 3);
|
|
}
|
|
|
|
// Startup
|
|
$(document).ready(function() {
|
|
// Hide the extra things that need to be hidden on this page
|
|
$(".hideonmap").hide();
|
|
// Set up map
|
|
setUpMap();
|
|
// Call loadOptions(), this will then trigger loading spots and setting up timers.
|
|
loadOptions();
|
|
}); |