diff --git a/server/webserver.py b/server/webserver.py index 5f86e74..e617255 100644 --- a/server/webserver.py +++ b/server/webserver.py @@ -6,11 +6,10 @@ from threading import Thread import bottle import pytz from bottle import run, request, response, template -from prometheus_client import CONTENT_TYPE_LATEST, generate_latest from core.config import MAX_SPOT_AGE, ALLOW_SPOTTING from core.constants import BANDS, ALL_MODES, MODE_TYPES, SIGS, CONTINENTS, SOFTWARE_VERSION -from core.prometheus_metrics_handler import page_requests_counter, registry, get_metrics, api_requests_counter +from core.prometheus_metrics_handler import page_requests_counter, get_metrics, api_requests_counter from data.spot import Spot @@ -33,6 +32,7 @@ class WebServer: # Base template data bottle.BaseTemplate.defaults['software_version'] = SOFTWARE_VERSION + bottle.BaseTemplate.defaults['allow_spotting'] = ALLOW_SPOTTING # Routes for API calls bottle.get("/api/v1/spots")(lambda: self.serve_spots_api()) @@ -45,6 +45,7 @@ class WebServer: bottle.get("/map")(lambda: self.serve_template('webpage_map')) bottle.get("/bands")(lambda: self.serve_template('webpage_bands')) bottle.get("/alerts")(lambda: self.serve_template('webpage_alerts')) + bottle.get("/add-spot")(lambda: self.serve_template('webpage_add_spot')) bottle.get("/status")(lambda: self.serve_template('webpage_status')) bottle.get("/about")(lambda: self.serve_template('webpage_about')) bottle.get("/apidocs")(lambda: self.serve_template('webpage_apidocs')) diff --git a/views/webpage_add_spot.tpl b/views/webpage_add_spot.tpl new file mode 100644 index 0000000..a53a768 --- /dev/null +++ b/views/webpage_add_spot.tpl @@ -0,0 +1,52 @@ +% rebase('webpage_base.tpl') + + + +
+
+
+
+
+ Add a Spot +
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+ + + + \ No newline at end of file diff --git a/views/webpage_base.tpl b/views/webpage_base.tpl index 6eaaaae..0fd8766 100644 --- a/views/webpage_base.tpl +++ b/views/webpage_base.tpl @@ -62,6 +62,9 @@ + % if allow_spotting: + + % end diff --git a/views/webpage_spots.tpl b/views/webpage_spots.tpl index 2db96d4..3f79546 100644 --- a/views/webpage_spots.tpl +++ b/views/webpage_spots.tpl @@ -14,11 +14,10 @@

-

- + + -
- +

@@ -188,55 +187,6 @@
-
-
-
-
- Add a Spot -
-
- -
-
- -
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
- - -
-
-
diff --git a/webassets/js/add-spot.js b/webassets/js/add-spot.js new file mode 100644 index 0000000..e1ecc75 --- /dev/null +++ b/webassets/js/add-spot.js @@ -0,0 +1,80 @@ +// Method called to add a spot to the server +function addSpot() { + try { + // Save settings (this will save "your call" for future use) + saveSettings(); + + // Unpack the user's entered values + var dx = $("#dx-call").val().toUpperCase(); + var freqStr = $("#freq").val(); + var mode = $("#mode").val().toUpperCase(); + var comment = $("#comment").val(); + var de = $("#de-call").val().toUpperCase(); + + var spot = {} + if (dx != "") { + spot["dx_call"] = dx; + } else { + showAddSpotError("A DX callsign is required in order to spot."); + return; + } + if (freqStr != "") { + spot["freq"] = parseFloat(freqStr) * 1000; + } else { + showAddSpotError("A frequency is required in order to spot."); + return; + } + if (mode != "") { + spot["mode"] = mode; + } + if (comment != "") { + spot["comment"] = comment; + } + if (de != "") { + spot["de_call"] = de; + } + spot["time"] = moment.utc().valueOf() / 1000.0; + + $.ajax("/api/v1/spot", { + data : JSON.stringify(spot), + contentType : 'application/json', + type : 'POST', + timeout: 10000, + success: async function (result) { + $("#result-good").html(""); + setTimeout(() => { + $("#result-good").hide(); + window.location.replace("/"); + }, 1000); + }, + error: function (result) { + showAddSpotError(result.responseText); + } + }); + } catch (error) { + showAddSpotError(error); + } + return false; +} + +// Show an "add spot" error. +function showAddSpotError(text) { + $("#result-bad").html(""); +} + +// Force callsign and mode capitalisation +$("#dx-call").change(function () { + $(this).val($(this).val().trim().toUpperCase()); +}); +$("#de-call").change(function () { + $(this).val($(this).val().trim().toUpperCase()); +}); +$("#mode").change(function () { + $(this).val($(this).val().trim().toUpperCase()); +}); + +// Startup +$(document).ready(function() { + // Load settings from settings storage + loadSettings(); +}); \ No newline at end of file diff --git a/webassets/js/spots.js b/webassets/js/spots.js index f62ec6b..921f277 100644 --- a/webassets/js/spots.js +++ b/webassets/js/spots.js @@ -330,64 +330,6 @@ function userGridUpdated() { saveSettings(); } -// Method called to add a spot to the server -function addSpot() { - try { - var dx = $("#add-spot-dx-call").val().toUpperCase(); - var freqStr = $("#add-spot-freq").val(); - var mode = $("#add-spot-mode").val().toUpperCase(); - var comment = $("#add-spot-comment").val(); - var de = $("#add-spot-de-call").val().toUpperCase(); - - var spot = {} - if (dx != "") { - spot["dx_call"] = dx; - } else { - showAddSpotError("A DX callsign is required in order to spot."); - return; - } - if (freqStr != "") { - spot["freq"] = parseFloat(freqStr) * 1000; - } else { - showAddSpotError("A frequency is required in order to spot."); - return; - } - if (mode != "") { - spot["mode"] = mode; - } - if (comment != "") { - spot["comment"] = comment; - } - if (de != "") { - spot["de_call"] = de; - } - spot["time"] = moment.utc().valueOf() / 1000.0; - - $.ajax("/api/v1/spot", { - data : JSON.stringify(spot), - contentType : 'application/json', - type : 'POST', - timeout: 10000, - success: async function (result) { - $("#post-spot-result-good").html(""); - setTimeout(() => $("#post-spot-result-good").hide(), 2000); - loadSpots(); - }, - error: function (result) { - showAddSpotError(result.responseText); - } - }); - } catch (error) { - showAddSpotError(error); - } - return false; -} - -// Show an "add spot" error. -function showAddSpotError(text) { - $("#post-spot-result-bad").html(""); -} - // React to toggling/closing panels function toggleFiltersPanel() { // If we are going to show the filters panel, hide the display and add spot panels @@ -395,10 +337,6 @@ function toggleFiltersPanel() { $("#display-area").hide(); $("#display-button").button("toggle"); } - if (!$("#filters-area").is(":visible") && $("#add-spot-area").is(":visible")) { - $("#add-spot-area").hide(); - $("#add-spot-button").button("toggle"); - } $("#filters-area").toggle(); } function closeFiltersPanel() { @@ -412,10 +350,6 @@ function toggleDisplayPanel() { $("#filters-area").hide(); $("#filters-button").button("toggle"); } - if (!$("#display-area").is(":visible") && $("#add-spot-area").is(":visible")) { - $("#add-spot-area").hide(); - $("#add-spot-button").button("toggle"); - } $("#display-area").toggle(); } function closeDisplayPanel() { @@ -423,23 +357,6 @@ function closeDisplayPanel() { $("#display-area").hide(); } -function toggleAddSpotPanel() { - // If we are going to show the add spot panel, hide the filters and display panels - if (!$("#add-spot-area").is(":visible") && $("#filters-area").is(":visible")) { - $("#filters-area").hide(); - $("#filters-button").button("toggle"); - } - if (!$("#add-spot-area").is(":visible") && $("#display-area").is(":visible")) { - $("#display-area").hide(); - $("#display-button").button("toggle"); - } - $("#add-spot-area").toggle(); -} -function closeAddSpotPanel() { - $("#add-spot-button").button("toggle"); - $("#add-spot-area").hide(); -} - // Display the intro box, unless the user has already dismissed it once. function displayIntroBox() { if (localStorage.getItem("intro-box-dismissed") == null) {