mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2026-02-04 09:14:30 +00:00
Allow filtering based on mode, not just mode type. #96
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
$schema: "https://spec.openapis.org/oas/3.1.0"
|
||||||
openapi: 3.1.0
|
openapi: 3.1.0
|
||||||
info:
|
info:
|
||||||
title: Spothole API
|
title: Spothole API
|
||||||
@@ -864,7 +865,6 @@ components:
|
|||||||
- DSTAR
|
- DSTAR
|
||||||
- C4FM
|
- C4FM
|
||||||
- M17
|
- M17
|
||||||
- DIGI
|
|
||||||
- DATA
|
- DATA
|
||||||
- FT8
|
- FT8
|
||||||
- FT4
|
- FT4
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ function loadSpots() {
|
|||||||
// Build a query string for the API, based on the filters that the user has selected.
|
// Build a query string for the API, based on the filters that the user has selected.
|
||||||
function buildQueryString() {
|
function buildQueryString() {
|
||||||
var str = "?";
|
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)) {
|
if (!allFilterOptionsSelected(fn)) {
|
||||||
str = str + getQueryStringFor(fn) + "&";
|
str = str + getQueryStringFor(fn) + "&";
|
||||||
}
|
}
|
||||||
@@ -251,7 +251,7 @@ function loadOptions() {
|
|||||||
generateSIGsMultiToggleFilterCard(options["sigs"]);
|
generateSIGsMultiToggleFilterCard(options["sigs"]);
|
||||||
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
||||||
generateMultiToggleFilterCard("#de-continent-options", "de_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"]);
|
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
|
// Load URL params. These may select things from the various filter & display options, so the function needs
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ function loadURLParams() {
|
|||||||
updateFilterFromParam(params, "band", "band");
|
updateFilterFromParam(params, "band", "band");
|
||||||
updateFilterFromParam(params, "sig", "sig");
|
updateFilterFromParam(params, "sig", "sig");
|
||||||
updateFilterFromParam(params, "source", "source");
|
updateFilterFromParam(params, "source", "source");
|
||||||
updateFilterFromParam(params, "mode_type", "mode_type");
|
updateFilterFromParam(params, "mode", "mode");
|
||||||
updateFilterFromParam(params, "dx_continent", "dx_continent");
|
updateFilterFromParam(params, "dx_continent", "dx_continent");
|
||||||
updateFilterFromParam(params, "de_continent", "de_continent");
|
updateFilterFromParam(params, "de_continent", "de_continent");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ function loadSpots() {
|
|||||||
// Build a query string for the API, based on the filters that the user has selected.
|
// Build a query string for the API, based on the filters that the user has selected.
|
||||||
function buildQueryString() {
|
function buildQueryString() {
|
||||||
var str = "?";
|
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)) {
|
if (!allFilterOptionsSelected(fn)) {
|
||||||
str = str + getQueryStringFor(fn) + "&";
|
str = str + getQueryStringFor(fn) + "&";
|
||||||
}
|
}
|
||||||
@@ -183,7 +183,7 @@ function loadOptions() {
|
|||||||
generateSIGsMultiToggleFilterCard(options["sigs"]);
|
generateSIGsMultiToggleFilterCard(options["sigs"]);
|
||||||
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
||||||
generateMultiToggleFilterCard("#de-continent-options", "de_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"]);
|
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
|
// Load URL params. These may select things from the various filter & display options, so the function needs
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ function updateTimingDisplayRunPause() {
|
|||||||
// Build a query string for the API, based on the filters that the user has selected.
|
// Build a query string for the API, based on the filters that the user has selected.
|
||||||
function buildQueryString() {
|
function buildQueryString() {
|
||||||
var str = "?";
|
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)) {
|
if (!allFilterOptionsSelected(fn)) {
|
||||||
str = str + getQueryStringFor(fn) + "&";
|
str = str + getQueryStringFor(fn) + "&";
|
||||||
}
|
}
|
||||||
@@ -421,7 +421,7 @@ function loadOptions() {
|
|||||||
generateSIGsMultiToggleFilterCard(options["sigs"]);
|
generateSIGsMultiToggleFilterCard(options["sigs"]);
|
||||||
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]);
|
||||||
generateMultiToggleFilterCard("#de-continent-options", "de_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"]);
|
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
|
// Load URL params. These may select things from the various filter & display options, so the function needs
|
||||||
|
|||||||
@@ -47,6 +47,49 @@ function generateSIGsMultiToggleFilterCard(sig_options) {
|
|||||||
$("#sig-options").append(` <span style="display: inline-block"><button id="filter-button-sig-all" type="button" class="btn btn-outline-secondary" onclick="toggleFilterButtons('sig', true);">All</button> <button id="filter-button-sig-none" type="button" class="btn btn-outline-secondary" onclick="toggleFilterButtons('sig', false);">None</button></span>`);
|
$("#sig-options").append(` <span style="display: inline-block"><button id="filter-button-sig-all" type="button" class="btn btn-outline-secondary" onclick="toggleFilterButtons('sig', true);">All</button> <button id="filter-button-sig-none" type="button" class="btn btn-outline-secondary" onclick="toggleFilterButtons('sig', false);">None</button></span>`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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(`<input type="checkbox" class="btn-check filter-button-mode storeable-checkbox" name="options" id="filter-button-mode-${domSafeName}" value="${o}" autocomplete="off" onClick="filtersUpdated()" checked><label class="btn btn-outline-primary" id="filter-button-label-mode-${domSafeName}" for="filter-button-mode-${domSafeName}">${o}</label> `);
|
||||||
|
});
|
||||||
|
// Create All/None buttons
|
||||||
|
$("#mode-options").append(` <span style="display: inline-block"><button id="filter-button-mode-all" type="button" class="btn btn-outline-secondary" onclick="toggleFilterButtons('mode', true);">All</button> <button id="filter-button-mode-none" type="button" class="btn btn-outline-secondary" onclick="toggleFilterButtons('mode', false);">None</button></span>`);
|
||||||
|
// Create category buttons
|
||||||
|
$("#mode-options").append(` <button id="filter-button-mode-av" type="button" class="btn btn-outline-secondary" onclick="toggleAnalogVoiceModeToggles();">Analog Voice</button> <button id="filter-button-mode-dv" type="button" class="btn btn-outline-secondary" onclick="toggleDigitalVoiceModeToggles();">Digital Voice</button> <button id="filter-button-mode-digi" type="button" class="btn btn-outline-secondary" onclick="toggleDigiModeToggles();">Digimodes</button></span>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
// 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
|
// 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.
|
// names here for HTML elements.
|
||||||
|
|||||||
Reference in New Issue
Block a user