Merge branch 'remove-strikes-fix-chat' into 'release_february_23'

Remove strikes

See merge request gridtracker.org/gridtracker!266

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
merge-requests/237/merge
T Loomis 2023-02-03 19:59:47 +00:00
commit 3e26708e90
36 zmienionych plików z 1252 dodań i 1165 usunięć

Wyświetl plik

@ -13,7 +13,7 @@ module.exports = {
SharedArrayBuffer: "readonly"
},
parserOptions: {
ecmaVersion: 2018
ecmaVersion: 2021
},
rules: {
/* See https://eslint.org/docs/rules/ */

14
debian/changelog vendored
Wyświetl plik

@ -1,3 +1,17 @@
gridtracker (1.23.0131) unstable; urgency=low
- Bugfix for Turkey zone 1 decodes
- Heatmap part of “Spots” button, Hotkey H removed
- GT flags button follow “Map View Filters”
- OAMS chat messages word wrap correctly
- Mutli-Rig settings moved to Settings → General
- Call Roster Settings moved to Call Roster, right-click in Roster or press Ctrl-S
- Call Roster Compact Mode displays Band if multi-band
- Call Roster Compact Mode entity selection in Call Roster Settings, default “DXCC”
- Added Call Roster Window Filters in Call Roster Settings, Ctrl-R to reset filters
- Call Roster POTA column can now sort
- Added OAMS based band activity
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 31 Jan 2023 00:00:00 -0000
gridtracker (1.23.0110) unstable; urgency=high
- Emergency LoTW fix
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 10 Jan 2023 00:00:00 -0000

Wyświetl plik

@ -40,6 +40,19 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
%license %{_docdir}/%{name}/
%changelog
* Tue Jan 31 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.0131-1
- Removed lightning strike detection
- Bugfix for Turkey zone 1 decodes
- Heatmap part of “Spots” button, Hotkey H removed
- GT flags button follow “Map View Filters”
- OAMS chat messages word wrap correctly
- Mutli-Rig settings moved to Settings → General
- Call Roster Settings moved to Call Roster, right-click in Roster or press Ctrl-S
- Call Roster Compact Mode displays Band if multi-band
- Call Roster Compact Mode entity selection in Call Roster Settings, default “DXCC”
- Added Call Roster Window Filters in Call Roster Settings, Ctrl-R to reset filters
- Call Roster POTA column can now sort
- Added OAMS based band activity
* Tue Jan 10 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.0110-1
- Emergency LoTW fix
* Mon Dec 26 2022 Tag Loomis <n0ttl@gridtracker.org> - 1.22.1226-1

Wyświetl plik

@ -42,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<script src="./lib/screens.js" type="text/javascript"></script>
<script src="./lib/alerts.js" type="text/javascript"></script>
<script src="./lib/third-party.js" type="text/javascript"></script>
<script src="./lib/grid-math.js" type="text/javascript"></script>
<script src="./lib/adif.js" type="text/javascript"></script>
<script src="./lib/ol.js" type="text/javascript"></script>
<script src="./lib/arc.js" type="text/javascript"></script>
@ -95,7 +96,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<input id="documentDirectoryInput" type="file" nwdirectory onchange="directoryInput(this)" />
</div>
</div>
<div id="main" style="display: none">
<div id="main" style="display: none;">
<div id="mapDiv" class="mapDivEnd"></div>
<div id="mouseTrackDiv" style="display: none" class="mouseTrack"></div>
<div id="LegendDiv" style="display: none" class="legendDivEnd">
@ -304,7 +305,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div>
</div>
<div id="pskReporterBandActivityDiv" class="roundBorder" style="
<div id="bandActivityDiv" class="roundBorder" style="
position: relative;
background-color: #000;
border: 1px solid purple;
@ -312,7 +313,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
height: 49px;
margin-bottom: 1px;
padding: 0px;
" title="PSK-Reporter Band Activity" oncontextmenu="toggleBaWindow(event)">
" title="Band Activity" oncontextmenu="toggleBaWindow(event)">
<div data-i18n="sidebarNoDataYet" id="graphDiv" style="bottom: 0; position: absolute; width: 100%; padding: 0px; margin-bottom: 2px">
...no data yet...
</div>
@ -528,15 +529,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="trophyButton" onclick="cycleTrophyOverlay();" class="iconButton" title="Cycle Award Overlays">
<img id="trophyImg" src="./img/blank_trophy.png" class="buttonImg" />
</div>
<div id="buttonStrikesDiv" onclick="toggleStrikesValue()" class="iconButton" title="Toggle Lightning Strikes">
<img id="strikesImg" src="./img/lw.png" class="buttonImg" />
</div>
<div id="lunaButton" onclick="toggleMoon();" class="iconButton" title="Toggle Moon">
<img id="lunaButonImg" src="./img/luna.png" class="buttonImg" />
</div>
<div id="gridModeDiv" onclick="toggleGridMode()" class="iconButton" title="Toggle Maidenhead Width">
<img id="modeImg" src="" class="buttonImg" />
</div>
<div id="alterMuteDiv" onclick="toggleAlertMute()" class="iconButton" title="Toggle Audio Mute">
<img id="alertMuteImg" src="" class="buttonImg" />
</div>
<div id="settingsButton" onclick="showSettingsBox();" class="iconButton" title="Settings">
<img src="./img/settings-button.png" class="buttonImg" />
</div>
@ -550,11 +551,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<img style="-webkit-filter: brightness(50%); filter: brightness(50%)" src="./img/donate.png"
class="buttonImg" />
</div>
<div id="alterMuteDiv" onclick="toggleAlertMute()" class="iconButton" title="Toggle Audio Mute">
<img id="alertMuteImg" src="" class="buttonImg" />
<div id="timezoneButton" onclick="toggleTimezones()" class="iconButton" title="Toggle Timezone Layer">
<img id="timezoneImg" src="./img/timezone-button.png" class="buttonImg" />
</div>
<div id="buttonPSKSpotsBoxDiv" onClick="togglePskSpots();" class="iconButton" title="View Spot Reports">
<img id="pskSpotsImg" src="./img/spots.png" class="buttonImg" />
<div id="radarButton" onclick="toggleNexrad()" class="iconButton" title="Toggle US Nexrad">
<img id="radarImg" src="./img/radar-button.png" class="buttonImg" />
</div>
<div id="gridOverlayButton" onclick="toggleAllGrids()" class="iconButton" title="Toggle All Grid Overlay">
<img id="gridOverlayImg" src="./img/grid-overlay.png" class="buttonImg" />
</div>
<div id="buttonSpotsBoxDiv" onClick="cycleSpotsView();" class="iconButton" title="View Spot Reports">
<img id="spotsButtonImg" src="./img/spots.png" class="buttonImg" />
</div>
<div id="buttonPsk24CheckBoxDiv" onclick="grabPsk24()" class="iconButton" title="Your PSK 24hour report">
<img id="pskImg" src="./img/psk_24_32.png" class="buttonImg" />
@ -577,14 +584,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
title="Reload Local ADIF Files">
<img src="./img/log_local.png" class="buttonImg" />
</div>
<div id="timezoneButton" onclick="toggleTimezones()" class="iconButton" title="Toggle Timezone Layer">
<img id="timezoneImg" src="./img/timezone-button.png" class="buttonImg" />
</div>
<div id="radarButton" onclick="toggleNexrad()" class="iconButton" title="Toggle US Nexrad">
<img id="radarImg" src="./img/radar-button.png" class="buttonImg" />
</div>
<div id="gridOverlayButton" onclick="toggleAllGrids()" class="iconButton" title="Toggle All Grid Overlay">
<img id="gridOverlayImg" src="./img/grid-overlay.png" class="buttonImg" />
<div id="potaButton" onClick="togglePotaMap();" class="iconButton" title="Parks On The Air">
<img id="potaImg" src="./img/pota.png" class="buttonImg" />
</div>
<div id="gtFlagButton" onclick="toggleGtMap();" class="iconButton" title="Toggle View GridTracker Users">
<img id="gtFlagImg" src="" class="buttonImg" />
@ -592,9 +593,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="msgButton" onclick="showMessaging();" class="iconButton" title="Messaging Window">
<img id="msgImg" src="./img/gt_chat.png" class="buttonImg" />
</div>
<div id="potaButton" onClick="togglePotaMap();" class="iconButton" title="Parks On The Air">
<img id="potaImg" src="./img/pota.png" class="buttonImg" />
</div>
</div>
<div id="SpotsDiv"
style="display: none; border: 1px solid yellow; margin: 1px; margin-bottom: 1px; margin-top: 2px"
@ -803,8 +801,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td>0</td>
<td align="left">Toggle US Nexrad Overlay</td>
<td></td>
<td>Y</td>
<td align="left">Toggle Global Lightning</td>
<td></td>
<td align="left"></td>
<td></td>
</tr>
<tr>
@ -872,8 +870,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td>Shift-Key</td>
</tr>
<tr>
<td>H</td>
<td align="left">Toggle RX Spots Heatmap</td>
<td></td>
<td align="left"></td>
<td></td>
<td>F8</td>
<td align="left">Recall Map Position 4</td>
@ -929,7 +927,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
<tr>
<td>O</td>
<td align="left">Toggle RX Spots</td>
<td align="left">Cycle Spot View</td>
<td></td>
<td>F12</td>
<td align="left">Toggle Sidebar Menu</td>
@ -980,8 +978,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
onclick="openSettingsTab(event, 'logSettingsDiv')">Logging</button>
<button data-i18n="settings.Alerts.label" class="settingsTablinks"
onclick="openSettingsTab(event, 'alertsDiv')">Alerts</button>
<button data-i18n="settings.CallRoster.label" class="settingsTablinks"
onclick="openSettingsTab(event, 'callRosterDiv')">Call Roster</button>
<button data-i18n="settings.OAMS.label" class="settingsTablinks"
onclick="openSettingsTab(event, 'chatSettingsDiv')">OAMS</button>
<button data-i18n="settings.Logbook.label" id="logbut" class="settingsTablinks"
@ -1083,6 +1079,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</table>
</div>
</td>
<td>
<div class="mapItem" id="multiRigCRDiv" style="display:none;">
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.label" align="center">On QSO Reply</td>
</tr>
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.SwitchView.label" align="center">Switch View To Transmitting
Instance</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="focusRigValue" onchange="changeFocusRigValue(this);" />
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
<table align="center">
@ -1121,6 +1135,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</table>
</div>
</td>
<td>
<div class="mapItem" id="haltTXDiv" style="display:none;">
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.label" align="center">On QSO Reply</td>
</tr>
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.HaltTx.label" align="center">Halt TX On All Other Instances</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="haltAllOnTxValue" onchange="changeHaltOntTxValue(this);" />
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
<table align="center">
@ -1499,24 +1530,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr>
<td data-i18n="settings.audio.lighteningAlert.label" title="Lightning Strike Audio Alert">Lightning Strike
Audio Alert</td>
</tr>
<tr>
<td>
<select id="strikesAlert" value="0" onchange="changeStrikesAlert();">
<option data-i18n="settings.audio.lighteningAlert.none" value="0">None</option>
<option data-i18n="settings.audio.lighteningAlert.short" value="1">Short</option>
<option data-i18n="settings.audio.lighteningAlert.long" value="2">Long</option>
<option data-i18n="settings.audio.lighteningAlert.voice" value="3">Voice</option>
</select>
</td>
</tr>
</table>
</div>
<br />
<div class="mapItem" style="white-space: nowrap">
<table align="center">
@ -1996,7 +2009,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
</table>
</div>
<br />
<div class="mapItem">
<table align="center">
@ -2449,7 +2461,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td></td>
</tr>
</table>
<h2 data-i18n="settings.logging.other.title">Other Services</h2>
<table class="darkTable" align="center">
<tr>
@ -2475,136 +2486,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</td>
</tr>
</table>
</div>
<div id="callRosterDiv" class="settingsTabcontent">
<div class="mapItem">
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.AlwaysOnTop.label" align="center">Window Always On Top</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="rosterAlwaysOnTop" onchange="changeRosterTop(this);" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.MaxAge.label" align="center">Call Roster Max Age</td>
</tr>
<tr align="center">
<td align="center" id="rosterTimeTd">2m 0s</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="5" max="300" value="120" step="15" class="slider" id="rosterTime"
oninput="changeRosterTime()" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Clear Call Roster on Band change</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="clearRosterOnBandChange"
onchange="clearRosterOnBandChangeValueChanged(this);" />
</td>
</tr>
</table>
</div>
<br />
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Call Roster Decode Delay On Focus</td>
</tr>
<td colspan="2">
<input type="checkbox" id="rosterDelayOnFocus" onchange="rosterDelayOnFocusValueChanged(this);" />
</td>
<tr align="center">
<td align="center" id="rosterDelayTimeTd">1500ms</td>
</tr>
<tr align="center">
<td colspan="2">
<input
type="range"
min="50"
max="5000"
value="1500"
step="10"
class="slider"
id="rosterDelayTime"
oninput="changeRosterDelayTime()"
/>
</td>
</tr>
</table>
</div>
<div class="mapItem" id="haltTXDiv" style="display: none">
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.label" align="center">On QSO Reply</td>
</tr>
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.HaltTx.label" align="center">Halt TX On All Other Instances</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="haltAllOnTxValue" onchange="changeHaltOntTxValue(this);" />
</td>
</tr>
</table>
</div>
<div class="mapItem" id="multiRigCRDiv" style="display: none">
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.label" align="center">On QSO Reply</td>
</tr>
<tr align="center">
<td data-i18n="settings.callroster.MultiRig.SwitchView.label" align="center">Switch View To Transmitting
Instance</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="focusRigValue" onchange="changeFocusRigValue(this);" />
</td>
</tr>
</table>
</div>
<br />
<div class="mapItem">
<table align="center" title="Alert when new 'Wanted Row(s)' appear in the Call Roster">
<tr>
<td data-i18n="settings.callroster.AudioAlert.label" colspan="2">Audio Alert On <b>New Wanted</b></td>
</tr>
<tr>
<td colspan="2">
<input type="checkbox" id="huntRoster" onchange="wantedChanged(this);" />
</td>
</tr>
<tr>
<td>
<select id="huntRosterNotify" onchange="wantedChanged(this);">
<option data-i18n="settings.callroster.AudioAlert.TextToSpeech" value="1">Text-to-Speech</option>
<option data-i18n="settings.callroster.AudioAlert.MediaFile" value="0">Media File</option>
</select>
</td>
<td>
<input id="huntRosterNotifyWord" type="text" class="inputTextValue" size="14"
onkeyup="if (event.keyCode === 13) { speakAlertString(this.value);}"
oninput="ValidateText(this);wantedChanged(this);" />
<select id="huntRosterNotifyMedia" style="display: block" onchange="wantedChanged(this);"></select>
</td>
</tr>
</table>
</div>
</div>
<div id="alertsDiv" class="settingsTabcontent">
<div id="alertMatrixDiv" style="display: inline-block">
@ -2781,6 +2662,36 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
oninput="ValidateText(this);wantedChanged(this);" />
<select id="huntStatesNotifyMedia" style="display: block" onchange="wantedChanged(this);"></select>
</td>
<tr>
<td colspan="5">
<div class="mapItem">
<table align="center" title="Alert when new 'Wanted Row(s)' appear in the Call Roster">
<tr>
<td data-i18n="settings.callroster.AudioAlert.label" colspan="2">Call Roster On <b>New Wanted</b></td>
</tr>
<tr>
<td colspan="2">
<input type="checkbox" id="huntRoster" onchange="wantedChanged(this);" />
</td>
</tr>
<tr>
<td>
<select id="huntRosterNotify" onchange="wantedChanged(this);">
<option data-i18n="settings.callroster.AudioAlert.TextToSpeech" value="1">Text-to-Speech</option>
<option data-i18n="settings.callroster.AudioAlert.MediaFile" value="0">Media File</option>
</select>
</td>
<td>
<input id="huntRosterNotifyWord" type="text" class="inputTextValue" size="14"
onkeyup="if (event.keyCode === 13) { speakAlertString(this.value);}"
oninput="ValidateText(this);wantedChanged(this);" />
<select id="huntRosterNotifyMedia" style="display: block" onchange="wantedChanged(this);"></select>
</td>
</tr>
</table>
</div>
</td>
</tr>
</tr>
</table>
<table class="roundBorder" align="left"
@ -2975,7 +2886,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
</table>
</div>
<div class="mapItem" id="GTspotDiv">
<div class="mapItem">
<table align="center">
<tr>
<td data-i18n="settings.OAMS.spotting.enable.label"
@ -2990,6 +2901,35 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</table>
</div>
<br />
<div class="mapItem">
<table align="center">
<tr>
<td data-i18n="settings.OAMS.BandActivity.enable.label"
title="Receive Band Activity Reports through the OAMS network">Band Activity</td>
</tr>
<tr>
<td>
<input title="Enable / Disable Band Activity" type="checkbox" id="oamsBandActivity"
onclick="setOamsBandActivity(this);" />
</td>
</tr>
</table>
<div class="mapItem" id="bandActivityNeighborDiv">
<table align="center">
<tr>
<td data-i18n="settings.OAMS.BandActivity.neighbor.enable.label"
title="Include your 8 neighboring grids in report">Neighboring Grids</td>
</tr>
<tr>
<td>
<input title="Enable / Disable Neighbor Grids" type="checkbox" id="oamsBandActivityNeighbors"
onclick="setOamsBandActivityNeighbors(this);" />
</td>
</tr>
</table>
</div>
</div>
<br />
<div id="msgSettingsDiv" class="mapItem" style="padding: 5px">
<div class="mapItem">
<table align="center">

Wyświetl plik

@ -183,7 +183,7 @@
"url": "/map/hamgames/{z}/{x}/{y}.png",
"attributions": "Mapbox",
"minZoom": 0,
"maxZoom": 5,
"maxZoom": 4,
"offline": true
}
}

Wyświetl plik

@ -40,6 +40,7 @@
<body
id="mainBody"
onload="window.opener.g_baWindowInitialized = true"
style="
-webkit-app-region: drag;
margin: 0px;
@ -57,7 +58,7 @@
"
>
<div
id="pskReporterBandActivityDiv"
id="bandActivityDiv"
style="
position: relative;
background-color: #000;
@ -67,7 +68,7 @@
margin-bottom: 1px;
padding: 0px;
"
title="PSK-Reporter Band Activity"
title="Band Activity"
>
<div data-i18n="bandactivity.noData" id="graphDiv" style="bottom: 0; position: absolute; width: 100%; padding: 0px; margin-bottom: 2px">
<br />...no data yet...<br />

Wyświetl plik

@ -478,9 +478,8 @@
var who = "<text class='" + className + "'>" + who.formatCallsign() + "</text>";
var time = "<text class='when'>" + window.opener.userTimeString(when) + "</text>";
var worker = who + " " + time + "</br>";
var newMsg = msg.replace(new RegExp("\r?\n", "g"), "<br />");
var msgTextClass = containsDoubleByte(newMsg) ? "msgTextUnicode" : "msgText";
worker += "<text class='" + msgTextClass + "' >" + newMsg.linkify() + "</text><br/>";
var msgTextClass = containsDoubleByte(msg) ? "msgTextUnicode" : "msgText";
worker += "<text class='" + msgTextClass + "' >" + msg.linkify() + "</text><br/>";
return worker;
}
@ -669,10 +668,10 @@
white-space: normal;
"
>
<div id="messageInfoDiv" class="boxDisplay">
<div id="messageInfoDiv" class="boxDisplay" style="overflow: hidden;">
<text id="callsign"></text> / <text id="country"></text> / <text id="grid"></text> / <text id="band"></text> / <text id="mode"></text> / <text id="appSource"></text>
</div>
<div id="messageTextDiv" class="boxDisplay" style="overflow: auto; user-select: text"></div>
<div id="messageTextDiv" class="boxDisplay" style="overflow: auto; white-space: pre-wrap;user-select: text"></div>
<div id="messageInputDiv" style="position: fixed; bottom: 3px">
<textarea disabled="true" id="messageInput" maxlength="256" rows="2" value="" class="roundBorder"></textarea>
</div>

Wyświetl plik

@ -1,178 +0,0 @@
<!--
This file is part of GridTracker.
GridTracker is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3 of the License.
GridTracker is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GridTracker. If not, see <https://www.gnu.org/licenses/>.
-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GridTracker - Print</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
table.darkTable {
border-collapse: collapse;
border: 1px solid black;
background-color: white;
text-align: center;
}
table.darkTable td,
table.darkTable th {
border: 1px solid black;
padding: 3px 5px;
}
table.darkTable thead {
border-bottom: 2px solid black;
}
table.darkTable thead th {
font-weight: bold;
text-align: center;
border-left: 2px solid black;
}
table.darkTable thead th:first-child {
border-left: none;
}
</style>
<script>
function init() {
window.print();
}
</script>
</head>
<body id="mainBody" onload="init();">
<div id="main">
<center><h2>GridTracker</h2></center>
<div id="printDiv">
<table align="center" class="darkTable">
<tr>
<th colspan="3">Hot Key List</th>
</tr>
<tr>
<th>Key</th>
<th align="left">Action</th>
<th>Condition</th>
</tr>
<tr>
<td>C</td>
<td align="left">Open Conditions Windows</td>
<td></td>
</tr>
<tr>
<td>G</td>
<td align="left">Toggle GridTracker Flags</td>
<td></td>
</tr>
<tr>
<td>I</td>
<td align="left">Open Stats/Info</td>
<td></td>
</tr>
<tr>
<td>L</td>
<td align="left">Open ADIF file</td>
<td></td>
</tr>
<tr>
<td>M</td>
<td align="left">Toggle Audio Mute</td>
<td></td>
</tr>
<tr>
<td>N</td>
<td align="left">Toggle Earth Shadow</td>
<td></td>
</tr>
<tr>
<td>P</td>
<td align="left">Toggle Grid/PushPin Mode</td>
<td></td>
</tr>
<tr>
<td>Q</td>
<td align="left">Cycle QSO/LIVE view</td>
<td></td>
</tr>
<tr>
<td>R</td>
<td align="left">Open Call Roster Window</td>
<td></td>
</tr>
<tr>
<td>S</td>
<td align="left">Open Settings</td>
<td></td>
</tr>
<tr>
<td>W</td>
<td align="left">Toggle Maidenhead Grid Size</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td align="left">Show General Map Layer</td>
<td></td>
</tr>
<tr>
<td>2</td>
<td align="left">Show CQ Zones Award Layer</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td align="left">Show ITU Zones Award Layer</td>
<td></td>
</tr>
<tr>
<td>4</td>
<td align="left">Show Continents Award Layer</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td align="left">Show US States Award Layer</td>
<td></td>
</tr>
<tr>
<td>6</td>
<td align="left">Show DXCC Award Layer</td>
<td></td>
</tr>
<tr>
<td>7</td>
<td align="left">Show US Counties Award Layer</td>
<td></td>
</tr>
<tr>
<td>M</td>
<td align="left">Add MapCenter Alert</td>
<td>right-click<br />empty grid</td>
</tr>
<tr>
<td>T</td>
<td align="left">Add TTS Alert</td>
<td>right-click<br />empty grid</td>
</tr>
<tr>
<td>V</td>
<td align="left">Add PopUp Alert</td>
<td>right-click<br />empty grid</td>
</tr>
<tr>
<td>F1</td>
<td align="left">Hot Key List</td>
<td></td>
</tr>
</table>
</div>
</div>
</body>
</html>

Wyświetl plik

@ -43,8 +43,8 @@
<script src="./lib/roster/sendAlerts.js" type="text/javascript"></script>
<script src="./lib/screens.js" type="text/javascript"></script>
</head>
<body onload="init()" class="roster" oncontextmenu="return handleContextMenu(event);">
<div id="MainCallRoster">
<body id="rosterBody" onload="init()" onresize="resize()" style="display:none;" class="roster" oncontextmenu="return handleContextMenu(event);">
<div id="MainCallRoster" style="display:block;";>
<header id="RosterControls">
<div id="TransmitControls">
<div id="txrxdec" style=" background-color: Green; border-style: outset; border-color: yellow; border-width: 3px; margin: 2px;" class="roundBorder">
@ -177,11 +177,10 @@
<input type="checkbox" id="huntPOTA" onchange="wantedChanged(this);" />
<label data-i18n="roster.secondary.wanted.pota" for="huntPOTA" title="Parks On The Air">POTA</label>
</div>
<div>
<div id="huntingMatrixOAMSDiv">
<input type="checkbox" id="huntOAMS" onchange="wantedChanged(this);" />
<label data-i18n="roster.secondary.wanted.OAMS" for="huntOAMS" title="Off-Air Message Service Users">OAMS</label>
</div>
<div>
</div>
<div>
@ -425,13 +424,216 @@
<div
id="editView"
class="roundBorder"
style="height: 100%; border: 3px solid #066; padding: 10px; margin: 10px; display: none"
style="height: 100%; width:95%; top:0px; left:0px; border: 3px solid #066; padding: 10px; margin: 10px; display: none; position: absolute;"
>
<div style="display: block; font-size: larger">Callsign, CQ and DXCC Ignores</div>
<br />
<div id="editTables"></div>
<div class="button" style="margin-top: 5px" onclick="closeEditIgnores()">Close</div>
<div style="top: 1px; right: 1px; position: absolute">
<button class="Xbutton" onclick="closeEditIgnores()">X</button>
</div>
</div>
<div id="settingsDiv" class="roundBorder" style="overflow: hidden;
margin: 0;
top: 10px;
left: 15%;
width: 70%;
display: none;
background-color: #000000;
padding: 0px;
text-align: center;
vertical-align: middle;
position: absolute;
z-index: 600;
border: 3px solid rgb(0, 50, 189);" >
<div class="mapItem" >
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.AlwaysOnTop.label" align="center">Window Always On Top</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="rosterAlwaysOnTop" onchange="changeRosterTop(this)" />
</td>
</tr>
</table>
</div>
<div class="mapItem" >
<table align="center">
<tr align="center">
<td data-i18n="settings.callroster.MaxAge.label" align="center">Call Roster Max Age</td>
</tr>
<tr align="center">
<td align="center" id="rosterTimeTd">2m 0s</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="5" max="300" value="120" step="5" class="slider" id="rosterTime"
oninput="changeRosterTime()" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Clear Call Roster on Band change</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="checkbox" id="clearRosterOnBandChange"
onchange="clearRosterOnBandChangeValueChanged(this)" />
</td>
</tr>
</table>
</div>
<br />
<div class="mapItem">
<label>Compact Mode Entity<label><br />
<select id="compactEntitySelect" onchange="compactEntityChanged()"></select>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Call Roster Decode Delay On Focus</td>
</tr>
<td colspan="2">
<input type="checkbox" id="rosterDelayOnFocus" onchange="rosterDelayOnFocusValueChanged(this)" />
</td>
<tr align="center">
<td align="center" style="display:none;" id="rosterDelayTimeTd">1500ms</td>
</tr>
<tr align="center">
<td colspan="2" >
<input
type="range"
min="50"
max="5000"
value="1500"
step="10"
class="slider"
id="rosterDelayTime"
oninput="changeRosterDelayTime()"
style="display:none;"
/>
</td>
</tr>
</table>
</div>
<br />
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Window Filters</td>
</tr>
<tr align="center">
<td align="center">
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Brightness</td>
</tr>
<tr align="center">
<td align="center" id="filterbrightnessTd"></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="10" max="100" value="100" step="1" class="slider" id="filterbrightnessSlider" oninput="filtersChanged()" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Contrast</td>
</tr>
<tr align="center">
<td align="center" id="filtercontrastTd"></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="10" max="100" value="100" step="1" class="slider" id="filtercontrastSlider" oninput="filtersChanged()" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Saturate</td>
</tr>
<tr align="center">
<td align="center" id="filtersaturateTd"></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="0" max="200" value="100" step="1" class="slider" id="filtersaturateSlider" oninput="filtersChanged()" />
</td>
</tr>
</table>
</div>
<br/>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Invert</td>
</tr>
<tr align="center">
<td align="center" id="filterinvertTd"></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="0" max="100" value="0" step="1" class="slider" id="filterinvertSlider" oninput="filtersChanged()" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Sepia</td>
</tr>
<tr align="center">
<td align="center" id="filtersepiaTd"></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="0" max="100" value="0" step="1" class="slider" id="filtersepiaSlider" oninput="filtersChanged()" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<table align="center">
<tr align="center">
<td align="center">Hue Rotate</td>
</tr>
<tr align="center">
<td align="center" id="filterhuerotateTd"></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="range" min="0" max="359" value="0" step="1" class="slider" id="filterhuerotateSlider" oninput="filtersChanged()" />
</td>
</tr>
</table>
</div>
</td>
</tr>
<tr>
<td>
<div class="mapItem">
<div class="button" style="margin: 10px" onclick="resetFilters()" title="Reset Filters">Reset Filters (Ctrl-R)</div>
</div>
</td>
</tr>
</table>
</div>
<div style="top: 1px; right: 1px; position: absolute">
<button class="Xbutton" onclick="closeSettings()">X</button>
</div>
</div>
</body>
</html>

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -138,7 +138,7 @@
"controlPanel.Share.hover": "讓其他GridTracker用戶看到您的在線狀態",
"controlPanel.Help.hover": "打開熱鍵清單(F1)",
"controlPanel.Trophy.hover": "循環顯示獎狀圖層(=)",
"controlPanel.Lightening.hover": "顯示全球閃電實時狀態(Y)",
"controlPanel.Moon.hover": "顯示月球位置(D)",
"controlPanel.MaidenheadWidth.hover": "切換梅登黑德網格位數(W)",
"controlPanel.Settings.hover": "設定(S)",
@ -228,12 +228,6 @@
"settings.audio.Speech.Phonetics.hover": "以語音方式播出呼號和網格",
"settings.audio.Device.label": "音頻播放設備",
"settings.audio.File.Volume.label": "音頻檔案音量",
"settings.audio.lighteningAlert.label": "雷擊音頻警報",
"settings.audio.lighteningAlert.hover": "如果有雷擊報警,則發出雷擊音頻警報!",
"settings.audio.lighteningAlert.none": "無",
"settings.audio.lighteningAlert.short": "短",
"settings.audio.lighteningAlert.long": "長",
"settings.audio.lighteningAlert.voice": "聲音",
"settings.audio.QSOLogEventFile.label": "QSO日志記錄通知音頻",
"settings.logbook.callsigns.hover": "QSO日志以僅包含這些呼號的數據逗號分隔",
"settings.logbook.callsigns.label": "過濾通聯呼號",
@ -432,6 +426,10 @@
"settings.OAMS.message.enable.hover": "啟用消息傳遞",
"settings.OAMS.spotting.enable.label": "啟用定位",
"settings.OAMS.spotting.enable.hover": "通過OAMS網絡發送和接收現場報告",
"settings.OAMS.BandActivity.enable.label": "Band Activity",
"settings.OAMS.BandActivity.enable.hover": "Receive Band Activity Reports through the OAMS network",
"settings.OAMS.BandActivity.neighbor.enable.label": "Neighboring Grids",
"settings.OAMS.BandActivity.neighbor.enable.hover": "Include your 8 neighboring grids in report",
"settings.OAMS.message.newAlert.label": "新消息警報",
"settings.OAMS.message.newAlert.hover": "收到新消息時發出警報。",
"settings.OAMS.message.newAlert.none": "None",
@ -775,18 +773,11 @@
"gt.gridTable.Azim": "角度",
"gt.gridTable.Lat": "緯度",
"gt.gridTable.Long": "經度",
"gt.LighteningStrike.disclaimer": "閃電雷擊檢測由 Blitzortung.org 提供\n我們對可能造成損害的誤擊不承擔責任.\n請務必向當地氣象服務機構査詢準確數據.",
"gt.UpdateCount.ClearLog": "清除日誌",
"gt.UpdateCount.LoadLog": "載入日誌",
"gt.CurrentBandMode.Band": "混合波段",
"gt.CurrentBandMode.Mode": "混合模式",
"gt.currentTime.never": "從未",
"gt.LighteningStrike.Global": "全球閃電",
"gt.LighteningStrike.Changed": "雷擊距離發生變化",
"gt.LighteningStrike.Disabled": "檢測未啟用!",
"gt.LighteningStrike.Detected": "檢測到雷擊!",
"gt.LighteningStrike.Distance": "距離:",
"gt.LighteningStrike.Bearing": "角度:",
"gt.WSJTMessage.Generated": "產生信息",
"gt.WSJTMessage.TransmitEnable": "發射已啟用!",
"gt.WSJTMessage.Decode": "解碼",
@ -1008,6 +999,7 @@
"roster.ignore.DXCCs": "DXCCs",
"roster.ignore.CQZones": "CQ 分區",
"roster.ignore.ITUZones": "ITU 分區",
"roster.menu.Settings": "Settings",
"roster.menu.HideControls": "隱藏控件",
"roster.menu.ShowControls": "顯示控件",
"roster.menu.CompactMode": "緊密模式",

Wyświetl plik

@ -138,7 +138,6 @@
"controlPanel.Share.hover": "让其他GridTracker用户看到您的在线状态",
"controlPanel.Help.hover": "打开热键清单(F1)",
"controlPanel.Trophy.hover": "循环显示奖状图层(=)",
"controlPanel.Lightening.hover": "显示全球闪电实时状态(Y)",
"controlPanel.Moon.hover": "显示月球位置(D)",
"controlPanel.MaidenheadWidth.hover": "切换梅登黑德网格位数(W)",
"controlPanel.Settings.hover": "设置(S)",
@ -228,12 +227,6 @@
"settings.audio.Speech.Phonetics.hover": "以语音方式播出呼号和网格",
"settings.audio.Device.label": "音频播放设备",
"settings.audio.File.Volume.label": "音频文件音量",
"settings.audio.lighteningAlert.label": "雷击音频警报",
"settings.audio.lighteningAlert.hover": "如果有雷击报警,则发出雷击音频警报!",
"settings.audio.lighteningAlert.none": "无",
"settings.audio.lighteningAlert.short": "短",
"settings.audio.lighteningAlert.long": "长",
"settings.audio.lighteningAlert.voice": "声音",
"settings.audio.QSOLogEventFile.label": "QSO日志记录通知音频",
"settings.logbook.callsigns.hover": "QSO日志以仅包含这些呼号的数据逗号分隔",
"settings.logbook.callsigns.label": "过滤通联呼号",
@ -432,6 +425,10 @@
"settings.OAMS.message.enable.hover": "启用消息传递",
"settings.OAMS.spotting.enable.label": "启用定位",
"settings.OAMS.spotting.enable.hover": "通过OAMS网络发送和接收现场报告",
"settings.OAMS.BandActivity.enable.label": "Band Activity",
"settings.OAMS.BandActivity.enable.hover": "Receive Band Activity Reports through the OAMS network",
"settings.OAMS.BandActivity.neighbor.enable.label": "Neighboring Grids",
"settings.OAMS.BandActivity.neighbor.enable.hover": "Include your 8 neighboring grids in report",
"settings.OAMS.message.newAlert.label": "新消息警报",
"settings.OAMS.message.newAlert.hover": "收到新消息时发出警报。",
"settings.OAMS.message.newAlert.none": "None",
@ -775,18 +772,11 @@
"gt.gridTable.Azim": "方位角",
"gt.gridTable.Lat": "纬度",
"gt.gridTable.Long": "经度",
"gt.LighteningStrike.disclaimer": "开启雷电提示",
"gt.UpdateCount.ClearLog": "清除日志",
"gt.UpdateCount.LoadLog": "载入日志",
"gt.CurrentBandMode.Band": "混合波段",
"gt.CurrentBandMode.Mode": "混合模式",
"gt.currentTime.never": "从不",
"gt.LighteningStrike.Global": "全球雷击",
"gt.LighteningStrike.Changed": "累计距离改变",
"gt.LighteningStrike.Disabled": "未启用检测!!",
"gt.LighteningStrike.Detected": "检测到雷击!",
"gt.LighteningStrike.Distance": "距离:",
"gt.LighteningStrike.Bearing": "影响:",
"gt.WSJTMessage.Generated": "生成消息(JTDX无效)",
"gt.WSJTMessage.TransmitEnable": "开启发射!",
"gt.WSJTMessage.Decode": "解码",
@ -1009,6 +999,7 @@
"roster.ignore.DXCCs": "DXCCs",
"roster.ignore.CQZones": "CQ分区",
"roster.ignore.ITUZones": "ITU分区",
"roster.menu.Settings": "Settings",
"roster.menu.HideControls": "隐藏控件栏",
"roster.menu.ShowControls": "显示控件栏",
"roster.menu.CompactMode": "紧凑模式",

Wyświetl plik

@ -43,7 +43,7 @@
"info.DXDistance.hover": "Distance",
"info.DXAzimuth.hover": "Heading",
"operatingMode.hover": "Click to ignore incoming messages",
"bandActivity.hover": "PSK-Reporter band Activity",
"bandActivity.hover": "Band Activity",
"quickStats.hover": "Quick Stats",
"quickStats.CallRX.hover": "Callsigns Heard",
"quickStats.CallRX.label": "Rx Calls",
@ -137,7 +137,6 @@
"controlPanel.Share.hover": "Share your On-Air Status with other GridTracker users",
"controlPanel.Help.hover": "Toggle Hotkey List",
"controlPanel.Trophy.hover": "Cycle Award Overlays",
"controlPanel.Lightening.hover": "Toggle Lightening Strikes",
"controlPanel.Moon.hover": "Toggle Moon",
"controlPanel.MaidenheadWidth.hover": "Toggle Maidenhead Width",
"controlPanel.Settings.hover": "Toggle Settings Window",
@ -227,12 +226,6 @@
"settings.audio.Speech.Phonetics.hover": "Speak Callsigns and Gridsquares phonetically",
"settings.audio.Device.label": "Audio Device",
"settings.audio.File.Volume.label": "File Audio Volume",
"settings.audio.lighteningAlert.label": "Lightening Strike Audio Alert",
"settings.audio.lighteningAlert.hover": "Lightening Strike Audio Alert",
"settings.audio.lighteningAlert.none": "None",
"settings.audio.lighteningAlert.short": "Short",
"settings.audio.lighteningAlert.long": "Long",
"settings.audio.lighteningAlert.voice": "Voice",
"settings.audio.QSOLogEventFile.label": "QSO Log Event Notification",
"settings.logbook.callsigns.hover": "Filter Logbook QSOs to include these Callsigns only (comma seperated)",
"settings.logbook.callsigns.label": "Working Callsign(s)",
@ -427,10 +420,14 @@
"settings.alerts.CustomAlerts.new.repeat.once": "Only Once",
"settings.alerts.CustomAlerts.new.repeat.never": "Never Repeat",
"settings.alerts.CustomAlerts.new.addButton": "ADD",
"settings.OAMS.message.enable.label": "Messaging Enable",
"settings.OAMS.message.enable.hover": "Messaging Enable",
"settings.OAMS.spotting.enable.label": "Spotting Enable",
"settings.OAMS.message.enable.label": "Messaging",
"settings.OAMS.message.enable.hover": "Messaging",
"settings.OAMS.spotting.enable.label": "Spotting",
"settings.OAMS.spotting.enable.hover": "Send and Receivev Spot Reports through the OAMS network",
"settings.OAMS.BandActivity.enable.label": "Band Activity",
"settings.OAMS.BandActivity.enable.hover": "Receive Band Activity Reports through the OAMS network",
"settings.OAMS.BandActivity.neighbor.enable.label": "Neighboring Grids",
"settings.OAMS.BandActivity.neighbor.enable.hover": "Include your 8 neighboring grids in report",
"settings.OAMS.message.newAlert.label": "New Message Alert",
"settings.OAMS.message.newAlert.hover": "Alert when new messages received.",
"settings.OAMS.message.newAlert.none": "None",
@ -775,18 +772,12 @@
"gt.gridTable.Azim": "Azim",
"gt.gridTable.Lat": "Lat",
"gt.gridTable.Long": "Long",
"gt.LighteningStrike.disclaimer": "Lighting Strike Detection is provided by Blitzortung.org\nWe are not responsible for missed strikes that could result in damage.\nBe sure to check your local weather providers for accurate data.",
"gt.UpdateCount.ClearLog": "Clear Log",
"gt.UpdateCount.LoadLog": "Load Logs",
"gt.CurrentBandMode.Band": "Mixed Bands",
"gt.CurrentBandMode.Mode": "Mixed Modes",
"gt.currentTime.never": "Never",
"gt.LighteningStrike.Global": "Global Strikes",
"gt.LighteningStrike.Changed": "Strike Distance Chagned",
"gt.LighteningStrike.Disabled": "Detection is not enabled!",
"gt.LighteningStrike.Detected": "Lighting Strike Detected!",
"gt.LighteningStrike.Distance": "Distance:",
"gt.LighteningStrike.Bearing": "Bearing:",
"gt.WSJTMessage.Generated": "Generated Msgs",
"gt.WSJTMessage.TransmitEnable": "Transmit Enabled!",
"gt.WSJTMessage.Decode": "DECODE",
@ -1008,6 +999,7 @@
"roster.ignore.DXCCs": "DXCCs",
"roster.ignore.CQZones": "CQ Zones",
"roster.ignore.ITUZones": "ITU Zones",
"roster.menu.Settings": "Settings",
"roster.menu.HideControls": "Hide Controls",
"roster.menu.ShowControls": "Show Controls",
"roster.menu.CompactMode": "Compact Mode",

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 2.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 127 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 721 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 5.6 KiB

Wyświetl plik

@ -33,7 +33,6 @@ var validSettings = [
var def_appSettings = {
alertMute: 0,
rosterAlwaysOnTop: false,
centerGridsquare: "",
chatUUID: "",
clearOnCQ: false,
@ -50,7 +49,6 @@ var def_appSettings = {
gtMsgEnable: true,
gtShareEnable: true,
gtSpotEnable: true,
heatEnabled: 0,
loadAdifAtStartup: false,
locale: "en",
lookupLoginCq: "",
@ -65,9 +63,6 @@ var def_appSettings = {
lookupPasswordQth: "",
lookupService: "CALLOOK",
lookupCallookPreferred: false,
clearRosterOnBandChange: false,
rosterDelayOnFocus: false,
rosterDelayTime: 1500,
moonPath: 0,
moonTrack: 0,
mouseTrack: 0,
@ -79,6 +74,8 @@ var def_appSettings = {
myRawCall: "NOCALL",
myRawFreq: "",
myRawGrid: "",
oamsBandActivity: true,
oamsBandActivityNeighbors: false,
pathWidthWeight: 1.0,
potaEnabled: 1,
potaShowMenu: true,
@ -88,7 +85,7 @@ var def_appSettings = {
sixWideMode: 0,
savedAppData: null,
soundCard: "default",
spotsEnabled: 0,
spotView: 0,
stopAskingVersion: false,
useLocalTime: 0,
wsjtForwardUdpEnable: false,
@ -126,13 +123,8 @@ var def_mapSettings = {
pathColor: 0,
qrzDxccFallback: false,
qrzPathColor: 1,
rosterTime: 120,
shadow: 0.1,
splitQSL: true,
strikes: false,
strikesAlert: 2,
strikesGlobal: false,
strikesNotify: false,
trafficDecode: true,
usNexrad: false,
zoom: 4,

Wyświetl plik

@ -0,0 +1,88 @@
// Copyright © 2023 N7YHF
// Permission granted to GridTracker.org for use.
function fieldNumberToLetter(number)
{
return String.fromCharCode(number + 65);
}
// Input already uppercased
function squareToNeighbors(square)
{
const neighborMatrix = [
[-1, +1], // NW
[0, +1], // N
[+1, +1], // NE
[-1, 0], // W
[0, 0], // Self
[+1, 0], // E
[-1, -1], // SW
[0, -1], // S
[+1, -1] // SE
];
// RL90
// ^^---- RL is the "field"
// ^^---- 90 is the "square"
const fieldX = square.charCodeAt(0) - 65;
const fieldY = square.charCodeAt(1) - 65;
const squareX = square.charCodeAt(2) - 48;
const squareY = square.charCodeAt(3) - 48;
const neighbors = [];
for (const [dx, dy] of neighborMatrix)
{
let neighborFieldX = fieldX;
let neighborFieldY = fieldY;
let neighborSquareX = squareX + dx;
let neighborSquareY = squareY + dy;
if (neighborSquareX < 0)
{
neighborSquareX += 10;
neighborFieldX -= 1;
}
else if (neighborSquareX > 9)
{
neighborSquareX -= 10;
neighborFieldX += 1;
}
if (neighborSquareY < 0)
{
neighborSquareY += 10;
neighborFieldY -= 1;
}
else if (neighborSquareY > 9)
{
neighborSquareY -= 10;
neighborFieldY += 1;
}
if (neighborFieldX < 0)
{
neighborFieldX += 18;
}
else if (neighborFieldX > 17)
{
neighborFieldX -= 18;
}
if (neighborFieldY < 0 || neighborFieldY > 17)
{
continue;
}
const neighbor = `${fieldNumberToLetter(neighborFieldX)}${fieldNumberToLetter(neighborFieldY)}${neighborSquareX}${neighborSquareY}`;
neighbors.push(neighbor);
}
return neighbors;
}

Plik diff jest za duży Load Diff

Wyświetl plik

@ -10,7 +10,7 @@ var g_chatRecvFunctions = {
drop: gtChatRemoveCall,
mesg: gtChatMessage,
o: gtSpotMessage,
l: gtLightningStrike
ba: bandActivityReply
};
var ChatState = Object();
@ -49,6 +49,7 @@ var g_gtNeedUsersList = true;
var g_gtUuidValid = false;
var g_gtLiveStatusUpdate = false;
var g_oamsBandActivityData = null;
var myChatId = 0;
@ -86,7 +87,7 @@ function gtConnectChat()
{
if (g_appSettings.gtShareEnable == true)
{
var jsmesg = false;
let jsmesg = false;
try
{
jsmesg = JSON.parse(evt.data);
@ -214,7 +215,7 @@ function gtStatusCheck()
function sendGtJson(json, isUUIDrequest = false)
{
if (g_gtChatSocket != null)
if (g_appSettings.gtShareEnable == true && g_gtChatSocket != null)
{
if (g_gtChatSocket.readyState === WebSocket.OPEN && (isUUIDrequest || g_gtUuidValid))
{
@ -228,8 +229,6 @@ function sendGtJson(json, isUUIDrequest = false)
}
}
}
// if we don't have a socketHandle, don't go changing the state willy nilly!
// else g_gtState = ChatState.closed;
}
var g_lastGtStatus = "";
@ -248,7 +247,6 @@ function gtChatSendStatus()
msg.src = "GT";
msg.canmsg = g_appSettings.gtMsgEnable;
msg.o = g_appSettings.gtSpotEnable == true ? 1 : 0;
msg.l = g_mapSettings.strikes == true ? 1 : 0;
msg = JSON.stringify(msg);
if (msg != g_lastGtStatus)
@ -260,13 +258,53 @@ function gtChatSendStatus()
function gtChatSendSpots(spotsObject, detailsObject)
{
var msg = Object();
let msg = Object();
msg.type = "o";
msg.uuid = g_appSettings.chatUUID;
msg.o = spotsObject;
msg.d = detailsObject;
msg = JSON.stringify(msg);
sendGtJson(msg);
sendGtJson(JSON.stringify(msg));
}
function gtChatSendDecodes(instancesObject)
{
let msg = Object();
msg.type = "d";
msg.uuid = g_appSettings.chatUUID;
msg.i = instancesObject;
sendGtJson(JSON.stringify(msg));
}
function oamsBandActivityCheck()
{
if (g_appSettings.oamsBandActivity == true && myDEGrid.length >= 4)
{
let grid = myDEGrid.substring(0, 4).toUpperCase();
if (g_appSettings.oamsBandActivityNeighbors == true)
{
gtChatSendBandActivityRequest(squareToNeighbors(grid));
}
else
{
gtChatSendBandActivityRequest([grid]);
}
}
}
function gtChatSendBandActivityRequest(gridArray)
{
msg = Object();
msg.type = "ba";
msg.uuid = g_appSettings.chatUUID;
msg.ga = gridArray;
sendGtJson(JSON.stringify(msg));
}
function bandActivityReply(jsmesg)
{
g_oamsBandActivityData = jsmesg.r;
renderBandActivity();
}
function gtChatRemoveCall(jsmesg)
@ -371,7 +409,7 @@ function gtChatUpdateCall(jsmesg)
if (!(g_gtFlagPins[cid].call in g_gtCallsigns))
{
// Can happen when a user changes callsign
g_gtCallsigns[g_gtFlagPins[cid].call] = Object();
g_gtCallsigns[g_gtFlagPins[cid].call] = {};
}
g_gtCallsigns[g_gtFlagPins[cid].call][cid] = true;
@ -429,7 +467,7 @@ function makeGtPin(obj)
if (validateGridFromString(obj.grid) == false) return;
if (g_appSettings.gtFlagImgSrc == 2 && (obj.mode != myMode || obj.band != myBand))
if (!validateMapBandAndMode(obj.band, obj.mode))
{
return;
}
@ -502,6 +540,8 @@ function gtChatNewList(jsmesg)
}
updateChatWindow();
oamsBandActivityCheck();
}
function appendToHistory(cid, jsmesg)
@ -658,15 +698,6 @@ function gtSpotMessage(jsmesg)
}
}
function gtLightningStrike(jsmesg)
{
// Saftey check
if (g_mapSettings.strikes)
{
handleStrike(jsmesg);
}
}
function gtChatSystemInit()
{
g_gtEngineInterval = nodeTimers.setInterval(gtChatStateMachine, 1000);
@ -697,9 +728,9 @@ function clearGtFlags()
function toggleGtMap()
{
g_appSettings.gtFlagImgSrc += 1;
g_appSettings.gtFlagImgSrc %= 3;
g_appSettings.gtFlagImgSrc %= 2;
gtFlagImg.src = g_gtFlagImageArray[g_appSettings.gtFlagImgSrc];
if (g_spotsEnabled == 1 && g_receptionSettings.mergeSpots == false) return;
if (g_spotView > 0 && g_receptionSettings.mergeSpots == false) return;
if (g_appSettings.gtFlagImgSrc > 0)
{
redrawPins();

Wyświetl plik

@ -65,7 +65,7 @@ function initPota()
{
potaEnabled.checked = (g_appSettings.potaEnabled == 1);
potaMenu.checked = g_appSettings.potaShowMenu;
potaButton.style.display = (g_appSettings.potaEnabled == 1 && g_appSettings.potaShowMenu) ? "" : "none";
potaButton.style.display = (g_appSettings.potaEnabled == 1 && g_appSettings.potaShowMenu && g_mapSettings.offlineMode == false) ? "" : "none";
potaImg.style.filter = g_appSettings.potaMapEnabled ? "" : "grayscale(1)";
g_layerSources.pota.clear();
@ -80,7 +80,7 @@ function initPota()
function changePotaEnable()
{
g_appSettings.potaEnabled = (potaEnabled.checked == true) ? 1 : 0;
potaButton.style.display = (g_appSettings.potaEnabled == 1 && g_appSettings.potaShowMenu) ? "" : "none";
potaButton.style.display = (g_appSettings.potaEnabled == 1 && g_appSettings.potaShowMenu && g_mapSettings.offlineMode == false) ? "" : "none";
if (!g_appSettings.potaEnabled)
{
g_layerSources.pota.clear();
@ -98,7 +98,7 @@ function changePotaMenu()
{
g_appSettings.potaShowMenu = potaMenu.checked;
potaButton.style.display = (g_appSettings.potaEnabled == 1 && g_appSettings.potaShowMenu) ? "" : "none";
potaButton.style.display = (g_appSettings.potaEnabled == 1 && g_appSettings.potaShowMenu && g_mapSettings.offlineMode == false) ? "" : "none";
potaImg.style.filter = g_appSettings.potaMapEnabled ? "" : "grayscale(1)";
saveAppSettings();
@ -420,15 +420,7 @@ function fillObjectFromTemplate(template, input)
function uniqueArrayFromArray(input)
{
var unique = [];
input.forEach((c) =>
{
if (!unique.includes(c))
{
unique.push(c);
}
});
return unique;
return [...new Set(input)];
}
function processPotaSpots(buffer)

Wyświetl plik

@ -1,86 +1,84 @@
// GridTracker Copyright © 2023 GridTracker.org
// All rights reserved.
// See LICENSE for more information.
var g_proto_bands = [
"OOB",
"OOB",
1,
"160m",
3,
"80m",
5,
"60m",
7,
"40m",
10,
"30m",
14,
"20m",
18,
"17m",
21,
"15m",
24,
"12m",
27,
"11m",
28,
"10m",
29,
"10m",
40,
"8m",
50,
"6m",
51,
"6m",
52,
"6m",
53,
"6m",
54,
"6m",
70,
"4m",
141,
"2m",
142,
"2m",
143,
"2m",
144,
"2m",
145,
"2m",
146,
"2m",
147,
"2m",
148,
"2m",
219,
"1.25m",
220,
"1.25m",
221,
"1.25m",
222,
"1.25m",
223,
"1.25m",
224,
"1.25m",
225,
"1.25m"
];
// Incoming is already float fixed ( 14.037 ) for 14,037,000hz
Number.prototype.formatBand = function ()
{
var freq = this;
var bands = [
"OOB",
"0",
1,
"160m",
3,
"80m",
5,
"60m",
7,
"40m",
10,
"30m",
14,
"20m",
18,
"17m",
21,
"15m",
24,
"12m",
27,
"11m",
28,
"10m",
29,
"10m",
40,
"8m",
50,
"6m",
51,
"6m",
52,
"6m",
53,
"6m",
54,
"6m",
70,
"4m",
141,
"2m",
142,
"2m",
143,
"2m",
144,
"2m",
145,
"2m",
146,
"2m",
147,
"2m",
148,
"2m",
219,
"1.25m",
220,
"1.25m",
221,
"1.25m",
222,
"1.25m",
223,
"1.25m",
224,
"1.25m",
225,
"1.25m"
];
var newFreq = parseInt(freq);
if (newFreq > 0 && newFreq < 226) return bands[bands.indexOf(newFreq) + 1];
let freq = this;
let newFreq = parseInt(freq);
if (newFreq > 0 && newFreq < 226) return g_proto_bands[g_proto_bands.indexOf(newFreq) + 1];
else if (newFreq >= 420 && newFreq <= 450) return "70cm";
else if (newFreq >= 902 && newFreq <= 928) return "33cm";
else if (newFreq >= 1240 && newFreq <= 1300) return "23cm";

Wyświetl plik

@ -141,14 +141,37 @@ var g_defaultSettings = {
OAMS: true,
Age: true
},
displayFilters: {
brightness: 100,
contrast: 100,
saturate: 100,
invert: 0,
grayscale: 0,
sepia: 0,
huerotate: 0
},
reference: 0,
controls: true,
controlsExtended: true,
compact: false,
settingProfiles: false,
sortColumn: "Age",
sortReverse: true
sortReverse: true,
clearRosterOnBandChange: true,
rosterAlwaysOnTop: false,
rosterDelayOnFocus: false,
rosterDelayTime: 1500,
rosterTime: 120,
compactEntity: "DXCC"
};
g_def_displayFilters = {
brightness: 100,
contrast: 100,
saturate: 100,
invert: 0,
sepia: 0,
huerotate: 0
};
const LOGBOOK_LIVE_BAND_LIVE_MODE = "0";
@ -326,7 +349,7 @@ var rosterFocus = false;
function rosterInFocus()
{
if (window.opener.g_appSettings.rosterDelayOnFocus)
if (g_rosterSettings.rosterDelayOnFocus)
{
rosterFocus = true;
}
@ -354,7 +377,7 @@ function processRoster(roster)
if (rosterFocus)
{
rosterTimeout = nodeTimers.setTimeout(viewRoster, window.opener.g_appSettings.rosterDelayTime);
rosterTimeout = nodeTimers.setTimeout(viewRoster, g_rosterSettings.rosterDelayTime);
rosterDelayDiv.style.display = "inline-block";
}
else
@ -422,14 +445,14 @@ function realtimeRoster()
function getSpotString(callObj)
{
let result = "";
let result = "&nbsp;";
if (callObj.spot && callObj.spot.when > 0)
{
when = timeNowSec() - callObj.spot.when;
if (when <= window.opener.g_receptionSettings.viewHistoryTimeSec)
{ result = parseInt(when).toDHM(); }
}
if (result) result += " / " + callObj.spot.snr;
if (result != "&nbsp;") result += " / " + callObj.spot.snr;
return result;
}
@ -914,7 +937,9 @@ function setVisual()
for (const key in g_rosterSettings.wanted)
{
if (document.getElementById(key))
{ document.getElementById(key).checked = g_rosterSettings.wanted[key]; }
{
document.getElementById(key).checked = g_rosterSettings.wanted[key];
}
}
AwardTrackerControls.style.display = "none";
@ -933,11 +958,7 @@ function setVisual()
huntingMatrixDiv.style.display = "none";
huntMode.style.display = "";
if (
huntMode.value != "callsign" &&
huntMode.value != "usstate" &&
huntMode.value != "dxccs"
)
if (huntMode.value != "callsign" && huntMode.value != "usstate" && huntMode.value != "dxccs")
{
huntNeed.style.display = "";
}
@ -975,6 +996,7 @@ function setVisual()
maxDT.style.display = "none";
maxDTView.style.display = "none";
}
if (wantMinDB.checked == true)
{
minDb.style.display = "";
@ -985,6 +1007,7 @@ function setVisual()
minDb.style.display = "none";
minDbView.style.display = "none";
}
if (wantMinFreq.checked == true)
{
minFreq.style.display = "";
@ -995,6 +1018,7 @@ function setVisual()
minFreq.style.display = "none";
minFreqView.style.display = "none";
}
if (wantMaxFreq.checked == true)
{
maxFreq.style.display = "";
@ -1037,20 +1061,42 @@ function setVisual()
}
if (window.opener.g_callsignLookups.eqslUseEnable == true)
{ useseQSLDiv.style.display = ""; }
else useseQSLDiv.style.display = "none";
{
useseQSLDiv.style.display = "";
}
else
{
useseQSLDiv.style.display = "none";
}
if (window.opener.g_callsignLookups.oqrsUseEnable == true)
{ usesOQRSDiv.style.display = ""; }
else usesOQRSDiv.style.display = "none";
{
usesOQRSDiv.style.display = "";
}
else
{
usesOQRSDiv.style.display = "none";
}
if (g_rosterSettings.columns.Spot == true)
{ onlySpotDiv.style.display = ""; }
else onlySpotDiv.style.display = "none";
{
onlySpotDiv.style.display = "";
}
else
{
onlySpotDiv.style.display = "none";
}
if (g_rosterSettings.callsign == "all" || g_rosterSettings.callsign == "hits")
{ allOnlyNewDiv.style.display = ""; }
else allOnlyNewDiv.style.display = "none";
{
allOnlyNewDiv.style.display = "";
}
else
{
allOnlyNewDiv.style.display = "none";
}
rosterBody.style.display = "block";
resize();
}
@ -1110,22 +1156,21 @@ function valuesChanged()
minFreqView.innerHTML = g_rosterSettings.minFreq = minFreq.value;
maxFreqView.innerHTML = g_rosterSettings.maxFreq = maxFreq.value;
g_rosterSettings.maxLoTW = maxLoTW.value;
maxLoTWView.innerHTML =
g_rosterSettings.maxLoTW < 27
? Number(g_rosterSettings.maxLoTW).toYM()
: "<b>&infin;</b>";
maxLoTWView.innerHTML = g_rosterSettings.maxLoTW < 27 ? Number(g_rosterSettings.maxLoTW).toYM() : "<b>&infin;</b>";
g_rosterSettings.maxLoTW = maxLoTW.value;
g_rosterSettings.cqOnly = cqOnly.checked;
g_rosterSettings.noMyDxcc = noMyDxcc.checked;
g_rosterSettings.onlyMyDxcc = onlyMyDxcc.checked;
if (
noMsg.checked &&
onlyMsg.checked &&
noMsgValue.value == onlyMsgValue.value
)
if (noMsg.checked && onlyMsg.checked && noMsgValue.value == onlyMsgValue.value)
{
if (g_rosterSettings.noMsg) noMsg.checked = false;
else onlyMsg.checked = false;
if (g_rosterSettings.noMsg)
{
noMsg.checked = false;
}
else
{
onlyMsg.checked = false;
}
}
g_rosterSettings.noMsg = noMsg.checked;
g_rosterSettings.onlyMsg = onlyMsg.checked;
@ -1146,10 +1191,66 @@ function valuesChanged()
g_scriptReport = Object();
for (const callHash in window.opener.g_callRoster)
{ window.opener.g_callRoster[callHash].callObj.alerted = false; }
{
window.opener.g_callRoster[callHash].callObj.alerted = false;
}
window.opener.goProcessRoster();
}
function loadFilterSettings()
{
var filters = "";
for (const filter in g_rosterSettings.displayFilters)
{
var slider = document.getElementById("filter" + filter + "Slider");
if (slider)
{
slider.value = g_rosterSettings.displayFilters[filter];
var td = document.getElementById("filter" + filter + "Td");
if (filter != "huerotate")
{
td.innerHTML = slider.value + "%";
filters += filter + "(" + slider.value + "%) ";
}
else
{
td.innerHTML = slider.value + " deg";
filters += "hue-rotate(" + slider.value + "deg) ";
}
}
}
document.documentElement.style.filter = filters;
}
function filtersChanged()
{
for (const filter in g_rosterSettings.displayFilters)
{
var slider = document.getElementById("filter" + filter + "Slider");
if (slider)
{
g_rosterSettings.displayFilters[filter] = slider.value;
}
else
{
// no longer a filter, get rid of it
delete g_rosterSettings.displayFilters[filter];
}
}
loadFilterSettings();
}
function resetFilters()
{
for (const filter in g_rosterSettings.displayFilters)
{
g_rosterSettings.displayFilters[filter] = g_def_displayFilters[filter];
}
loadFilterSettings();
}
function getBuffer(file_url, callback, flag, mode, port, cookie)
{
let url = require("url");
@ -1177,7 +1278,7 @@ function getBuffer(file_url, callback, flag, mode, port, cookie)
}
http.get(options, function (res)
{
let fsize = res.headers["content-length"];
// let fsize = res.headers["content-length"];
let cookies = null;
if (typeof res.headers["set-cookie"] != "undefined")
{ cookies = res.headers["set-cookie"]; }
@ -1404,6 +1505,20 @@ function clearAllITUzIgnores()
window.opener.goProcessRoster();
}
function openSettings()
{
MainCallRoster.style.display = "block";
settingsDiv.style.display = "block";
editView.style.display = "none";
}
function closeSettings()
{
MainCallRoster.style.display = "block";
settingsDiv.style.display = "none";
editView.style.display = "none";
}
function closeEditIgnores()
{
MainCallRoster.style.display = "block";
@ -1542,14 +1657,25 @@ function openIgnoreEdit()
worker += "</table></div>";
editTables.innerHTML = worker;
editView.style.height = (window.innerHeight - 50) + "px";
editView.style.height = (window.innerHeight - 45) + "px";
}
function onMyKeyDown(event)
{
if (!g_typingInRoster)
{
window.opener.onMyKeyDown(event);
if (event.code == "KeyS" && event.ctrlKey == true)
{
openSettings();
}
else if (event.code == "KeyR" && event.ctrlKey == true)
{
resetFilters();
}
else
{
window.opener.onMyKeyDown(event);
}
}
}
@ -1594,10 +1720,13 @@ function init()
);
}
loadSettings();
loadFilterSettings();
updateInstances();
// callback to addControls();
loadRosteri18n();
setRosterTop();
}
// From i18n.js
@ -1647,9 +1776,7 @@ function addControls()
this.label = hideControlsText;
g_rosterSettings.controls = true;
}
g_compactMenu.items[0].label = g_rosterSettings.controls
? hideControlsText
: showControlsText;
g_compactMenu.items[0].label = g_rosterSettings.controls ? hideControlsText : showControlsText;
localStorage.rosterSettings = JSON.stringify(g_rosterSettings);
setVisual();
}
@ -1671,15 +1798,33 @@ function addControls()
this.label = hideControlsText;
g_rosterSettings.controls = true;
}
g_menu.items[0].label = g_rosterSettings.controls
? hideControlsText
: showControlsText;
g_menu.items[0].label = g_rosterSettings.controls ? hideControlsText : showControlsText;
localStorage.rosterSettings = JSON.stringify(g_rosterSettings);
setVisual();
}
});
g_compactMenu.append(item);
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.Settings"),
click: function ()
{
openSettings();
}
});
g_menu.append(item);
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.Settings"),
click: function ()
{
openSettings();
}
});
g_compactMenu.append(item);
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.CompactMode"),
@ -2179,6 +2324,27 @@ function addControls()
noUnknownDXCC.checked = g_rosterSettings.noUnknownDXCC;
clearRosterOnBandChange.checked = g_rosterSettings.clearRosterOnBandChange;
rosterAlwaysOnTop.checked = g_rosterSettings.rosterAlwaysOnTop;
rosterDelayOnFocus.checked = g_rosterSettings.rosterDelayOnFocus;
displayDelayOnFocus();
rosterDelayTime.value = g_rosterSettings.rosterDelayTime;
rosterDelayTimeTd.innerHTML = rosterDelayTime.value + "ms";
setRosterTimeView();
for (const column in ROSTER_COLUMNS)
{
if (column != "Callsign")
{
var option = newOption(column, column);
if (column == g_rosterSettings.compactEntity)
{
option.selected = true;
}
compactEntitySelect.appendChild(option);
}
}
setVisual();
document.addEventListener("keydown", onMyKeyDown, false);
@ -2188,6 +2354,71 @@ function addControls()
updateInstances();
}
function compactEntityChanged()
{
g_rosterSettings.compactEntity = compactEntitySelect.value;
viewRoster();
}
function clearRosterOnBandChangeValueChanged(what)
{
g_rosterSettings.clearRosterOnBandChange = clearRosterOnBandChange.checked;
writeRosterSettings();
}
function rosterDelayOnFocusValueChanged(what)
{
g_rosterSettings.rosterDelayOnFocus = rosterDelayOnFocus.checked;
displayDelayOnFocus();
writeRosterSettings();
}
function displayDelayOnFocus()
{
if (g_rosterSettings.rosterDelayOnFocus)
{
rosterDelayTimeTd.style.display = "block";
rosterDelayTime.style.display = "block";
}
else
{
rosterDelayTimeTd.style.display = "none";
rosterDelayTime.style.display = "none";
}
}
function changeRosterDelayTime()
{
g_rosterSettings.rosterDelayTime = rosterDelayTime.value;
rosterDelayTimeTd.innerHTML = rosterDelayTime.value + "ms";
writeRosterSettings();
}
function changeRosterTime()
{
g_rosterSettings.rosterTime = rosterTime.value;
setRosterTimeView();
writeRosterSettings();
viewRoster();
}
function changeRosterTop(butt)
{
g_rosterSettings.rosterAlwaysOnTop = butt.checked;
setRosterTop();
}
function setRosterTop()
{
nw.Window.get().setAlwaysOnTop(g_rosterSettings.rosterAlwaysOnTop);
}
function setRosterTimeView()
{
rosterTime.value = g_rosterSettings.rosterTime;
rosterTimeTd.innerHTML = Number(rosterTime.value).toDHMS();
}
function handleContextMenu(ev)
{
if (editView.style.display == "inline-block") return false;
@ -2296,7 +2527,7 @@ function handleContextMenu(ev)
}
let name = "";
if (ev.target.tagName == "TD")
if (ev.target.tagName == "TD" || (g_rosterSettings.compact && ev.target.tagName == "DIV"))
{
name = ev.target.getAttribute("name");
}

Wyświetl plik

@ -26,8 +26,8 @@ function prepareRosterSettings()
// be it's own function maybe?
rosterSettings.canMsg =
window.opener.g_mapSettings.offlineMode == false &&
window.opener.g_appSettings.gtShareEnable == "true" &&
window.opener.g_appSettings.gtMsgEnable == "true";
window.opener.g_appSettings.gtShareEnable == true &&
window.opener.g_appSettings.gtMsgEnable == true;
// The following 3 sections deal with QSLing, do we break them out
// individually or lump them into a qslUser function that sets

Wyświetl plik

@ -35,12 +35,12 @@ function processRosterFiltering(callRoster, rosterSettings)
if (!call || !call.match(CALLSIGN_REGEXP))
{
console.error(`Invalid Callsign ${call}`, entry)
// console.error(`Invalid Callsign ${call}`, entry)
entry.tx = false
continue;
}
if (rosterSettings.now - callObj.age > window.opener.g_mapSettings.rosterTime)
if (rosterSettings.now - callObj.age > g_rosterSettings.rosterTime)
{
entry.tx = false;
entry.alerted = false;

Wyświetl plik

@ -824,9 +824,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
if (g_rosterSettings.columns.Spot)
{
callObj.spot = window.opener.getSpotTime(
callObj.DEcall + callObj.mode + callObj.band + callObj.grid
);
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band + callObj.grid);
if (callObj.spot == null)
{
callObj.spot = { when: 0, snr: 0 };

Wyświetl plik

@ -1,51 +1,29 @@
// Because the County is clickable we do not allow the whole compact div to trigger an initiateQSO
g_isCompactCounty = false;
function renderCompactRosterHeaders()
{
g_isCompactCounty = (g_rosterSettings.compactEntity == "County");
return "<div id=\"buttonsDiv\" style=\"margin-left:0px;white-space:normal;\" onmouseenter='rosterInFocus()' onmouseleave='rosterNoFocus()'>";
}
function renderCompactRosterRow(callObj)
function renderCompactRosterRow(callObj, showBand)
{
var thisCall = callObj.DEcall;
var tt =
callObj.RSTsent +
"&#13256;, " +
parseInt(callObj.dt * 100) +
"ms, " +
callObj.delta +
"hz" +
(callObj.grid.length ? ", " + callObj.grid : "") +
", " +
(timeNowSec() - callObj.age).toDHMS();
var worker =
"<div class='compact' onClick='initiateQso(\"" +
thisCall +
callObj.band +
callObj.mode +
"\")' ";
worker +=
"id='" +
thisCall +
callObj.band +
callObj.mode +
"' title='" +
tt +
"'>";
worker +=
"<div class='compactCallsign' name='Callsign' " +
callObj.style.call +
" >" +
thisCall.formatCallsign() +
"</div>";
worker +=
"<div class='compactDXCC' name='DXCC (" +
callObj.dxcc +
")' " +
callObj.style.dxcc +
">" +
window.opener.g_dxccToAltName[callObj.dxcc] +
"</div>";
worker += "</div>";
var ID = callObj.DEcall + callObj.band + callObj.mode;
var title = callObj.RSTsent + "&#13256;, " + parseInt(callObj.dt * 100) + "ms, " + callObj.delta + "hz" + (callObj.grid.length ? ", " + callObj.grid : "") + ", " + (timeNowSec() - callObj.age).toDHMS();
var bandView = showBand ? "<div style='color: #" + window.opener.g_pskColors[callObj.band] + ";float:right;display:inline-block;'>" + callObj.band + "</div>" : "";
if (g_rosterSettings.compactEntity == "Band")
{
bandView = "";
}
var onClick = " onClick='initiateQso(\"" + ID + "\")' id='" + ID + "' title='" + title + "' ";
var wholeClick = (g_isCompactCounty ? "" : onClick);
var callsignClick = (g_isCompactCounty ? onClick : "");
var worker = "<div class='compact' " + wholeClick + " >";
worker += "<div class='compactCallsign' " + callsignClick + " name='Callsign' " + callObj.style.call + " >" + callObj.DEcall.formatCallsign() + bandView + "</div>";
worker += "<div class='compactData'>";
worker += renderEntryForColumn(g_rosterSettings.compactEntity, callObj, "div");
worker += "</div></div>";
return worker;
}

Wyświetl plik

@ -33,6 +33,16 @@ function renderRoster(callRoster, rosterSettings)
columnOverrides.LoTW = false;
}
if (rosterSettings.canMsg == true)
{
huntingMatrixOAMSDiv.style.display = "";
}
else
{
huntingMatrixOAMSDiv.style.display = "none";
columnOverrides.OAMS = false;
}
if (window.opener.g_appSettings.potaEnabled === 1)
{
huntingMatrixPotaDiv.style.display = "";
@ -87,17 +97,19 @@ function renderRoster(callRoster, rosterSettings)
}
window.document.title = `Call Roster: ${countParts.join(" • ")}`;
let multiInstance = false;
if (listShortInstances().length > 0)
{
window.document.title += " | " + listShortInstances().join(" • ");
multiInstance = true;
}
let showBands = (Object.keys(rosterSettings.bands).length > 1) || g_rosterSettings.columns.Band;
let multiBand = Object.keys(rosterSettings.bands).length > 1;
let showBands = multiBand || g_rosterSettings.columns.Band;
let showModes = (Object.keys(rosterSettings.modes).length > 1) || g_rosterSettings.columns.Mode;
columnOverrides.Band = showBands
columnOverrides.Mode = showModes
const rosterColumns = rosterColumnList(g_rosterSettings.columns, columnOverrides)
columnOverrides.Band = showBands;
columnOverrides.Mode = showModes;
const rosterColumns = rosterColumnList(g_rosterSettings.columns, columnOverrides);
if (g_rosterSettings.compact)
{
@ -108,7 +120,7 @@ function renderRoster(callRoster, rosterSettings)
sortCallList(visibleCallList, g_rosterSettings.sortColumn, g_rosterSettings.sortReverse);
}
let worker = g_rosterSettings.compact ? renderCompactRosterHeaders() : renderNormalRosterHeaders(rosterColumns)
let worker = g_rosterSettings.compact ? renderCompactRosterHeaders() : renderNormalRosterHeaders(rosterColumns);
// Third loop: render all rows
for (let x in visibleCallList)
@ -133,10 +145,10 @@ function renderRoster(callRoster, rosterSettings)
}
}
worker += g_rosterSettings.compact ? renderCompactRosterRow(callObj) : renderNormalRosterRow(rosterColumns, callObj)
worker += g_rosterSettings.compact ? renderCompactRosterRow(callObj, multiInstance || multiBand) : renderNormalRosterRow(rosterColumns, callObj);
}
worker += g_rosterSettings.compact ? renderCompactRosterFooter() : renderNormalRosterFooter()
worker += g_rosterSettings.compact ? renderCompactRosterFooter() : renderNormalRosterFooter();
RosterTable.innerHTML = worker;
}

Wyświetl plik

@ -13,7 +13,6 @@ function renderHeaderForColumn(column)
let attrs = (columnInfo && columnInfo.tableHeader && columnInfo.tableHeader()) || {}
attrs.name = column
attrs.html = attrs.html || column
if (columnInfo.compare)
@ -22,16 +21,21 @@ function renderHeaderForColumn(column)
attrs.onClick = `setRosterSorting('${column}');`
}
if (g_rosterSettings.sortColumn == column)
{
attrs.html += "<div style='display:inline-block;margin:0px;padding:0px;'>&nbsp;" + (g_rosterSettings.sortReverse == false ? "▲" : "▼") + "</div>";
}
return renderRosterTableHTML("th", attrs)
}
function renderEntryForColumn(column, entry)
function renderEntryForColumn(column, entry, element = "td")
{
const columnInfo = ROSTER_COLUMNS[column]
let attrs = (columnInfo && columnInfo.tableData && columnInfo.tableData(entry)) || {}
return renderRosterTableHTML("td", attrs)
return renderRosterTableHTML(element, attrs)
}
function renderRosterTableHTML(tag, attrs)

Wyświetl plik

@ -75,7 +75,7 @@ const ROSTER_COLUMNS = {
},
Band: {
compare: false,
compare: callObjSimpleComparer("band"),
tableData: (callObj) => ({
style: `color: #${window.opener.g_pskColors[callObj.band]};`,
html: callObj.band
@ -83,7 +83,7 @@ const ROSTER_COLUMNS = {
},
Mode: {
compare: false,
compare: callObjSimpleComparer("mode"),
tableData: (callObj) => ({
style: `color: #${g_modeColors[callObj.mode] || "888888"};`,
html: callObj.mode
@ -95,7 +95,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
rawAttrs: callObj.style.grid,
onClick: `centerOn("${callObj.grid}")`,
html: callObj.grid
html: (callObj.grid.length > 0 ? callObj.grid : "&nbsp;")
})
},
@ -119,7 +119,7 @@ const ROSTER_COLUMNS = {
title: window.opener.g_dxccInfo[callObj.dxcc].pp,
name: `DXCC (${callObj.dxcc})`,
rawAttrs: callObj.style.dxcc,
html: [window.opener.g_dxccToAltName[callObj.dxcc], callObj.dxccSuffix].join("&nbsp;")
html: (callObj.dxccSuffix ? [window.opener.g_dxccToAltName[callObj.dxcc], callObj.dxccSuffix].join("&nbsp;") : window.opener.g_dxccToAltName[callObj.dxcc])
})
},
@ -128,7 +128,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
align: "center",
style: "margin:0; padding:0;",
html: `<img style='padding-top:3px' src='./img/flags/16/${window.opener.g_dxccInfo[callObj.dxcc].flag}'>`
html: `<img style='margin-bottom:-3px;height:14px' src='./img/flags/16/${window.opener.g_dxccInfo[callObj.dxcc].flag}'>`
})
},
@ -137,7 +137,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
align: "center",
rawAttrs: callObj.style.state,
html: callObj.state ? callObj.state.substr(3) : ""
html: callObj.state ? callObj.state.substr(3) : "&nbsp;"
})
},
@ -150,7 +150,7 @@ const ROSTER_COLUMNS = {
let attrs = {
align: "center",
rawAttrs: callObj.style.cnty,
html: callObj.cnty ? window.opener.g_cntyToCounty[callObj.cnty] : ""
html: callObj.cnty ? window.opener.g_cntyToCounty[callObj.cnty] : "&nbsp;"
}
if (callObj.cnty && callObj.qual == false)
{
@ -168,7 +168,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
align: "center",
rawAttrs: callObj.style.cont,
html: callObj.cont ? callObj.cont : ""
html: callObj.cont ? callObj.cont : "&nbsp;"
})
},
@ -201,7 +201,7 @@ const ROSTER_COLUMNS = {
tableHeader: () => ({ html: `Dist (${window.opener.distanceUnit.value.toLowerCase()})` }),
tableData: (callObj) => ({
style: "color: cyan;",
html: Math.round(callObj.distance * MyCircle.validateRadius(window.opener.distanceUnit.value))
html: (callObj.distance > 0 ? Math.round(callObj.distance * MyCircle.validateRadius(window.opener.distanceUnit.value)) : "&nbsp;")
})
},
@ -209,7 +209,7 @@ const ROSTER_COLUMNS = {
compare: callObjSimpleComparer("heading"),
tableData: (callObj) => ({
style: "color: yellow;",
html: Math.round(callObj.heading)
html: (callObj.distance > 0 ? Math.round(callObj.heading) : "&nbsp;")
})
},
@ -235,7 +235,7 @@ const ROSTER_COLUMNS = {
compare: callObjSimpleComparer("px"),
tableData: (callObj) => ({
rawAttrs: callObj.style.px,
html: callObj.px ? callObj.px : ""
html: callObj.px ? callObj.px : "&nbsp;"
})
},
@ -281,6 +281,12 @@ const ROSTER_COLUMNS = {
}
}
}
else
{
return {
html: "&nbsp;"
}
}
}
},
@ -289,7 +295,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
style: "color: #0F0;",
align: "center",
html: (callObj.DEcall in window.opener.g_eqslCallsigns ? "&#10004;" : "")
html: (callObj.DEcall in window.opener.g_eqslCallsigns ? "&#10004;" : "&nbsp;")
})
},
@ -298,7 +304,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
style: "color: #0F0;",
align: "center",
html: (callObj.DEcall in window.opener.g_oqrsCallsigns ? "&#10004;" : "")
html: (callObj.DEcall in window.opener.g_oqrsCallsigns ? "&#10004;" : "&nbsp;")
})
},
@ -325,7 +331,7 @@ const ROSTER_COLUMNS = {
align: "center",
style: "margin: 0; padding: 0; cursor: pointer; background-clip: content-box; box-shadow: 0 0 4px 4px inset #2222FFFF;",
onClick: `openChatToCid("${callObj.gt}")`,
html: "<img height='16px' style='' src='./img/gt_chat.png' />"
html: "<img height='13px' style='margin-bottom:-2px;' src='./img/gt_chat.png' />"
}
}
else
@ -334,10 +340,16 @@ const ROSTER_COLUMNS = {
align: "center",
style: "margin: 0; padding: 0; cursor: pointer;",
onClick: `openChatToCid("${callObj.gt}")`,
html: "<img height='16px' style='' src='./img/gt_chat.png' />"
html: "<img height='13px' style='margin-bottom:-2px;' src='./img/gt_chat.png' />"
}
}
}
else
{
return {
html: "&nbsp;"
}
}
}
},
@ -379,7 +391,7 @@ const ROSTER_COLUMNS = {
},
POTA: {
compare: false,
compare: callObjSimpleComparer("pota"),
tableData: (callObj) => ({
name: "POTA",
rawAttrs: callObj.style.pota,
@ -406,7 +418,7 @@ function potaColumnRef(callObj)
}
else
{
return "";
return "&nbsp;";
}
}
@ -431,7 +443,7 @@ function wantedColumnParts(callObj, options)
if (Object.keys(callObj.hunting).length == 0)
{
return [];
return ["&nbsp;"];
}
let parts = [];

Wyświetl plik

@ -11,40 +11,29 @@ function sendAlerts(callRoster, rosterSettings)
var callObj = callRoster[entry].callObj;
// chrbayer: what does the tx field mean? no alerts are generated (at all) if this is in place...
// if (!callObj.tx) continue;
// if it's "not visible in the roster, don't put it in the report!"
if (callRoster[entry].tx == false) continue;
// TODO: Get rid of realtime
if (g_rosterSettings.realtime == false)
var call = callObj.DEcall;
g_scriptReport[call] = Object.assign({}, callObj);
g_scriptReport[call].dxccName = window.opener.g_dxccToAltName[callObj.dxcc];
g_scriptReport[call].distance = (callObj.distance > 0) ? parseInt(callObj.distance * MyCircle.validateRadius(window.opener.distanceUnit.value)) : 0;
delete g_scriptReport[call].DEcall;
g_scriptReport[call].rect = null;
delete g_scriptReport[call].rect;
delete g_scriptReport[call].style;
delete g_scriptReport[call].wspr;
delete g_scriptReport[call].qso;
delete g_scriptReport[call].instance;
if (rosterSettings.callMode != "all")
{
var call = callObj.DEcall;
g_scriptReport[call] = Object.assign({}, callObj);
g_scriptReport[call].dxccName =
window.opener.g_dxccToAltName[callObj.dxcc];
g_scriptReport[call].distance = parseInt(
callObj.distance *
MyCircle.validateRadius(window.opener.distanceUnit.value)
);
delete g_scriptReport[call].DEcall;
g_scriptReport[call].rect = null;
delete g_scriptReport[call].rect;
delete g_scriptReport[call].style;
delete g_scriptReport[call].wspr;
delete g_scriptReport[call].qso;
delete g_scriptReport[call].instance;
if (rosterSettings.callMode != "all")
{
g_scriptReport[call].shouldAlert = true;
g_scriptReport[call].reason.push(g_rosterSettings.hunting);
}
g_scriptReport[call].shouldAlert = true;
g_scriptReport[call].reason.push(g_rosterSettings.hunting);
}
if (
callObj.alerted == false &&
rosterSettings.callMode == "all" &&
callObj.shouldAlert == true
)
if (callObj.alerted == false && rosterSettings.callMode == "all" && callObj.shouldAlert == true)
{
callObj.alerted = true;
shouldAlert++;
@ -67,10 +56,7 @@ function sendAlerts(callRoster, rosterSettings)
{
script = "cr-alert.bat";
}
if (
fs.existsSync(dirPath + script) &&
g_rosterSettings.realtime == false
)
if (fs.existsSync(dirPath + script))
{
scriptExists = true;
scriptIcon.innerHTML =
@ -101,24 +87,15 @@ function sendAlerts(callRoster, rosterSettings)
}
else if (notify == "1")
{
window.opener.speakAlertString(
window.opener.huntRosterNotifyWord.value
);
window.opener.speakAlertString(window.opener.huntRosterNotifyWord.value);
}
}
if (
g_rosterSettings.realtime == false &&
scriptExists &&
window.opener.g_crScript == 1
)
if (scriptExists && window.opener.g_crScript == 1)
{
try
{
fs.writeFileSync(
dirPath + "cr-alert.json",
JSON.stringify(g_scriptReport, null, 2)
);
fs.writeFileSync(dirPath + "cr-alert.json", JSON.stringify(g_scriptReport, null, 2));
var thisProc = dirPath + script;
var cp = require("child_process");

Wyświetl plik

@ -1,3 +1,19 @@
html, body {
margin: 0px;
-webkit-user-select: none;
user-select: none;
height: 100%;
background-color: black;
color: #fff;
white-space: nowrap;
font-family: Sans-Serif;
font-size: 12px;
text-align: center;
overflow: hidden;
width: 100%;
display: block;
}
@media print {
.printHotKeyDiv {
background-color: white;
@ -21,7 +37,6 @@
#mapDiv {
height: 100%;
z-index: 0;
position: absolute;
top: 0;
@ -269,21 +284,6 @@
-webkit-border-radius: 6px;
}
html,
body {
-webkit-user-select: none;
user-select: none;
height: 100%;
background-color: black;
color: #fff;
white-space: nowrap;
font-family: Sans-Serif;
font-size: 12px;
text-align: center;
overflow: hidden;
width: 100%;
display: block;
}
button:focus {
outline: none;
@ -538,6 +538,7 @@ select {
color: #ff0;
cursor: pointer;
}
select:focus {
outline: none;
}
@ -554,18 +555,8 @@ select:disabled {
}
select option {
margin: 40px;
background: #000;
color: #fff;
text-shadow: 0 2px 0 rgba(0, 0, 0, 0.4);
-moz-appearance: none;
-webkit-appearance: none;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
text-indent: 0.2px;
text-overflow: "";
padding: 5px;
}
select option:focus {

Wyświetl plik

@ -442,7 +442,8 @@ table.rosterTable {
table.rosterTable td,
table.rosterTable th {
border: 1px solid #555;
padding: 2px 4px;
padding: 2px;
padding-bottom: 1px;
}
table.rosterTable thead {
@ -521,9 +522,11 @@ table.rosterTable thead th:first-child {
white-space: nowrap;
}
.compactDXCC {
.compactData {
padding: 2px;
max-width: 9em;
min-width: 9em;
max-height: 14px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
@ -541,14 +544,15 @@ table.rosterTable thead th:first-child {
}
.ackBadge {
padding: 0;
width: 1.5em;
padding: 0px;
margin: 0px;
height: 12px;
margin-bottom: -2px;
}
.wantedCol {
max-width: 160px;
overflow: hidden;
text-overflow:
ellipsis;
text-overflow: ellipsis;
white-space: nowrap;
}

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "GridTracker",
"product_string_do_not_use": "gridtracker",
"version": "1.23.0110",
"version": "1.23.0131",
"betaVersion": "",
"description": "GridTracker, an amateur radio companion",
"author": "GridTracker.org",