2 Commits

Author SHA1 Message Date
Ian Renton
8257ec492d Trap NaN frequencies and return None instead 2026-03-30 19:09:04 +01:00
Ian Renton
02f564b515 Colour tweaks and fixes 2026-03-30 19:01:25 +01:00
17 changed files with 64 additions and 77 deletions

View File

@@ -200,6 +200,10 @@ class Spot:
if self.de_dxcc_id and not self.de_flag: if self.de_dxcc_id and not self.de_flag:
self.de_flag = lookup_helper.get_flag_for_dxcc(self.de_dxcc_id) self.de_flag = lookup_helper.get_flag_for_dxcc(self.de_dxcc_id)
# Remove NaNs in frequency
if freq and freq == float("nan"):
freq = None
# Band from frequency # Band from frequency
if self.freq and not self.band: if self.freq and not self.band:
band = infer_band_from_freq(self.freq) band = infer_band_from_freq(self.freq)

View File

@@ -67,7 +67,7 @@
<p>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.</p> <p>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.</p>
</div> </div>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-about").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-about").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -69,8 +69,8 @@
</div> </div>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/add-spot.js?v=1774778476"></script> <script src="/js/add-spot.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-add-spot").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-add-spot").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -51,13 +51,13 @@
</div> </div>
<div id="table-container"> <div id="table-container">
<table id="table" class="table"><thead><tr class="table-primary"></tr></thead><tbody></tbody></table> <table id="table" class="table"><thead><tr></tr></thead><tbody></tbody></table>
</div> </div>
</div> </div>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/alerts.js?v=1774778476"></script> <script src="/js/alerts.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-alerts").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-alerts").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -62,9 +62,9 @@
<script> <script>
let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %}; let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %};
</script> </script>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/spotsbandsandmap.js?v=1774778476"></script> <script src="/js/spotsbandsandmap.js?v=1774894144"></script>
<script src="/js/bands.js?v=1774778476"></script> <script src="/js/bands.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-bands").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-bands").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -46,10 +46,10 @@
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/tinycolor2@1.6.0/cjs/tinycolor.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/tinycolor2@1.6.0/cjs/tinycolor.min.js"></script>
<script src="https://misc.ianrenton.com/jsutils/utils.js?v=1774778476"></script> <script src="https://misc.ianrenton.com/jsutils/utils.js?v=1774894144"></script>
<script src="https://misc.ianrenton.com/jsutils/storage.js?v=1774778476"></script> <script src="https://misc.ianrenton.com/jsutils/storage.js?v=1774894144"></script>
<script src="https://misc.ianrenton.com/jsutils/ui-ham.js?v=1774778476"></script> <script src="https://misc.ianrenton.com/jsutils/ui-ham.js?v=1774894144"></script>
<script src="https://misc.ianrenton.com/jsutils/geo.js?v=1774778476"></script> <script src="https://misc.ianrenton.com/jsutils/geo.js?v=1774894144"></script>
</head> </head>
<body> <body>

View File

@@ -189,8 +189,8 @@
</div> </div>
</div> </div>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/conditions.js?v=1774778476"></script> <script src="/js/conditions.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-conditions").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-conditions").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -70,9 +70,9 @@
<script> <script>
let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %}; let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %};
</script> </script>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/spotsbandsandmap.js?v=1774778476"></script> <script src="/js/spotsbandsandmap.js?v=1774894144"></script>
<script src="/js/map.js?v=1774778476"></script> <script src="/js/map.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-map").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-map").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -79,7 +79,7 @@
</div> </div>
<div id="table-container"> <div id="table-container">
<table id="table" class="table"><thead><tr class="table-primary"></tr></thead><tbody></tbody></table> <table id="table" class="table"><thead><tr></tr></thead><tbody></tbody></table>
</div> </div>
</div> </div>
@@ -87,9 +87,9 @@
<script> <script>
let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %}; let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %};
</script> </script>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/spotsbandsandmap.js?v=1774778476"></script> <script src="/js/spotsbandsandmap.js?v=1774894144"></script>
<script src="/js/spots.js?v=1774778476"></script> <script src="/js/spots.js?v=1774894144"></script>
<script>$(document).ready(function() { $("#nav-link-spots").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-spots").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -59,8 +59,8 @@
</div> </div>
</div> </div>
<script src="/js/common.js?v=1774778476"></script> <script src="/js/common.js?v=1774894144"></script>
<script src="/js/status.js?v=1774778476"></script> <script src="/js/status.js?v=1774894144"></script>
<script> <script>
$(document).ready(function() { $("#nav-link-status").addClass("active"); }); <!-- highlight active page in nav --> $(document).ready(function() { $("#nav-link-status").addClass("active"); }); <!-- highlight active page in nav -->
</script> </script>

View File

@@ -1,10 +0,0 @@
<div class="card-header">
<div class="row">
<div class="col-auto me-auto">
Conditions
</div>
<div class="col-auto d-inline-flex">
<button id="close-conditions-button" type="button" class="btn-close btn-close-white" aria-label="Close" onclick="closeConditionsPanel();"></button>
</div>
</div>
</div>

View File

@@ -4,7 +4,7 @@
Display Display
</div> </div>
<div class="col-auto d-inline-flex"> <div class="col-auto d-inline-flex">
<button id="close-display-button" type="button" class="btn-close btn-close-white" aria-label="Close" onclick="closeDisplayPanel();"></button> <button id="close-display-button" type="button" class="btn-close btn-close" aria-label="Close" onclick="closeDisplayPanel();"></button>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -4,7 +4,7 @@
Filters Filters
</div> </div>
<div class="col-auto d-inline-flex"> <div class="col-auto d-inline-flex">
<button id="close-filters-button" type="button" class="btn-close btn-close-white" aria-label="Close" onclick="closeFiltersPanel();"></button> <button id="close-filters-button" type="button" class="btn-close btn-close" aria-label="Close" onclick="closeFiltersPanel();"></button>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -193,25 +193,18 @@ tr.new td {
} }
} }
/* Fudge apply our own "dark primary" and "dark danger" backgrounds as Bootstrap doesn't do this itself */
[data-bs-theme=dark] tr.table-primary {
--bs-table-bg: #053680;
--bs-table-border-color: #021b42;
--bs-table-color: white;
}
[data-bs-theme=dark] tr.table-danger {
--bs-table-bg: #74272e;
--bs-table-border-color: #530208;
--bs-table-color: white;
}
/* TABLE */ /* TABLE */
#table-container { #table-container {
border-radius: 3px; border-radius: 5px;
border: 1px solid var(--bs-primary-border-subtle);
overflow: hidden; overflow: hidden;
} }
#table-container table{
margin-bottom: 0;
}
/* MAP */ /* MAP */
div#map { div#map {

View File

@@ -54,25 +54,25 @@ function updateTable() {
let table = $("#table"); let table = $("#table");
table.find('thead tr').empty(); table.find('thead tr').empty();
if (showStartTime) { if (showStartTime) {
table.find('thead tr').append(`<th>${useLocalTime ? "Start&nbsp;(Local)" : "Start&nbsp;UTC"}</th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">${useLocalTime ? "Start&nbsp;(Local)" : "Start&nbsp;UTC"}</th>`);
} }
if (showEndTime) { if (showEndTime) {
table.find('thead tr').append(`<th>${useLocalTime ? "End&nbsp;(Local)" : "End&nbsp;UTC"}</th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">${useLocalTime ? "End&nbsp;(Local)" : "End&nbsp;UTC"}</th>`);
} }
if (showDX) { if (showDX) {
table.find('thead tr').append(`<th>DX</th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">DX</th>`);
} }
if (showFreqsModes) { if (showFreqsModes) {
table.find('thead tr').append(`<th class='hideonmobile'>Freq<span class='hideonmobile'>uencie</span>s & Modes</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Freq<span class='hideonmobile'>uencie</span>s & Modes</th>`);
} }
if (showComment) { if (showComment) {
table.find('thead tr').append(`<th class='hideonmobile'>Comment</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Comment</th>`);
} }
if (showSource) { if (showSource) {
table.find('thead tr').append(`<th class='hideonmobile'>Source</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Source</th>`);
} }
if (showRef) { if (showRef) {
table.find('thead tr').append(`<th class='hideonmobile'>Ref.</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Ref.</th>`);
} }
table.find('tbody').empty(); table.find('tbody').empty();
@@ -86,22 +86,22 @@ function updateTable() {
later = alerts.filter(a => moment.unix(a["start_time"]).utc().subtract(24, 'hours').isSameOrAfter()); later = alerts.filter(a => moment.unix(a["start_time"]).utc().subtract(24, 'hours').isSameOrAfter());
if (onNow.length > 0) { if (onNow.length > 0) {
table.find('tbody').append('<tr class="table-primary"><td colspan="100" style="text-align:center;">On Now</td></tr>'); table.find('tbody').append('<tr><td colspan="100" class="bg-primary-subtle" style="text-align:center;">On Now</td></tr>');
addAlertRowsToTable(table.find('tbody'), onNow); addAlertRowsToTable(table.find('tbody'), onNow);
} }
if (next24h.length > 0) { if (next24h.length > 0) {
table.find('tbody').append('<tr class="table-primary"><td colspan="100" style="text-align:center;">Starting within 24 hours</td></tr>'); table.find('tbody').append('<tr><td colspan="100" class="bg-primary-subtle" style="text-align:center;">Starting within 24 hours</td></tr>');
addAlertRowsToTable(table.find('tbody'), next24h); addAlertRowsToTable(table.find('tbody'), next24h);
} }
if (later.length > 0) { if (later.length > 0) {
table.find('tbody').append('<tr class="table-primary"><td colspan="100" style="text-align:center;">Starting later </td></tr>'); table.find('tbody').append('<tr><td colspan="100" class="bg-primary-subtle" style="text-align:center;">Starting later </td></tr>');
addAlertRowsToTable(table.find('tbody'), later); addAlertRowsToTable(table.find('tbody'), later);
} }
if (onNow.length == 0 && next24h.length == 0 && later.length == 0) { if (onNow.length == 0 && next24h.length == 0 && later.length == 0) {
table.find('tbody').append('<tr class="table-danger"><td colspan="100" style="text-align:center;">No alerts match your filters.</td></tr>'); table.find('tbody').append('<tr class="bg-danger-subtle"><td colspan="100" style="text-align:center;">No alerts match your filters.</td></tr>');
} }
} }

View File

@@ -8,7 +8,7 @@ function loadSolarConditions() {
// HF // HF
const hfConditionClass = { 'Good': 'table-success', 'Fair': 'table-warning', 'Poor': 'table-danger' }; const hfConditionClass = { 'Good': 'bg-success-subtle', 'Fair': 'bg-warning-subtle', 'Poor': 'bg-danger-subtle' };
if (jsonData.hf_conditions) { if (jsonData.hf_conditions) {
Object.entries(jsonData.hf_conditions).forEach(function([key, condition]) { Object.entries(jsonData.hf_conditions).forEach(function([key, condition]) {
@@ -26,11 +26,11 @@ function loadSolarConditions() {
cell.text(condition); cell.text(condition);
let vhfClass; let vhfClass;
if (condition === 'Band Closed') { if (condition === 'Band Closed') {
vhfClass = 'table-danger'; vhfClass = 'bg-danger-subtle';
} else if (condition.includes('High')) { } else if (condition.includes('High')) {
vhfClass = 'table-warning'; vhfClass = 'bg-warning-subtle';
} else { } else {
vhfClass = 'table-success'; vhfClass = 'bg-success-subtle';
} }
cell.addClass(vhfClass); cell.addClass(vhfClass);
}); });
@@ -130,8 +130,8 @@ function renderDxStats() {
const range = max - min; const range = max - min;
cells.forEach(function({ cell, count }) { cells.forEach(function({ cell, count }) {
const t = range > 0 ? (count - min) / range : 0; const t = range > 0 ? (count - min) / range : 0;
const cls = t === 0 ? 'table-danger' : t < 0.05 ? 'table-warning' : 'table-success'; const cls = t === 0 ? 'bg-danger-subtle' : t < 0.05 ? 'bg-warning-subtle' : 'bg-success-subtle';
cell.removeClass('table-danger table-warning table-success').addClass(cls); cell.removeClass('bg-danger-subtle bg-warning-subtle bg-success-subtle').addClass(cls);
}); });
} }

View File

@@ -111,39 +111,39 @@ function updateTable() {
let table = $("#table"); let table = $("#table");
table.find('thead tr').empty(); table.find('thead tr').empty();
if (showTime) { if (showTime) {
table.find('thead tr').append(`<th>${useLocalTime ? "Local" : "UTC"}</th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">${useLocalTime ? "Local" : "UTC"}</th>`);
} }
if (showDX) { if (showDX) {
table.find('thead tr').append(`<th>DX</th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">DX</th>`);
} }
if (showFreq) { if (showFreq) {
table.find('thead tr').append(`<th>Freq<span class='hideonmobile'>uency</span></th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">Freq<span class='bg-primary-subtle hideonmobile'>uency</span></th>`);
} }
if (showMode) { if (showMode) {
table.find('thead tr').append(`<th>Mode</th>`); table.find('thead tr').append(`<th class="bg-primary-subtle">Mode</th>`);
} }
if (showComment) { if (showComment) {
table.find('thead tr').append(`<th class='hideonmobile'>Comment</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Comment</th>`);
} }
if (showBearing) { if (showBearing) {
table.find('thead tr').append(`<th class='hideonmobile'>Bearing</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Bearing</th>`);
} }
if (showType) { if (showType) {
table.find('thead tr').append(`<th class='hideonmobile'>Type</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Type</th>`);
} }
if (showRef) { if (showRef) {
table.find('thead tr').append(`<th class='hideonmobile'>Ref.</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>Ref.</th>`);
} }
if (showDE) { if (showDE) {
table.find('thead tr').append(`<th class='hideonmobile'>DE</th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'>DE</th>`);
} }
if (showWorkedCheckbox) { if (showWorkedCheckbox) {
table.find('thead tr').append(`<th class='hideonmobile'></th>`); table.find('thead tr').append(`<th class='bg-primary-subtle hideonmobile'></th>`);
} }
table.find('tbody').empty(); table.find('tbody').empty();
if (spots.length == 0) { if (spots.length == 0) {
table.find('tbody').append('<tr class="table-danger"><td colspan="100" style="text-align:center;">No spots match your filters.</td></tr>'); table.find('tbody').append('<tr class="bg-danger-subtle"><td colspan="100" style="text-align:center;">No spots match your filters.</td></tr>');
} }
// We are regenerating the entire table not just adding a new row, so reset the row counter // We are regenerating the entire table not just adding a new row, so reset the row counter