From 06d582ae2debbf7665ec2d2464781bfc66f66fee Mon Sep 17 00:00:00 2001 From: Ian Renton Date: Tue, 30 Dec 2025 19:08:27 +0000 Subject: [PATCH] Separate colours and icons out of the Spothole API and re-implement them in the client; provide new colour schemes. #88 --- alertproviders/ng3k.py | 1 - core/constants.py | 92 ++++---- core/sig_utils.py | 8 - data/alert.py | 8 +- data/band.py | 6 +- data/sig.py | 3 - data/spot.py | 22 +- spotproviders/aprsis.py | 1 - spotproviders/dxcluster.py | 1 - spotproviders/rbn.py | 1 - spotproviders/ukpacketnet.py | 1 - templates/about.html | 6 +- templates/add_spot.html | 8 +- templates/alerts.html | 8 +- templates/bands.html | 15 +- templates/base.html | 1 + templates/map.html | 15 +- templates/spots.html | 25 +- templates/status.html | 8 +- webassets/apidocs/openapi.yml | 28 --- webassets/js/alerts.js | 4 +- webassets/js/bands.js | 28 ++- webassets/js/common.js | 157 +------------ webassets/js/ham-utils/geo.js | 99 ++++++++ webassets/js/ham-utils/storage.js | 32 +++ webassets/js/ham-utils/ui.js | 372 ++++++++++++++++++++++++++++++ webassets/js/ham-utils/utils.js | 20 ++ webassets/js/map.js | 46 ++-- webassets/js/spots.js | 28 ++- webassets/js/spotsbandsandmap.js | 16 +- 30 files changed, 717 insertions(+), 343 deletions(-) create mode 100644 webassets/js/ham-utils/geo.js create mode 100644 webassets/js/ham-utils/storage.js create mode 100644 webassets/js/ham-utils/ui.js create mode 100644 webassets/js/ham-utils/utils.js diff --git a/alertproviders/ng3k.py b/alertproviders/ng3k.py index fa487b1..9bb1a72 100644 --- a/alertproviders/ng3k.py +++ b/alertproviders/ng3k.py @@ -76,7 +76,6 @@ class NG3K(HTTPAlertProvider): dx_country=dx_country, freqs_modes=bands + (("; " + modes) if modes != "" else ""), comment=by + "; " + comment + "; " + qsl_info, - icon="globe-africa", start_time=start_timestamp, end_time=end_timestamp, is_dxpedition=True) diff --git a/core/constants.py b/core/constants.py index 3cfa51b..f127166 100644 --- a/core/constants.py +++ b/core/constants.py @@ -12,25 +12,25 @@ HAMQTH_PRG = (SOFTWARE_NAME + " v" + SOFTWARE_VERSION + " operated by " + SERVER # Special Interest Groups SIGS = [ - SIG(name="POTA", description="Parks on the Air", icon="tree", ref_regex=r"[A-Z]{2}\-\d{4,5}"), - SIG(name="SOTA", description="Summits on the Air", icon="mountain-sun", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}"), - SIG(name="WWFF", description="World Wide Flora & Fauna", icon="seedling", ref_regex=r"[A-Z0-9]{1,3}FF\-\d{4}"), - SIG(name="GMA", description="Global Mountain Activity", icon="person-hiking", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}"), - SIG(name="WWBOTA", description="Worldwide Bunkers on the Air", icon="radiation", ref_regex=r"B\/[A-Z0-9]{1,3}\-\d{3,4}"), - SIG(name="HEMA", description="HuMPs Excluding Marilyns Award", icon="mound", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{3}\-\d{3}"), - SIG(name="IOTA", description="Islands on the Air", icon="umbrella-beach", ref_regex=r"[A-Z]{2}\-\d{3}"), - SIG(name="MOTA", description="Mills on the Air", icon="fan", ref_regex=r"X\d{4-6}"), - SIG(name="ARLHS", description="Amateur Radio Lighthouse Society", icon="tower-observation", ref_regex=r"[A-Z]{3}\-\d{3,4}"), - SIG(name="ILLW", description="International Lighthouse & Lightship Weekend", icon="tower-observation", ref_regex=r"[A-Z]{2}\d{4}"), - SIG(name="SIOTA", description="Silos on the Air", icon="wheat-awn", ref_regex=r"[A-Z]{2}\-[A-Z]{3}\d"), - SIG(name="WCA", description="World Castles Award", icon="chess-rook", ref_regex=r"[A-Z0-9]{1,3}\-\d{5}"), - SIG(name="ZLOTA", description="New Zealand on the Air", icon="kiwi-bird", ref_regex=r"ZL[A-Z]/[A-Z]{2}\-\d{3,4}"), - SIG(name="WOTA", description="Wainwrights on the Air", icon="w", ref_regex=r"[A-Z]{3}-[0-9]{2}"), - SIG(name="BOTA", description="Beaches on the Air", icon="water"), - SIG(name="KRMNPA", description="Keith Roget Memorial National Parks Award", icon="earth-oceania"), - SIG(name="WAB", description="Worked All Britain", icon="table-cells-large", ref_regex=r"[A-Z]{1,2}[0-9]{2}"), - SIG(name="WAI", description="Worked All Ireland", icon="table-cells-large", ref_regex=r"[A-Z][0-9]{2}"), - SIG(name="TOTA", description="Toilets on the Air", icon="toilet", ref_regex=r"T\-[0-9]{2}") + SIG(name="POTA", description="Parks on the Air", ref_regex=r"[A-Z]{2}\-\d{4,5}"), + SIG(name="SOTA", description="Summits on the Air", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}"), + SIG(name="WWFF", description="World Wide Flora & Fauna", ref_regex=r"[A-Z0-9]{1,3}FF\-\d{4}"), + SIG(name="GMA", description="Global Mountain Activity", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}"), + SIG(name="WWBOTA", description="Worldwide Bunkers on the Air", ref_regex=r"B\/[A-Z0-9]{1,3}\-\d{3,4}"), + SIG(name="HEMA", description="HuMPs Excluding Marilyns Award", ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{3}\-\d{3}"), + SIG(name="IOTA", description="Islands on the Air", ref_regex=r"[A-Z]{2}\-\d{3}"), + SIG(name="MOTA", description="Mills on the Air", ref_regex=r"X\d{4-6}"), + SIG(name="ARLHS", description="Amateur Radio Lighthouse Society", ref_regex=r"[A-Z]{3}\-\d{3,4}"), + SIG(name="ILLW", description="International Lighthouse & Lightship Weekend", ref_regex=r"[A-Z]{2}\d{4}"), + SIG(name="SIOTA", description="Silos on the Air", ref_regex=r"[A-Z]{2}\-[A-Z]{3}\d"), + SIG(name="WCA", description="World Castles Award", ref_regex=r"[A-Z0-9]{1,3}\-\d{5}"), + SIG(name="ZLOTA", description="New Zealand on the Air", ref_regex=r"ZL[A-Z]/[A-Z]{2}\-\d{3,4}"), + SIG(name="WOTA", description="Wainwrights on the Air", ref_regex=r"[A-Z]{3}-[0-9]{2}"), + SIG(name="BOTA", description="Beaches on the Air"), + SIG(name="KRMNPA", description="Keith Roget Memorial National Parks Award"), + SIG(name="WAB", description="Worked All Britain", ref_regex=r"[A-Z]{1,2}[0-9]{2}"), + SIG(name="WAI", description="Worked All Ireland", ref_regex=r"[A-Z][0-9]{2}"), + SIG(name="TOTA", description="Toilets on the Air", ref_regex=r"T\-[0-9]{2}") ] # Modes. Note "DIGI" and "DIGITAL" are also supported but are normalised into "DATA". @@ -42,33 +42,33 @@ MODE_TYPES = ["CW", "PHONE", "DATA"] # Band definitions BANDS = [ - Band(name="2200m", start_freq=135700, end_freq=137800, color="#ff4500", contrast_color="white"), - Band(name="600m", start_freq=472000, end_freq=479000, color="#1e90ff", contrast_color="white"), - Band(name="160m", start_freq=1800000, end_freq=2000000, color="#7cfc00", contrast_color="black"), - Band(name="80m", start_freq=3500000, end_freq=4000000, color="#e550e5", contrast_color="black"), - Band(name="60m", start_freq=5250000, end_freq=5410000, color="#00008b", contrast_color="white"), - Band(name="40m", start_freq=7000000, end_freq=7300000, color="#5959ff", contrast_color="white"), - Band(name="30m", start_freq=10100000, end_freq=10150000, color="#62d962", contrast_color="black"), - Band(name="20m", start_freq=14000000, end_freq=14350000, color="#f2c40c", contrast_color="black"), - Band(name="17m", start_freq=18068000, end_freq=18168000, color="#f2f261", contrast_color="black"), - Band(name="15m", start_freq=21000000, end_freq=21450000, color="#cca166", contrast_color="black"), - Band(name="12m", start_freq=24890000, end_freq=24990000, color="#b22222", contrast_color="white"), - Band(name="11m", start_freq=26965000, end_freq=27405000, color="#00ff00", contrast_color="black"), - Band(name="10m", start_freq=28000000, end_freq=29700000, color="#ff69b4", contrast_color="black"), - Band(name="6m", start_freq=50000000, end_freq=54000000, color="#FF0000", contrast_color="white"), - Band(name="5m", start_freq=56000000, end_freq=60500000, color="#e0e0e0", contrast_color="black"), - Band(name="4m", start_freq=70000000, end_freq=70500000, color="#cc0044", contrast_color="white"), - Band(name="2m", start_freq=144000000, end_freq=148000000, color="#FF1493", contrast_color="black"), - Band(name="1.25m", start_freq=219000000, end_freq=225000000, color="#CCFF00", contrast_color="black"), - Band(name="70cm", start_freq=420000000, end_freq=450000000, color="#999900", contrast_color="white"), - Band(name="23cm", start_freq=1240000000, end_freq=1325000000, color="#5AB8C7", contrast_color="black"), - Band(name="2.4GHz", start_freq=2300000000, end_freq=2450000000, color="#FF7F50", contrast_color="black"), - Band(name="5.8GHz", start_freq=5725000000, end_freq=5850000000, color="#cc0099", contrast_color="white"), - Band(name="10GHz", start_freq=10000000000, end_freq=10500000000, color="#696969", contrast_color="white"), - Band(name="24GHz", start_freq=24000000000, end_freq=24050000000, color="#f3edc6", contrast_color="black"), - Band(name="47GHz", start_freq=47000000000, end_freq=47200000000, color="#ffe786", contrast_color="black"), - Band(name="76GHz", start_freq=75500000000, end_freq=81500000000, color="#baf9d8", contrast_color="black")] -UNKNOWN_BAND = Band(name="Unknown", start_freq=0, end_freq=0, color="black", contrast_color="white") + Band(name="2200m", start_freq=135700, end_freq=137800), + Band(name="600m", start_freq=472000, end_freq=479000), + Band(name="160m", start_freq=1800000, end_freq=2000000), + Band(name="80m", start_freq=3500000, end_freq=4000000), + Band(name="60m", start_freq=5250000, end_freq=5410000), + Band(name="40m", start_freq=7000000, end_freq=7300000), + Band(name="30m", start_freq=10100000, end_freq=10150000), + Band(name="20m", start_freq=14000000, end_freq=14350000), + Band(name="17m", start_freq=18068000, end_freq=18168000), + Band(name="15m", start_freq=21000000, end_freq=21450000), + Band(name="12m", start_freq=24890000, end_freq=24990000), + Band(name="11m", start_freq=26965000, end_freq=27405000), + Band(name="10m", start_freq=28000000, end_freq=29700000), + Band(name="6m", start_freq=50000000, end_freq=54000000), + Band(name="5m", start_freq=56000000, end_freq=60500000), + Band(name="4m", start_freq=70000000, end_freq=70500000), + Band(name="2m", start_freq=144000000, end_freq=148000000), + Band(name="1.25m", start_freq=219000000, end_freq=225000000), + Band(name="70cm", start_freq=420000000, end_freq=450000000), + Band(name="23cm", start_freq=1240000000, end_freq=1325000000), + Band(name="2.4GHz", start_freq=2300000000, end_freq=2450000000), + Band(name="5.8GHz", start_freq=5725000000, end_freq=5850000000), + Band(name="10GHz", start_freq=10000000000, end_freq=10500000000), + Band(name="24GHz", start_freq=24000000000, end_freq=24050000000), + Band(name="47GHz", start_freq=47000000000, end_freq=47200000000), + Band(name="76GHz", start_freq=75500000000, end_freq=81500000000)] +UNKNOWN_BAND = Band(name="Unknown", start_freq=0, end_freq=0) # Continents CONTINENTS = ["EU", "NA", "SA", "AS", "AF", "OC", "AN"] diff --git a/core/sig_utils.py b/core/sig_utils.py index 151a100..7afc8fc 100644 --- a/core/sig_utils.py +++ b/core/sig_utils.py @@ -8,14 +8,6 @@ from core.constants import SIGS, HTTP_HEADERS from core.geo_utils import wab_wai_square_to_lat_lon -# Utility function to get the icon for a named SIG. If no match is found, the "circle-question" icon will be returned. -def get_icon_for_sig(sig): - for s in SIGS: - if s.name == sig: - return s.icon - return "circle-question" - - # Utility function to get the regex string for a SIG reference for a named SIG. If no match is found, None will be returned. def get_ref_regex_for_sig(sig): for s in SIGS: diff --git a/data/alert.py b/data/alert.py index 17b07f8..508057e 100644 --- a/data/alert.py +++ b/data/alert.py @@ -7,7 +7,7 @@ from datetime import datetime, timedelta import pytz from core.lookup_helper import lookup_helper -from core.sig_utils import get_icon_for_sig, populate_sig_ref_info +from core.sig_utils import populate_sig_ref_info # Data class that defines an alert. @@ -55,8 +55,6 @@ class Alert: sig_refs: list = None # Activation score. SOTA only activation_score: int = None - # Icon, from the Font Awesome set. This is fairly opinionated but is here to help the alerthole web UI and Field alertter. Does not include the "fa-" prefix. - icon: str = None # Whether this alert is for a DXpedition, as opposed to e.g. an xOTA programme. is_dxpedition: bool = False # Where we got the alert from, e.g. "POTA", "SOTA"... @@ -109,10 +107,6 @@ class Alert: if self.sig_refs and len(self.sig_refs) > 0 and not self.sig: self.sig = self.sig_refs[0].sig - # Icon from SIG - if self.sig and not self.icon: - self.icon = get_icon_for_sig(self.sig) - # DX operator details lookup, using QRZ.com. This should be the last resort compared to taking the data from # the actual alertting service, e.g. we don't want to accidentally use a user's QRZ.com home lat/lon instead of # the one from the park reference they're at. diff --git a/data/band.py b/data/band.py index 011d97f..56dd099 100644 --- a/data/band.py +++ b/data/band.py @@ -8,8 +8,4 @@ class Band: # Start frequency, in Hz start_freq: float # Stop frequency, in Hz - end_freq: float - # Colour to use for this band, as per PSK Reporter - color: str - # Contrast colour to use for text against a background of the band colour - contrast_color: str \ No newline at end of file + end_freq: float \ No newline at end of file diff --git a/data/sig.py b/data/sig.py index a0de179..64688c5 100644 --- a/data/sig.py +++ b/data/sig.py @@ -7,8 +7,5 @@ class SIG: name: str # Description, e.g. "Parks on the Air" description: str - # Icon to use for it, from the Font Awesome set. This is fairly opinionated but is here to help the Spothole web UI - # and Field Spotter. Does not include the "fa-" prefix. - icon: str # Regex matcher for references, e.g. for POTA r"[A-Z]{2}\-\d+". ref_regex: str = None \ No newline at end of file diff --git a/data/spot.py b/data/spot.py index 2b365db..a41ccfa 100644 --- a/data/spot.py +++ b/data/spot.py @@ -11,7 +11,7 @@ from pyhamtools.locator import locator_to_latlong, latlong_to_locator from core.config import MAX_SPOT_AGE from core.lookup_helper import lookup_helper -from core.sig_utils import get_icon_for_sig, populate_sig_ref_info, ANY_SIG_REGEX, get_ref_regex_for_sig +from core.sig_utils import populate_sig_ref_info, ANY_SIG_REGEX, get_ref_regex_for_sig from data.sig_ref import SIGRef @@ -109,16 +109,6 @@ class Spot: # Activation score. SOTA only activation_score: int = None - # Display guidance (optional) - - # Icon, from the Font Awesome set. This is fairly opinionated but is here to help the Spothole web UI and Field - # Spotter. Does not include the "fa-" prefix. - icon: str = None - # Colour to represent this spot, if a client chooses to colour spots based on their frequency band, using PSK - # Reporter's default colours. HTML colour e.g. hex. A contrast colour is also provided which will be black or white. - band_color: str = None - band_contrast_color: str = None - # Timing info # Time of the spot, UTC seconds since UNIX epoch @@ -214,8 +204,6 @@ class Spot: if self.freq and not self.band: band = lookup_helper.infer_band_from_freq(self.freq) self.band = band.name - self.band_color = band.color - self.band_contrast_color = band.contrast_color # Mode from comments or bandplan if self.mode: @@ -296,14 +284,6 @@ class Spot: if self.sig_refs and len(self.sig_refs) > 0 and not self.sig: self.sig = self.sig_refs[0].sig - # Icon from SIG if we have one - if self.sig: - self.icon = get_icon_for_sig(self.sig) - - # Default "radio" icon if nothing else has set it - if not self.icon: - self.icon = "tower-cell" - # DX Grid to lat/lon and vice versa in case one is missing if self.dx_grid and not self.dx_latitude: ll = locator_to_latlong(self.dx_grid) diff --git a/spotproviders/aprsis.py b/spotproviders/aprsis.py index fa56bb9..da27afb 100644 --- a/spotproviders/aprsis.py +++ b/spotproviders/aprsis.py @@ -51,7 +51,6 @@ class APRSIS(SpotProvider): comment=data["comment"] if "comment" in data else None, dx_latitude=data["latitude"] if "latitude" in data else None, dx_longitude=data["longitude"] if "longitude" in data else None, - icon="tower-cell", time=datetime.now(pytz.UTC).timestamp()) # APRS-IS spots are live so we can assume spot time is "now" # Add to our list diff --git a/spotproviders/dxcluster.py b/spotproviders/dxcluster.py index 433b3d3..173829c 100644 --- a/spotproviders/dxcluster.py +++ b/spotproviders/dxcluster.py @@ -72,7 +72,6 @@ class DXCluster(SpotProvider): de_call=match.group(1), freq=float(match.group(2)) * 1000, comment=match.group(4).strip(), - icon="tower-cell", time=spot_datetime.timestamp()) # Add to our list diff --git a/spotproviders/rbn.py b/spotproviders/rbn.py index 1e09d17..b8ac373 100644 --- a/spotproviders/rbn.py +++ b/spotproviders/rbn.py @@ -70,7 +70,6 @@ class RBN(SpotProvider): de_call=match.group(1), freq=float(match.group(2)) * 1000, comment=match.group(4).strip(), - icon="tower-cell", time=spot_datetime.timestamp()) # Add to our list diff --git a/spotproviders/ukpacketnet.py b/spotproviders/ukpacketnet.py index b141fd5..0ee734a 100644 --- a/spotproviders/ukpacketnet.py +++ b/spotproviders/ukpacketnet.py @@ -61,7 +61,6 @@ class UKPacketNet(HTTPSpotProvider): freq=freq, mode="PKT", comment=comment, - icon="tower-cell", time=datetime.strptime(heard["lastHeard"], "%Y-%m-%d %H:%M:%S").replace(tzinfo=pytz.UTC).timestamp(), de_grid=node["location"]["locator"] if "locator" in node["location"] else None, de_latitude=node["location"]["coords"]["lat"], diff --git a/templates/about.html b/templates/about.html index 1eeb600..a95187b 100644 --- a/templates/about.html +++ b/templates/about.html @@ -63,7 +63,11 @@

This software is dedicated to the memory of Tom G1PJB, SK, a friend and colleague who sadly passed away around the time I started writing it in Autumn 2025. I was looking forward to showing it to you when it was done.

- + + + + + {% end %} \ No newline at end of file diff --git a/templates/add_spot.html b/templates/add_spot.html index 51f18d2..ba4a4e1 100644 --- a/templates/add_spot.html +++ b/templates/add_spot.html @@ -69,8 +69,12 @@ - - + + + + + + {% end %} \ No newline at end of file diff --git a/templates/alerts.html b/templates/alerts.html index a68c185..dc8cbac 100644 --- a/templates/alerts.html +++ b/templates/alerts.html @@ -168,8 +168,12 @@ - - + + + + + + {% end %} \ No newline at end of file diff --git a/templates/bands.html b/templates/bands.html index 8391f8a..d66d2d3 100644 --- a/templates/bands.html +++ b/templates/bands.html @@ -117,6 +117,11 @@ +

+ Band color scheme
+ +

@@ -129,9 +134,13 @@ - - - + + + + + + + {% end %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 3d0a5e7..132deed 100644 --- a/templates/base.html +++ b/templates/base.html @@ -44,6 +44,7 @@ + diff --git a/templates/map.html b/templates/map.html index 9a3024e..974b76e 100644 --- a/templates/map.html +++ b/templates/map.html @@ -129,6 +129,11 @@ +

+ Band color scheme
+ +

@@ -147,9 +152,13 @@ - - - + + + + + + + {% end %} \ No newline at end of file diff --git a/templates/spots.html b/templates/spots.html index dc8c953..c6cfd37 100644 --- a/templates/spots.html +++ b/templates/spots.html @@ -154,12 +154,17 @@
Theme
-
-
- - -
+
+
+ +
+
+

+ Band color scheme
+ +

@@ -218,9 +223,13 @@ - - - + + + + + + + {% end %} \ No newline at end of file diff --git a/templates/status.html b/templates/status.html index 8ca719c..56d5b5f 100644 --- a/templates/status.html +++ b/templates/status.html @@ -3,8 +3,12 @@
- - + + + + + + {% end %} \ No newline at end of file diff --git a/webassets/apidocs/openapi.yml b/webassets/apidocs/openapi.yml index 3a5485c..9445740 100644 --- a/webassets/apidocs/openapi.yml +++ b/webassets/apidocs/openapi.yml @@ -1084,18 +1084,6 @@ components: type: integer description: Activation score. SOTA only example: 0 - icon: - type: string - descripton: Icon, from the Font Awesome set. This is fairly opinionated but is here to help the Spothole web UI and Field Spotter. Does not include the "fa-" prefix. - example: tree - band_color: - type: string - descripton: Colour to represent this spot, if a client chooses to colour spots based on their frequency band, using PSK Reporter's default colours. HTML colour e.g. hex. - example: "#ff0000" - band_contrast_color: - type: string - descripton: Black or white, whichever best contrasts with "band_color". - example: "white" qrt: type: boolean description: QRT state. Some APIs return spots marked as QRT. Otherwise we can check the comments. @@ -1204,10 +1192,6 @@ components: type: integer description: Activation score. SOTA only example: 0 - icon: - type: string - descripton: Icon, from the Font Awesome set. This is fairly opinionated but is here to help the Spothole web UI and Field Spotter. Does not include the "fa-" prefix. - example: tree source: type: string description: Where we got the alert from. @@ -1283,14 +1267,6 @@ components: type: int description: The end frequency of this band, in Hz. example: 7200000 - color: - type: string - description: The color associated with this mode, as used on PSK Reporter. - example: "#5959ff" - contrast_color: - type: string - description: Black or white, whichever provides the best contrast against the band colour. - example: white SIG: type: object @@ -1302,10 +1278,6 @@ components: type: string description: The full name of the SIG example: Parks on the Air - icon: - type: string - description: Icon, from the Font Awesome set. This is fairly opinionated but is here to help the Spothole web UI and Field Spotter. Does not include the "fa-" prefix. - example: tree ref_regex: type: string description: Regex that matches this SIG's reference IDs. Generally for Spothole's own internal use, clients probably won't need this. diff --git a/webassets/js/alerts.js b/webassets/js/alerts.js index 4363c72..37e1a2a 100644 --- a/webassets/js/alerts.js +++ b/webassets/js/alerts.js @@ -243,7 +243,7 @@ function addAlertRowsToTable(tbody, alerts) { $tr.append(`${commentText}`); } if (showSource) { - $tr.append(` ${sigSourceText}`); + $tr.append(` ${sigSourceText}`); } if (showRef) { $tr.append(`${sig_refs}`); @@ -257,7 +257,7 @@ function addAlertRowsToTable(tbody, alerts) { } $td2 = $(""); if (showSource) { - $td2.append(` `); + $td2.append(` `); } if (showRef) { $td2.append(`${sig_refs} `); diff --git a/webassets/js/bands.js b/webassets/js/bands.js index 219dc12..8cf97c5 100644 --- a/webassets/js/bands.js +++ b/webassets/js/bands.js @@ -70,7 +70,7 @@ function updateBands() { var table = $('').append(''); bandToSpots.forEach(function (spotList, bandName) { // Get the colours for the band from the first spot, and prepare the header - table.find('thead tr').append(``); + table.find('thead tr').append(``); // Get the band data to fetch start and end frequencies let band = options["bands"].filter(function (b) { @@ -145,7 +145,7 @@ function updateBands() { // Now each spot is tagged with how far down the div it should go, add them to the DOM. spotList.forEach(s => { - bandSpotsDiv.append(`
${s.dx_call}${s.dx_ssid != null ? "-" + s.dx_ssid : ""}${s.dx_call}${s.dx_ssid != null ? "-" + s.dx_ssid : ""} ${(s.freq/1000000).toFixed(3)} ${s.mode}
`); + bandSpotsDiv.append(`
${s.dx_call}${s.dx_ssid != null ? "-" + s.dx_ssid : ""}${s.dx_call}${s.dx_ssid != null ? "-" + s.dx_ssid : ""} ${(s.freq/1000000).toFixed(3)} ${s.mode}
`); }); // Work out how tall the canvas should be. Normally this is matching the normal band column height, but if some @@ -167,7 +167,7 @@ function updateBands() { ctx.beginPath(); ctx.lineWidth = 2; ctx.lineCap = "round"; - ctx.strokeStyle = s.band_color; + ctx.strokeStyle = bandToColor(s['band']); ctx.moveTo(0, pxDownBandFreq); ctx.lineTo(BAND_COLUMN_CANVAS_WIDTH_PX, pxDownBandLabel); ctx.stroke(); @@ -228,6 +228,21 @@ function loadOptions() { // Store options options = jsonData; + // Populate the Display panel + options["web-ui-options"]["max-spot-age"].forEach(sc => $("#max-spot-age").append($('`); } if (showFreq) { - $tr.append(``); + $tr.append(``); } if (showMode) { $tr.append(``); @@ -340,7 +340,7 @@ function createNewTableRowsForSpot(s, highlightNew) { $tr.append(``); } if (showType) { - $tr.append(``); + $tr.append(``); } if (showRef) { $tr.append(``); @@ -366,7 +366,7 @@ function createNewTableRowsForSpot(s, highlightNew) { $td2 = $("
${spotList[0].band}${spotList[0].band}${dx_flag}${dx_call}${freq_string}${freq_string}${mode_string}${bearingText} ${typeText} ${typeText}${sig_refs}"); $td2floatleft = $(`
`); if (showType) { - $td2floatleft.append(` ${typeText} `); + $td2floatleft.append(` ${typeText} `); } if (showRef) { $td2floatleft.append(`${sig_refs} `); @@ -398,6 +398,21 @@ function loadOptions() { // Store options options = jsonData; + // Populate the Display panel + options["web-ui-options"]["spot-count"].forEach(sc => $("#spots-to-fetch").append($('