From d83a979e46b128ffcaf2acfbb2ce6a6c567a8a83 Mon Sep 17 00:00:00 2001 From: Ian Renton Date: Mon, 31 Aug 2026 17:31:13 +0100 Subject: [PATCH] Move icons back into SIG data --- core/constants.py | 37 ++++++++++++++++++++++++--- core/sig_lookup_helper.py | 4 +++ data/sig.py | 2 ++ static/apidocs/openapi.yml | 1 + static/js/alerts.js | 4 +-- static/js/common.js | 13 ++++++++++ static/js/map.js | 4 +-- static/js/spots.js | 4 +-- static/js/spotsbandsandmap.js | 2 +- static/js/ui-ham.js | 47 ----------------------------------- templates/add_spot.html | 2 +- templates/alerts.html | 2 +- templates/bands.html | 4 +-- templates/base.html | 10 ++++---- templates/conditions.html | 2 +- templates/map.html | 4 +-- templates/spots.html | 4 +-- templates/status.html | 2 +- 18 files changed, 76 insertions(+), 72 deletions(-) diff --git a/core/constants.py b/core/constants.py index 7c38d93..640ed8d 100644 --- a/core/constants.py +++ b/core/constants.py @@ -16,139 +16,166 @@ SIGS = [ comment_names=["POTA"], description="Parks on the Air", ref_regex=r"[A-Z]{2}\-\d{4,5}|K\-TEST", + icon="fa-tree" ), SIG( name="SOTA", comment_names=["SOTA"], description="Summits on the Air", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}", + icon="fa-mountain-sun" ), SIG( name="WWFF", comment_names=["WWFF"], description="World Wide Flora & Fauna", ref_regex=r"[A-Z0-9]{1,3}FF\-\d{4}", + icon="fa-seedling" ), SIG( name="GMA", comment_names=["GMA"], description="Global Mountain Activity", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}", + icon="fa-person-hiking" ), SIG( name="WWBOTA", comment_names=["WWBOTA", "BOTA"], description="Worldwide Bunkers on the Air", ref_regex=r"B\/[A-Z0-9]{1,3}\-\d{3,4}", + icon="fa-radiation" ), SIG( name="HEMA", comment_names=["HEMA"], description="HuMPs Excluding Marilyns Award", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{3}\-\d{3}", + icon="fa-mound" ), SIG( name="IOTA", comment_names=["IOTA"], description="Islands on the Air", ref_regex=r"[A-Z]{2}\-\d{3}", + icon="fa-book-atlas" ), SIG( name="GMA Islands", comment_names=[], description="Global Mountain Activity - Islands", ref_regex=r"(([A-Z]{2}\-\d{3})|([A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}))", + icon="fa-person-hiking" ), SIG( name="MOTA", comment_names=["MOTA"], description="Mills on the Air", ref_regex=r"X\d{4,6}", + icon="fa-fan" ), SIG( name="ARLHS", comment_names=["ARLHS"], description="Amateur Radio Lighthouse Society", ref_regex=r"[A-Z]{3}[\- ]\d{3,4}", + icon="fa-house-flood-water" ), SIG( name="ILLW", comment_names=["ILLW"], description="International Lighthouse & Lightship Weekend", ref_regex=r"[A-Z]{2}\d{4}", + icon="fa-house-flood-water" ), SIG( name="SIOTA", comment_names=["SIOTA"], description="Silos on the Air", ref_regex=r"[A-Z]{2}\-[A-Z]{3}\d", + icon="fa-wheat-awn" ), SIG( name="WCA", comment_names=["WCA"], description="World Castles Award", ref_regex=r"[A-Z0-9]{1,3}\-\d{5}", + icon="fa-chess-rook" ), SIG( name="ZLOTA", comment_names=["ZLOTA"], description="New Zealand on the Air", ref_regex=r"ZL[A-Z]/[A-Z]{2}\-\d{3,4}", + icon="fa-kiwi-bird" ), SIG( name="WOTA", comment_names=["WOTA"], description="Wainwrights on the Air", ref_regex=r"[A-Z]{3}-[0-9]{2}", + icon="fa-w" + ), + SIG(name="BOTA", + comment_names=[], + description="Beaches on the Air", + icon="fa-umbrella-beach" ), - SIG(name="BOTA", comment_names=[], description="Beaches on the Air"), SIG( name="KRMNPA", comment_names=["KRMNPA"], description="Keith Roget Memorial National Parks Award", ref_regex=r"VKFF\-\d{4}", + icon="fa-earth-oceania" ), SIG( name="SANPCPA", comment_names=["SANPCPA"], description="South Australian National Parks and Conservation Parks Award", ref_regex=r"VKFF\-\d{4}", + icon="fa-earth-oceania" ), SIG( name="LLOTA", comment_names=["LLOTA"], description="Lagos y Lagunas on the Air", ref_regex=r"LL[A-Z]{2}\-\d{4}", + icon="fa-water" ), SIG( name="Towers", comment_names=["TOTA"], description="Towers on the Air", ref_regex=r"[A-Z]{2,3}R\-\d{4}", + icon="fa-tower-observation" ), SIG( name="Tiles", comment_names=[], description="Tiles on the Air", ref_regex=r"[A-Za-z]{2}[0-9]{2}[A-Za-z]{2}", + icon="fa-square" ), SIG( name="WAB", comment_names=["WAB"], description="Worked All Britain", ref_regex=r"[A-Z]{1,2}[0-9]{2}", + icon="fa-table-cells-large" ), SIG( name="WAI", comment_names=["WAI"], description="Worked All Ireland", ref_regex=r"[A-Z][0-9]{2}", + icon="fa-table-cells-large" ), SIG( name="DME", comment_names=["DME"], description="Diploma Municipios de EspaƱa", ref_regex=r"\d{4,5}", + icon="fa-building" ), SIG( name="FEA", @@ -157,23 +184,27 @@ SIGS = [ # FEA references are technically [DE]\-\d{4}(\.\d)? but spotters always seem to miss out the D- or E- # prefix and just use FEA 1234, so we treat FEA reference IDs as if they were just the number. ref_regex=r"\d{4}(\.\d)?", + icon="fa-house-flood-water" ), SIG( name="DTMBA", comment_names=["DTMBA"], description="Diploma Teatri Musei e Belle Arti", ref_regex=r"I-?[0-9]{3,4}\s?[A-Z]{2}", + icon="fa-masks-theater" ), SIG( - name="BIOWTA", + name="BIWOTA", comment_names=["BIWOTA"], - description="British Inland Waterways on the Air" + description="British Inland Waterways on the Air", + icon="fa-ship" ), SIG( name="Toilets", comment_names=[], description="Toilets on the Air", ref_regex=r"T\-[0-9]{2}", + icon="fa-toilet" ), ] diff --git a/core/sig_lookup_helper.py b/core/sig_lookup_helper.py index 032ce5c..25e08be 100644 --- a/core/sig_lookup_helper.py +++ b/core/sig_lookup_helper.py @@ -78,6 +78,10 @@ def get_sig_ref_info(sig, ref_id): sig_ref.url = f"https://www.beachesontheair.com/beaches/{sig_ref.name.lower().replace(' ', '-')}" return sig_ref + elif sig.upper() == "BIWOTA": + # For BIWOTA there are no references, all we can set is a type + sig_ref.ref_type = "Waterway" + elif sig.upper() == "GMA Islands": # GMA Islands is a bit of a mess of GMA and IOTA references. Try looking them both up and see what returns # the best result. diff --git a/data/sig.py b/data/sig.py index 3a4b336..aa27b3b 100644 --- a/data/sig.py +++ b/data/sig.py @@ -19,3 +19,5 @@ class SIG: comment_names: list[str] = field(default_factory=list) # Regex matcher for references, e.g. for POTA r"[A-Z]{2}\-\d+". ref_regex: str | None = None + # Icon to use in the UI when referencing this SIG. Chosen from the Font Awesome set. + icon: str | None = None diff --git a/static/apidocs/openapi.yml b/static/apidocs/openapi.yml index 856d0a5..f4902da 100644 --- a/static/apidocs/openapi.yml +++ b/static/apidocs/openapi.yml @@ -19,6 +19,7 @@ info: * Added DTMBA, FEA and BIWOTA SIGs * Removed the distinction between LSB & USB (both will now show as SSB) and between the various digital voice modes, which will now show as DV. + * Added `icon` to SIG information ### 2.0 diff --git a/static/js/alerts.js b/static/js/alerts.js index fc4e37e..9c4461d 100644 --- a/static/js/alerts.js +++ b/static/js/alerts.js @@ -264,7 +264,7 @@ function addAlertRowsToTable(tbody, alerts) { $tr.append(`${commentText}`); } if (showSource) { - $tr.append(` ${sigSourceText}`); + $tr.append(` ${sigSourceText}`); } if (showRef) { $tr.append(`${sig_refs}`); @@ -282,7 +282,7 @@ function addAlertRowsToTable(tbody, alerts) { const $td2 = $(""); if (showSource) { - $td2.append(` `); + $td2.append(` `); } if (showRef) { $td2.append(`${sig_refs} `); diff --git a/static/js/common.js b/static/js/common.js index dd543ea..e7ffaf5 100644 --- a/static/js/common.js +++ b/static/js/common.js @@ -285,6 +285,19 @@ function callWanted(call) { } } +// Get the Font Awesome icon for a given SIG. If the SIG is unknown, the provided default symbol will be returned +// The sig is provided by name as a string, while all_sigs contains all the SIG info from the options call. This +// is because sometimes the sig name arrives via a spot and therefore we need to look up the rest of the SIG data +// separately. +function sigToIcon(sig, all_sigs, defaultIcon) { + if (sig) { + const match = all_sigs.find((check_sig) => check_sig["name"].toUpperCase() === sig.toUpperCase()); + if (match) { + return match["icon"]; + } + } + return defaultIcon; +} // Startup $(document).ready(function () { diff --git a/static/js/map.js b/static/js/map.js index d534bd1..68cbf20 100644 --- a/static/js/map.js +++ b/static/js/map.js @@ -223,7 +223,7 @@ function updateMap() { // 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: sigToIcon(s["sig"], "fa-tower-cell"), + icon: sigToIcon(s["sig"], options["sigs"], "fa-tower-cell"), iconColor: bandToContrastColor(s["band"]), markerColor: bandToColor(s["band"]), shape: 'circle', @@ -303,7 +303,7 @@ function getTooltipText(s) { ttt += "
"; // Source / SIG / Ref - ttt += ` ${sigSourceText} ${sig_refs}
`; + ttt += ` ${sigSourceText} ${sig_refs}
`; // Time ttt += ` ${moment.unix(s["time"]).fromNow()}`; diff --git a/static/js/spots.js b/static/js/spots.js index 902a94e..372dfe0 100644 --- a/static/js/spots.js +++ b/static/js/spots.js @@ -398,7 +398,7 @@ function createNewTableRowsForSpot(s, highlightNew) { $tr.append(`${distanceText}`); } if (showType) { - $tr.append(` ${typeText}`); + $tr.append(` ${typeText}`); } if (showRef) { $tr.append(`${sig_refs}`); @@ -430,7 +430,7 @@ function createNewTableRowsForSpot(s, highlightNew) { const $td2 = $(""); const $td2floatleft = $(`
`); if (showType) { - $td2floatleft.append(` ${typeText} `); + $td2floatleft.append(` ${typeText} `); } if (showRef) { $td2floatleft.append(`${sig_refs} `); diff --git a/static/js/spotsbandsandmap.js b/static/js/spotsbandsandmap.js index 0079df2..62ca35d 100644 --- a/static/js/spotsbandsandmap.js +++ b/static/js/spotsbandsandmap.js @@ -43,7 +43,7 @@ function generateSIGsMultiToggleFilterCard(sig_options) { const $grid = $('
'); sig_options.forEach(o => { const domSafeName = o["name"].replace(/^[^A-Za-z0-9]+|[^\w]+/gi, ""); - $grid.append(`
`); + $grid.append(`
`); }); // Bonus "NO_SIG" / "General DX" option $grid.append(`
`); diff --git a/static/js/ui-ham.js b/static/js/ui-ham.js index ad9f5ab..2152ec5 100644 --- a/static/js/ui-ham.js +++ b/static/js/ui-ham.js @@ -323,50 +323,3 @@ function bandToContrastColor(band) { const lum = 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]; return (lum > 128) ? "#000000" : "#ffffff"; } - -const SIG_ICONS = { - "POTA": "fa-tree", - "SOTA": "fa-mountain-sun", - "WWFF": "fa-seedling", - "GMA": "fa-person-hiking", - "GMA Islands": "fa-person-hiking", - "WWBOTA": "fa-radiation", - "HEMA": "fa-mound", - "IOTA": "fa-book-atlas", - "MOTA": "fa-fan", - "ARLHS": "fa-house-flood-water", - "ILLW": "fa-house-flood-water", - "SIOTA": "fa-wheat-awn", - "WCA": "fa-chess-rook", - "ZLOTA": "fa-kiwi-bird", - "WOTA": "fa-w", - "BOTA": "fa-umbrella-beach", - "KRMNPA": "fa-earth-oceania", - "SANPCPA": "fa-earth-oceania", - "LLOTA": "fa-water", - "Towers": "fa-tower-observation", - "WAB": "fa-table-cells-large", - "WAI": "fa-table-cells-large", - "DME": "fa-building", - "FEA": "fa-house-flood-water", - "Tiles": "fa-square", - "DTMBA": "fa-masks-theater", - "BIWOTA": "fa-ship", - "Toilets": "fa-toilet" -} - -// Get the Font Awesome icon for a given SIG. If the SIG is unknown, the provided default symbol will be returned -function sigToIcon(sig, defaultIcon) { - let col = (sig != null) ? SIG_ICONS[sig] : null; - if (col) { - return col; - } else { - let col = (sig != null) ? SIG_ICONS[sig.toUpperCase()] : null; - if (col) { - return col; - } else { - return defaultIcon; - } - } -} - diff --git a/templates/add_spot.html b/templates/add_spot.html index 23c7786..13f2a77 100644 --- a/templates/add_spot.html +++ b/templates/add_spot.html @@ -76,7 +76,7 @@
- + diff --git a/templates/alerts.html b/templates/alerts.html index 2abe6ba..1917eae 100644 --- a/templates/alerts.html +++ b/templates/alerts.html @@ -84,7 +84,7 @@
- + diff --git a/templates/bands.html b/templates/bands.html index 95ccada..5cdebb2 100644 --- a/templates/bands.html +++ b/templates/bands.html @@ -76,8 +76,8 @@ - - + + diff --git a/templates/base.html b/templates/base.html index d441dbd..e7d90ff 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,6 +1,6 @@ {% extends "skeleton.html" %} {% block head_extra %} - + @@ -15,10 +15,10 @@ window.fetchEventSource = fetchEventSource; - - - - + + + + {% end %} {% block body %}
diff --git a/templates/conditions.html b/templates/conditions.html index 3b6c1c6..dd51cb3 100644 --- a/templates/conditions.html +++ b/templates/conditions.html @@ -284,7 +284,7 @@
- + diff --git a/templates/map.html b/templates/map.html index 96beb9e..4ee950f 100644 --- a/templates/map.html +++ b/templates/map.html @@ -113,8 +113,8 @@ const CARTODB_API_KEY = "{{ web_ui_options.get('cartodb_api_key', '') }}"; - - + + diff --git a/templates/spots.html b/templates/spots.html index e9830fd..32fde52 100644 --- a/templates/spots.html +++ b/templates/spots.html @@ -113,8 +113,8 @@ - - + + diff --git a/templates/status.html b/templates/status.html index 2a183ba..018c842 100644 --- a/templates/status.html +++ b/templates/status.html @@ -86,7 +86,7 @@ - +