diff --git a/webassets/apidocs/openapi.yml b/webassets/apidocs/openapi.yml
index d68a1aa..cbdaf53 100644
--- a/webassets/apidocs/openapi.yml
+++ b/webassets/apidocs/openapi.yml
@@ -1,3 +1,4 @@
+$schema: "https://spec.openapis.org/oas/3.1.0"
openapi: 3.1.0
info:
title: Spothole API
@@ -864,7 +865,6 @@ components:
- DSTAR
- C4FM
- M17
- - DIGI
- DATA
- FT8
- FT4
diff --git a/webassets/js/bands.js b/webassets/js/bands.js
index c3730f4..35fdff7 100644
--- a/webassets/js/bands.js
+++ b/webassets/js/bands.js
@@ -26,7 +26,7 @@ function loadSpots() {
// 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", "sig"].forEach(fn => {
+ ["dx_continent", "de_continent", "mode", "source", "band", "sig"].forEach(fn => {
if (!allFilterOptionsSelected(fn)) {
str = str + getQueryStringFor(fn) + "&";
}
@@ -251,7 +251,7 @@ function loadOptions() {
generateSIGsMultiToggleFilterCard(options["sigs"]);
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]);
- generateMultiToggleFilterCard("#mode-options", "mode_type", options["mode_types"]);
+ generateModesMultiToggleFilterCard(options["modes"]);
generateSourcesMultiToggleFilterCard(options["spot_sources"], options["web-ui-options"]["spot-providers-enabled-by-default"]);
// Load URL params. These may select things from the various filter & display options, so the function needs
diff --git a/webassets/js/common.js b/webassets/js/common.js
index f3c5f0e..2e2eb29 100644
--- a/webassets/js/common.js
+++ b/webassets/js/common.js
@@ -28,7 +28,7 @@ function loadURLParams() {
updateFilterFromParam(params, "band", "band");
updateFilterFromParam(params, "sig", "sig");
updateFilterFromParam(params, "source", "source");
- updateFilterFromParam(params, "mode_type", "mode_type");
+ updateFilterFromParam(params, "mode", "mode");
updateFilterFromParam(params, "dx_continent", "dx_continent");
updateFilterFromParam(params, "de_continent", "de_continent");
}
diff --git a/webassets/js/map.js b/webassets/js/map.js
index aa10f9d..3c83a99 100644
--- a/webassets/js/map.js
+++ b/webassets/js/map.js
@@ -20,7 +20,7 @@ function loadSpots() {
// 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", "sig"].forEach(fn => {
+ ["dx_continent", "de_continent", "mode", "source", "band", "sig"].forEach(fn => {
if (!allFilterOptionsSelected(fn)) {
str = str + getQueryStringFor(fn) + "&";
}
@@ -183,7 +183,7 @@ function loadOptions() {
generateSIGsMultiToggleFilterCard(options["sigs"]);
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]);
- generateMultiToggleFilterCard("#mode-options", "mode_type", options["mode_types"]);
+ generateModesMultiToggleFilterCard(options["modes"]);
generateSourcesMultiToggleFilterCard(options["spot_sources"], options["web-ui-options"]["spot-providers-enabled-by-default"]);
// Load URL params. These may select things from the various filter & display options, so the function needs
diff --git a/webassets/js/spots.js b/webassets/js/spots.js
index 8ac14c3..f078531 100644
--- a/webassets/js/spots.js
+++ b/webassets/js/spots.js
@@ -87,7 +87,7 @@ function updateTimingDisplayRunPause() {
// 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", "sig"].forEach(fn => {
+ ["dx_continent", "de_continent", "mode", "source", "band", "sig"].forEach(fn => {
if (!allFilterOptionsSelected(fn)) {
str = str + getQueryStringFor(fn) + "&";
}
@@ -421,7 +421,7 @@ function loadOptions() {
generateSIGsMultiToggleFilterCard(options["sigs"]);
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]);
- generateMultiToggleFilterCard("#mode-options", "mode_type", options["mode_types"]);
+ generateModesMultiToggleFilterCard(options["modes"]);
generateSourcesMultiToggleFilterCard(options["spot_sources"], options["web-ui-options"]["spot-providers-enabled-by-default"]);
// Load URL params. These may select things from the various filter & display options, so the function needs
diff --git a/webassets/js/spotsbandsandmap.js b/webassets/js/spotsbandsandmap.js
index 3a79546..903aedc 100644
--- a/webassets/js/spotsbandsandmap.js
+++ b/webassets/js/spotsbandsandmap.js
@@ -47,6 +47,49 @@ function generateSIGsMultiToggleFilterCard(sig_options) {
$("#sig-options").append(` `);
}
+// Generate modes filter card. This one is also a special case.
+function generateModesMultiToggleFilterCard(mode_options) {
+ // Create a button for each option
+ mode_options.forEach(o => {
+ var domSafeName = o.replace(/^[^A-Za-z0-9]+|[^\w]+/gi, "");
+ $("#mode-options").append(` `);
+ });
+ // Create All/None buttons
+ $("#mode-options").append(` `);
+ // Create category buttons
+ $("#mode-options").append(` `);
+}
+
+// Toggle the mode toggles that relate to Analog Voice.
+function toggleAnalogVoiceModeToggles() {
+ toggleToggles("mode", ["PHONE", "SSB", "LSB", "USB", "AM", "FM"]);
+}
+
+// Toggle the mode toggles that relate to Digital Voice.
+function toggleDigitalVoiceModeToggles() {
+ toggleToggles("mode", ["DV", "DMR", "DSTAR", "C4FM", "M17"]);
+}
+
+// Toggle the mode toggles that relate to Digimodes.
+function toggleDigiModeToggles() {
+ toggleToggles("mode", ["DATA", "FT8", "FT4", "RTTY", "SSTV", "JS8", "HELL", "PSK", "OLIVIA", "PKT", "MSK144"]);
+}
+
+// Toggle the a set of toggles of the given type (e.g. "mode") that match the given values (e.g. ["SSB", "AM", "FM"]).
+function toggleToggles(type, values) {
+ let toggle = null;
+ $(".filter-button-" + type).each(function() {
+ console.log($(this));
+ if (values.includes($(this).val().replace("filter-button-" + type, ""))) {
+ if (toggle == null) {
+ toggle = !$(this).prop('checked');
+ }
+ $(this).prop('checked', toggle);
+ }
+ });
+ filtersUpdated();
+}
+
// Generate Sources filter card. This one is a minor special case as we create the buttons in the normal way, but then
// set which ones are enabled by default based on config rather than having them all enabled by default. We also sanitise
// names here for HTML elements.