Squashed commits '${title}'

fix-state-keys-shapesjson
T Loomis 2023-12-02 01:09:18 +00:00
rodzic f1dc31b192
commit bd3d63fe2f
32 zmienionych plików z 2430 dodań i 1606 usunięć

16
debian/changelog vendored
Wyświetl plik

@ -1,3 +1,19 @@
gridtracker (1.23.1202) unstable; urgency=low
- BIGCTY - Update from November 29th
- System - Returned LoTW, eQSL and OQRS membership columns to log entries
- System - Fixed initial install window sizes
- Logbook Viewer - Added DXCC reset view button
- Call Roster
- New “Move Column Right” added to right-click Column header
- Fixed handling of compound callsigns
- Fixed saving of Ignored CQ zones and ITU zones
- New Settings Button (Ctrl-S)
- New Callsign / Message Watcher (Ctrl-W or Ctrl-O)
- New Exceptions Settings (Ctrl-E)
- New Ignores Editor / Viewer (Ctrl-I)
- New Columns Editor (Ctrl-C)
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 02 Dec 2023 00:00:00 -0000
gridtracker (1.23.1112) unstable; urgency=low
- Language - Added Français and Italiano (Special thanks to HB9TIH and HB9SNR)
- Language - Added Español (Special thanks to KI2D and HI8O)

Wyświetl plik

@ -1,6 +1,6 @@
Name: {{{ git_name name=gridtracker }}}
Summary: GridTracker: An Amateur Radio Companion
Version: 1.23.1112
Version: 1.23.1202
Release: 1%{?dist}
BuildArch: noarch
Source0: {{{ git_dir_pack }}}
@ -40,6 +40,20 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
%license %{_docdir}/%{name}/
%changelog
* Sat Dec 02 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1202-1
- BIGCTY - Update from November 29th
- System - Returned LoTW, eQSL and OQRS membership columns to log entries
- System - Fixed initial install window sizes
- Logbook Viewer - Added DXCC reset view button
- Call Roster
- New “Move Column Right” added to right-click Column header
- Fixed handling of compound callsigns
- Fixed saving of Ignored CQ zones and ITU zones
- New Settings Button (Ctrl-S)
- New Callsign / Message Watcher (Ctrl-W or Ctrl-O)
- New Exceptions Settings (Ctrl-E)
- New Ignores Editor / Viewer (Ctrl-I)
- New Columns Editor (Ctrl-C)
* Sun Nov 12 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1112-1
- Language - Added Français and Italiano (Special thanks to HB9TIH and HB9SNR)
- Language - Added Español (Special thanks to KI2D and HI8O)

Wyświetl plik

@ -761,9 +761,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td>5</td>
<td align="left">Show US States Award Layer</td>
<td></td>
<td>T</td>
<td align="left">Add TTS Alert</td>
<td>right-click<br />empty grid</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>6</td>
@ -777,9 +777,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td>7</td>
<td align="left">Show US Counties Award Layer</td>
<td></td>
<td>V</td>
<td align="left">Add PopUp Alert</td>
<td>right-click<br />empty grid</td>
<td></td>
<td align="left"></td>
<td></td>
</tr>
<tr>
<td>8</td>
@ -910,9 +910,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td></td>
</tr>
<tr>
<td>M</td>
<td align="left">Add MapCenter Alert</td>
<td>right-click<br />empty grid</td>
<td></td>
<td align="left"></td>
<td></td>
<td>F10</td>
<td align="left">Store Map Position 6</td>
<td>Shift-Key</td>
@ -1444,9 +1444,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td data-i18n="settings.audio.TextToSpeech.label" align="center">Text-to-speech Voice</td>
</tr>
<tr align="center">
<td colspan="1">
<div id="voicesDiv"></div>
</td>
<td colspan="1" id="voicesDiv"></td>
</tr>
</table>
</div>
@ -3185,8 +3183,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div>
</div>
<div id="updateSettingsDiv" class="settingsTabcontent">
<div style="left: 0; display: inline-block; height: 510px; width: 740px" id="updateText">
<embed src="./gt_update.pdf" style="width: 100%; height: 100%" frameborder="0" scrolling="yes" />
<div style="left: 0; display: inline-block; height: 510px; width: 800px" id="updateText">
<embed src="./gt_update.pdf#zoom=100&navpanes=0&page=1&toolbar=0" style="width: 100%; height: 100%" frameborder="0" scrolling="yes" />
</div>
</div>
<div style="top: 0; right: 1px; position: absolute">

Wyświetl plik

@ -76,14 +76,25 @@
wrapperDiv.style.display = "block";
}
document.addEventListener("keydown", handleEnter, false);
document.addEventListener("keyup", handleKey, false);
function handleEnter(event)
{
if (event.key == "Enter")
{
event.preventDefault();
return false;
}
return true;
}
function handleKey(event)
{
if (event.key == "Enter")
{
// Do work
var msg = messageInput.value.replace(/[\n\r]/g, '');
var msg = messageInput.value.trim();
if (msg.length > 0 && g_currentId != 0 && g_currentId in window.opener.GT.gtFlagPins && window.opener.GT.gtFlagPins[g_currentId].canmsg == true)
{
var worker = "";
@ -673,7 +684,7 @@
</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>
<textarea disabled="true" id="messageInput" maxlength="500" rows="2" value="" class="roundBorder"></textarea>
</div>
</div>
<div

Wyświetl plik

@ -80,6 +80,7 @@
}
function init() {
window.opener.GT.conditionsWindowInitialized = true;
lockNewWindows();
showConditionsBox();
@ -105,7 +106,7 @@
vertical-align: middle;
position: relative;
white-space: nowrap;
overflow: hidden;
"
>
<div id="conditionsDataDiv">

Wyświetl plik

@ -44,17 +44,432 @@
<script src="./lib/roster/sendAlerts.js" type="text/javascript"></script>
</head>
<body id="rosterBody" onload="init()" onresize="resize()" style="display:none;" class="roster" oncontextmenu="return handleContextMenu(event);">
<div id="settingsDiv">
<div style="top: 1px; right: 1px; position: absolute">
<button class="Xbutton" onclick="closeSettings()">X</button>
</div>
<div class="infotab">
<button data-i18n="settings.General.label" id="generalbox" class="infoTablinks active" onclick="openInfoTab(event, 'generalSettingsDiv')">
General
</button>
<button data-i18n="roster.watcher.label" id="watcherbox" class="infoTablinks" onclick="openInfoTab(event, 'watcherBoxDiv', openWathcherTab);">
Watcher
</button>
<button data-i18n="roster.exceptions.label" id="exceptionsbox" class="infoTablinks" onclick="openInfoTab(event, 'exceptionsBoxDiv')">
Exceptions
</button>
<button data-i18n="roster.ignores.label" id="ingoresbox" class="infoTablinks" onclick="openInfoTab(event, 'ignoresBoxDiv', renderIgnoresTab)">
Ignores
</button>
<button data-i18n="settings.Columns.label" id="columnsbox" class="infoTablinks" onclick="openInfoTab(event, 'columnsBoxDiv', renderColumnsTab)">
Columns
</button>
</div>
<div id="generalSettingsDiv" class="infoTabcontent">
<div class="mapItem" align="center">
<table >
<tr align="center" >
<td>Animate 'CQ GT'</td>
</tr>
<tr align="center">
<td>
<input type="checkbox" id="animateCQGT" onchange="changeAnimateCQGT(this)" />
</td>
</tr>
</table>
</div>
<div class="mapItem" align="center">
<table >
<tr align="center" >
<td data-i18n="settings.callroster.AlwaysOnTop.label" >Window Always On Top</td>
</tr>
<tr align="center">
<td>
<input type="checkbox" id="rosterAlwaysOnTop" onchange="changeRosterTop(this)" />
</td>
</tr>
</table>
</div>
<div class="mapItem" align="center">
<table>
<tr align="center">
<td data-i18n="settings.callroster.MaxAge.label">Roster Max Age</td>
</tr>
<tr align="center">
<td 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>
<br/>
<div class="mapItem" align="center">
<table>
<tr align="center">
<td>Clear Roster on Band change</td>
</tr>
<tr align="center">
<td colspan="1">
<input type="checkbox" id="clearRosterOnBandChange" onchange="clearRosterOnBandChangeValueChanged(this)" />
</td>
</tr>
</table>
</div>
<div class="mapItem" align="center">
<table>
<tr align="center">
<td>Decode Delay On Focus</td>
</tr>
<td align="center" colspan="1">
<input type="checkbox" id="rosterDelayOnFocus" onchange="rosterDelayOnFocusValueChanged(this)" />
</td>
<tr align="center">
<td style="display:none;" id="rosterDelayTimeTd">1500ms</td>
</tr>
<tr align="center">
<td >
<input type="range" min="50" max="5000" value="1500" step="10" class="slider" id="rosterDelayTime"
oninput="changeRosterDelayTime()" style="display:none;" />
</td>
</tr>
</table>
</div>
<div class="mapItem">
<div class="button" style="margin: 5px; font:larger; padding:5px;" id="compactModeDiv" onclick="compactModeChanged()">Compact Mode</div>
</div>
<div class="mapItem" id="compactEnityDiv">
<label>Compact Mode Entity<label><br />
<select id="compactEntitySelect" onchange="compactEntityChanged()"></select>
</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;padding:3px;" onclick="resetFilters()" title="Reset Filters">Reset Filters
(Ctrl-R)</div>
</div>
</td>
</tr>
</table>
</div>
</div>
<div id="watcherBoxDiv" class="infoTabcontent">
<div class="rowBuilder">
<table>
<tr>
<th>Name</th>
<th>Type</th>
<th>Regex</th>
<th id="watcherTextTh">Input</th>
<th>Start<br/>Date</th>
<th id="watcherStartDateTh">UTC</th>
<th>End<br/>Date</th>
<th id="watcherEndDateTh">UTC</th>
<th id="watcherAutoDeleteTh"></thid>Auto<br/>Delete</th>
<th>Clear</th>
<th>Save</th>
</tr>
<tr>
<td>
<input id="watcherName" type="text" class="inputTextValue" oninput="watcherOnName()" size="7"/>
</td>
<td>
<select id="watcherType" onchange="watcherTypeChanged(this.value)">
<option value="Callsign">Callsign</option>
<option value="Calling">Calling</option>
<option value="Message" data-i18n="gt.WSJTMessage.Message">Message</option>
</select>
</td>
<td>
<input type="checkbox" id="watcherRegexCheckbox" onchange="watcherRegexChanged(this.checked)" />
</td>
<td>
<input id="watcherText" type="text" class="inputTextValue" value="" oninput="watcherOnText()" size="10"/>
</td>
<td>
<input type="checkbox" id="watcherStartDateCheckbox" onchange="watcherStartDateEnable(this.checked)" />
</td>
<td id="watcherStartDateTd">
<input type="datetime-local" required id="watcherStartDate" style="background-color: green; color: yellow;" />
</td>
<td>
<input type="checkbox" id="watcherEndDateCheckbox" onchange="watcherEndDateEnable(this.checked)" />
</td>
<td id="watcherEndDateTd">
<input type="datetime-local" required id="watcherEndDate" style="background-color: green; color: yellow;" />
</td>
<td id="watcherAutoDeleteTd">
<input type="checkbox" id="watcherAutoDeleteCheckbox" />
</td>
<td style="font:xx-large;cursor:pointer;" onclick="clearWatcher()">🛑</td>
<td style="font:xx-large;cursor:pointer;" onclick="saveWatcher()"></td>
</tr>
</table>
</div>
<div id="watcherEditView"></div>
</div>
<div id="exceptionsBoxDiv" class="infoTabcontent">
<div class="exceptionTab">
<div id="onlySpotDiv">
<input type="checkbox" id="onlySpot" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.spottedMe" for="onlySpot">Spotted Me</label>
</div>
<div>
<input type="checkbox" id="noMyDxcc" onchange="onlyMyDxcc.checked=false; valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.noMyDXCC" for="noMyDxcc">Not My DXCC</label>
<p>
<input type="checkbox" id="onlyMyDxcc" onchange="noMyDxcc.checked=false; valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.onlyMyDXCC" for="onlyMyDxcc">Only My DXCC</label>
</div>
<div>
<input type="checkbox" id="wantMinDB" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.minDB" for="wantMinDB">Min dB</label>
<span id="minDbView" class="roundBorderValue">-24</span>
<p>
<input
type="range"
min="-25"
max="0"
step="1"
class="slider"
id="minDb"
oninput="valuesChanged();"
/>
</div>
<div>
<input type="checkbox" id="wantMaxDT" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.maxDT" for="wantMaxDT">Max DT</label>
<span id="maxDTView" class="roundBorderValue">.5</span>
<p>
<input
type="range"
min="0.1"
max="2"
step="0.1"
class="slider"
id="maxDT"
oninput="valuesChanged();"
/>
</div>
<div>
<input type="checkbox" id="wantMinFreq" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.minFreq" for="wantMinFreq">Min freq</label>
<span id="minFreqView" class="roundBorderValue">400</span>
<p>
<input
type="range"
min="0"
max="2500"
step="10"
class="slider"
id="minFreq"
oninput="valuesChanged();"
/>
</div>
<div>
<input type="checkbox" id="wantMaxFreq" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.maxFreq" for="wantMaxFreq">Max freq</label>
<span id="maxFreqView" class="roundBorderValue">3500</span>
<p>
<input
type="range"
min="500"
max="3500"
step="10"
class="slider"
id="maxFreq"
oninput="valuesChanged();"
/>
</div>
<div id="usesLoTWDiv">
<input type="checkbox" id="usesLoTW" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.usesLoTW" for="usesLoTW">Uses LoTW</label>
<span id="maxLoTWView" class="roundBorderValue" style="width: 35px;">3</span>
<p>
<input
title="Max time since their last upload"
type="range"
min="3"
max="27"
step="3"
class="slider"
id="maxLoTW"
oninput="valuesChanged();"
/>
</div>
<div id="useseQSLDiv">
<input type="checkbox" id="useseQSL" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.useseQSL" for="useseQSL">Uses eQSL</label>
</div>
<div id="usesOQRSDiv">
<input type="checkbox" id="usesOQRS" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.usesOQRS" for="usesOQRS">Uses OQRS</label>
</div>
</div>
</div>
<div id="ituzoneBoxDiv" class="infoTabcontent">
</div>
<div id="ignoresBoxDiv" class="infoTabcontent">
<div class="rowBuilder" >
Entity&nbsp;
<select id="ignoreTypeSelect" onchange="ignoreTypeChanged(this.value);">
<option value="Callsign" selected="true">Callsign</option>
<option value="CQ">CQ</option>
<option value="DXCC">DXCC</option>
<option value="CQz">CQ Zone</option>
<option value="ITUz">ITU Zone</option>
</select>
<input id="ignoreCallsignValue" type="text" class="inputTextValue" oninput="this.value = this.value.toUpperCase()" size="10"/>
<div id ="ignoreCqDiv">
CQ "<input id="ignoreCqCallsignValue" type="text" class="inputTextValue" oninput="this.value = this.value.toUpperCase()" size="4" value=""/>"
From
<select id="ignoreCqDxccSelect"><option value=-1 selected="true">All</option></select>
</div>
<select id="ignoreDxccSelect" >
<option value=-1 selected="true" data-i18n="mapFilter.prop.Unknown">Unknown</option>
</select>
<select id="ignoreCqzSelect"></select>
<select id="ignoreItuzSelect"></select>
<button onclick="addNewIgnore()" class="flexButton" style="background-color: #000000;font-weight:bold;font-size:larger;color:lightgreen;">+</button>
<labal id="ingnoreAddResultLabel"></label>
</div>
<div id="ignoresEditView"></div>
</div>
<div id="columnsBoxDiv" class="infoTabcontent">
<div id="columnsEditView">
</div>
</div>
</div>
<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">
<div id="txrxdec" style="background-color: Green; border-style: outset; border-color: yellow; border-width: 3px; margin: 2px;" class="roundBorder">
Waiting…
</div>
<div class="button" style="margin: 3px" onclick="window.opener.haltAllTx(true);" data-i18n="roster.haltTX">Halt Tx</div>
<div class="button" style="margin: 3px;" onclick="window.opener.haltAllTx(true);" data-i18n="roster.haltTX">Halt Tx</div>
<div class="button" style="margin: 3px;color:cyan;" onclick="openSettings();" data-i18n="roster.menu.Settings"></div>
</div>
<div id="MoreLessControls">
<div id="MoreControls">
<div data-i18n="roster.controls.more" class="link" onclick="toggleMoreControls()" id="ShowMoreControlsLink">More Controls</div>
</div>
<div id="LessControls">
<div data-i18n="roster.controls.less" class="link" onclick="toggleMoreControls()" id="ShowFewerControlsLink">Fewer Controls</div>
</div>
@ -106,7 +521,7 @@
<option data-i18n="roster.controls.huntState.label"value="" selected="true">Select Territory</option>
</select>
<select id="DXCCsSelect" onchange="valuesChanged();" id="HuntDXCCsControls">
<select id="DxccSingleSelect" onchange="valuesChanged();"">
<option data-i18n="roster.controls.huntDXCC.label" value="-1" selected="true">Select DXCC</option>
</select>
</div>
@ -150,8 +565,7 @@
<div id="SecondaryRosterControls">
<div id="huntingMatrixDiv" class="secondaryControlGroup">
<h3 data-i18n="roster.secondary.wanted.label">Wanted</h3>
<div class='columns'>
<div class="columns">
<div>
<input type="checkbox" id="huntCallsign" onchange="wantedChanged(this);" />
<label data-i18n="roster.secondary.wanted.callsign" for="huntCallsign">Callsign</label>
@ -180,8 +594,6 @@
<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>
<input type="checkbox" id="huntCQz" onchange="wantedChanged(this);" />
<label data-i18n="roster.secondary.wanted.cqzone" for="huntCQz" title="CQ Zones">CQz</label>
@ -207,207 +619,34 @@
<label data-i18n="roster.secondary.wanted.cont" for="huntCont" title="Continent">Continent</label>
</div>
<div>
<input type="checkbox" id="huntRegex" onchange="wantedChanged(this);" />
<label data-i18n="roster.secondary.wanted.regex" title="Callsign Regular Expression">Regex</label>
<input
type="text"
class="inputTextValue"
size="12"
id="huntRegexValue"
onfocus="CR.typingInRoster=true;"
onblur="CR.typingInRoster=false;"
oninput="valuesChanged();"
onkeydown="blurOnEnter(this);"
/>
<input type="checkbox" id="huntWatcher" onchange="wantedChanged(this);" />
<label data-i18n="roster.watcher.label" class="flexButton" onclick="openWatcher();">Watcher</label>
</div>
</div>
</div>
<div id="exceptionDiv" class="secondaryControlGroup">
<h3 data-i18n="roster.secondary.exceptions.label">Exceptions</h3>
<div class='columns'>
<div id="exceptionDiv" class="secondaryControlGroup" >
<h3 data-i18n="roster.exceptions.label">Exceptions</h3>
<div class="columns">
<div>
<input type="checkbox" id="cqOnly" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.cqOnly" for="cqOnly">CQ Only</label>
<label data-i18n="roster.secondary.exceptions.cqOnly" for="cqOnly">CQ Only</label>
</div>
<div>
<input type="checkbox" id="wantGrid" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.hasGrid" for="wantGrid">Has Grid</label>
</div>
<div>
<input type="checkbox" id="wantMinDB" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.minDB" for="wantMinDB">Min dB</label>
<input
type="range"
min="-25"
max="0"
step="1"
class="slider"
id="minDb"
oninput="valuesChanged();"
/>
<span id="minDbView" class="roundBorderValue">-24</span>
</div>
<div>
<input type="checkbox" id="wantMaxDT" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.maxDT" for="wantMaxDT">Max DT</label>
<input
type="range"
min="0.1"
max="2"
step="0.1"
class="slider"
id="maxDT"
oninput="valuesChanged();"
/>
<span id="maxDTView" class="roundBorderValue">.5</span>
</div>
<div>
<input type="checkbox" id="wantMinFreq" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.minFreq" for="wantMinFreq">Min freq</label>
<input
type="range"
min="0"
max="2500"
step="10"
class="slider"
id="minFreq"
oninput="valuesChanged();"
/>
<span id="minFreqView" class="roundBorderValue">400</span>
</div>
<div>
<input type="checkbox" id="wantMaxFreq" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.maxFreq" for="wantMaxFreq">Max freq</label>
<input
type="range"
min="500"
max="3500"
step="10"
class="slider"
id="maxFreq"
oninput="valuesChanged();"
/>
<span id="maxFreqView" class="roundBorderValue">3500</span>
</div>
<div id="usesLoTWDiv">
<input type="checkbox" id="usesLoTW" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.usesLoTW" for="usesLoTW">Uses LoTW</label>
<input
title="Max time since their last upload"
type="range"
min="3"
max="27"
step="3"
class="slider"
id="maxLoTW"
oninput="valuesChanged();"
/>
<span id="maxLoTWView" class="roundBorderValue" style="width: 35px;">3</span>
</div>
<div id="onlySpotDiv">
<input type="checkbox" id="onlySpot" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.spottedMe" for="onlySpot">Spotted Me</label>
</div>
<div>
<input type="checkbox" id="noMyDxcc" onchange="onlyMyDxcc.checked=false; valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.noMyDXCC" for="noMyDxcc">Not My DXCC</label>
</div>
<div>
<input type="checkbox" id="onlyMyDxcc" onchange="noMyDxcc.checked=false; valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.onlyMyDXCC" for="onlyMyDxcc">Only My DXCC</label>
</div>
<div id="useseQSLDiv">
<input type="checkbox" id="useseQSL" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.useseQSL" for="useseQSL">Uses eQSL</label>
</div>
<div id="usesOQRSDiv">
<input type="checkbox" id="usesOQRS" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.usesOQRS" for="usesOQRS">Uses OQRS</label>
</div>
<div id="allOnlyNewDiv">
<input type="checkbox" id="allOnlyNew" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.allOnlyNew" for="allOnlyNew">Only New Calls</label>
</div>
<div>
<input type="checkbox" id="wantRRCQ" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.wantRRCQ" for="wantRRCQ">RR73 as CQ</label>
</div>
<div>
<input type="checkbox" id="noUnknownDXCC" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.noUnknownDXCC" >No Unknown DXCC</label>
</div>
<div>
<input type="checkbox" id="noMsg" onchange="valuesChanged();" />
<label title="No Decodes Containing..." data-i18n="roster.secondary.exceptions.noMsg.label" style="padding-right: 2em;">
No
</label>
<input
type="text"
class="inputTextValue"
size="8"
id="noMsgValue"
onfocus="CR.typingInRoster=true;"
onblur="CR.typingInRoster=false;"
oninput="valuesChanged();"
onkeydown="blurOnEnter(this);"
/>
</div>
<div>
<input type="checkbox" id="onlyMsg" onchange="valuesChanged();" />
<label title="Only Decodes Containing..." data-i18n="roster.secondary.exceptions.onlyMsg.label">
Only
</label>
<input
type="text"
class="inputTextValue"
size="8"
id="onlyMsgValue"
onfocus="CR.typingInRoster=true;"
onblur="CR.typingInRoster=false;"
oninput="valuesChanged();"
onkeydown="blurOnEnter(this);"
/>
</div>
<div>
<input type="checkbox" id="useRegex" onchange="valuesChanged();" />
<label title="Callsign Regular Expression" data-i18n="roster.secondary.exceptions.regex.label">
Regex
</label>
<input
type="text"
class="inputTextValue"
size="12"
id="callsignRegex"
onfocus="CR.typingInRoster=true;"
onblur="CR.typingInRoster=false;"
oninput="valuesChanged();"
onkeydown="blurOnEnter(this);"
/>
<input type="checkbox" id="wantGrid" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.hasGrid" for="wantGrid">Has Grid</label>
</div>
<div id="allOnlyNewDiv">
<input type="checkbox" id="allOnlyNew" onchange="valuesChanged();" />
<label data-i18n="roster.secondary.exceptions.allOnlyNew" for="allOnlyNew">Only New Calls</label>
</div>
</div>
<div class="flexButton" style="margin-left: 15px;font:smaller;" onclick="openExceptions()">More</div>
</div>
</div>
</header>
@ -419,221 +658,8 @@
<main id="RosterTable"></main>
</div>
<div id="rosterDelayDiv" class="roundBorder" style="display:none; margin: 0px; margin-top: -1px; position:fixed; top:0px; left:0px;">&#8987;</div>
<div id="rosterDelayDiv" class="roundBorder" style="display:none; margin: 0px; margin-top: -1px; position:fixed; top:3px; left:3px;font-size:larger;">&#8987;</div>
<div
id="editView"
class="roundBorder"
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 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

@ -165,6 +165,7 @@
"settings.Logging.label": "日志記錄",
"settings.Alerts.label": "警報",
"settings.CallRoster.label": "呼叫清單",
"settings.Columns.label": "表格列",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding",
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
@ -436,7 +437,7 @@
"settings.alerts.CustomAlerts.new.repeat.exit": "直到退出",
"settings.alerts.CustomAlerts.new.repeat.once": "一次",
"settings.alerts.CustomAlerts.new.repeat.never": "從不",
"settings.alerts.CustomAlerts.new.addButton": "加",
"settings.alerts.CustomAlerts.new.addButton": "加",
"settings.OAMS.message.enable.label": "啟用消息傳遞",
"settings.OAMS.message.enable.hover": "啟用消息傳遞",
"settings.OAMS.spotting.enable.label": "啟用定位",
@ -506,7 +507,7 @@
"lookup.title": "呼號信息查詢",
"lookup.callsign.label": "呼號:",
"lookup.callsign.button": "尋找",
"lookup.noinfo": "沒有要顯示的呼號信息<br/>請嘗試其他呼號尋找!",
"lookup.noinfo": "沒有要顯示的呼號信息 請嘗試其他呼號尋找!",
"COMMENT_gt_popup.html": "",
"popup.title": "數據突破",
"COMMENT_gt_roster.html": "",
@ -561,7 +562,7 @@
"roster.secondary.wanted.marathon": "Marathon",
"roster.secondary.wanted.county": "縣",
"roster.secondary.wanted cont": "續",
"roster.secondary.exceptions.label": "例外情況",
"roster.exceptions.label": "例外情況",
"roster.secondary.exceptions.cqOnly": "僅限CQ",
"roster.secondary.exceptions.hasGrid": "有網格",
"roster.secondary.exceptions.minDB": "最小dB",
@ -584,8 +585,10 @@
"roster.secondary.excpetions.regex.label": "正則表達式",
"roster.secondary.exceptions.regex.hover": "調用符號正則表達式",
"roster.secondary.instances.label": "實例",
"roster.ignoresTable.title": "呼號, 忽略CQ和DXCC",
"roster.ignoresTable.close": "關閉",
"roster.ignores.label": "忽視",
"roster.close": "關閉",
"roster.watcher.label": "觀察者",
"roster.add.watcher.label": "添加觀察者",
"COMMENT_gt_stats.html": "",
"stats.title": "日志數據統計",
"stats.tabs.logbook": "日志",
@ -1012,6 +1015,7 @@
"roster.menu.IgnoreCall": "忽視呼號",
"roster.menu.Realtime": "實時",
"roster.menu.MoveLeft": "列向左移動",
"roster.menu.MoveRight": "列向右移動",
"roster.menu.ClearCallIgnore": "清除忽視呼號",
"roster.menu.ClearIgnore": "清除忽視",
"roster.menu.ClearCQFromDXCC": "清除來自 DXCC 的 CQ",

Wyświetl plik

@ -165,6 +165,7 @@
"settings.Logging.label": "日志记录",
"settings.Alerts.label": "警报",
"settings.CallRoster.label": "呼叫列表",
"settings.Columns.label": "表格列",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding",
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
@ -436,7 +437,7 @@
"settings.alerts.CustomAlerts.new.repeat.exit": "直到退出",
"settings.alerts.CustomAlerts.new.repeat.once": "一次",
"settings.alerts.CustomAlerts.new.repeat.never": "从不",
"settings.alerts.CustomAlerts.new.addButton": "加",
"settings.alerts.CustomAlerts.new.addButton": "加",
"settings.OAMS.message.enable.label": "启用消息传递",
"settings.OAMS.message.enable.hover": "启用消息传递",
"settings.OAMS.spotting.enable.label": "启用定位",
@ -506,7 +507,7 @@
"lookup.title": "呼号信息查询",
"lookup.callsign.label": "呼号:",
"lookup.callsign.button": "查找",
"lookup.noinfo": "没有要显示的呼号信息<br/>请尝试其他呼号查找!",
"lookup.noinfo": "没有要显示的呼号信息 请尝试其他呼号查找!",
"COMMENT_gt_popup.html": "",
"popup.title": "数据突破",
"COMMENT_gt_roster.html": "",
@ -561,7 +562,7 @@
"roster.secondary.wanted.marathon": "马拉松",
"roster.secondary.wanted.county": "县",
"roster.secondary.wanted cont": "续",
"roster.secondary.exceptions.label": "例外情况",
"roster.exceptions.label": "例外情况",
"roster.secondary.exceptions.cqOnly": "仅限CQ",
"roster.secondary.exceptions.hasGrid": "有网格",
"roster.secondary.exceptions.minDB": "最小dB",
@ -584,8 +585,10 @@
"roster.secondary.excpetions.regex.label": "正则表达式",
"roster.secondary.exceptions.regex.hover": "调用符号正则表达式",
"roster.secondary.instances.label": "实例",
"roster.ignoresTable.title": "呼号, 忽略CQ和DXCC",
"roster.ignoresTable.close": "关闭",
"roster.ignores.label": "忽視",
"roster.close": "关闭",
"roster.watcher.label": "观察者",
"roster.add.watcher.label": "添加观察者",
"COMMENT_gt_stats.html": "",
"stats.title": "日志数据统计",
"stats.tabs.logbook": "日志",
@ -1012,6 +1015,7 @@
"roster.menu.IgnoreCall": "忽略呼叫",
"roster.menu.Realtime": "实时",
"roster.menu.MoveLeft": "向左移动列",
"roster.menu.MoveRight": "向右移动列",
"roster.menu.ClearCallIgnore": "清除已忽略的呼叫",
"roster.menu.ClearIgnore": "清除忽略",
"roster.menu.ClearCQFromDXCC": "从DXCC中清除CQ",

Wyświetl plik

@ -46,7 +46,7 @@
"bandActivity.hover": "PSK-Reporter Band-Aktivität",
"quickStats.hover": "Statistik",
"quickStats.CallRX.hover": "Gehörte Rufzeichen",
"quickStats.CallRX.label": "Rx Rufzeichen",
"quickStats.CallRX.label": "Rx Calls",
"quickStats.QSO.hover": "Gearbeitete Stationen",
"quickStats.QSO.label": "QSO",
"quickStats.DXCCRx.hover": "Gehörte DXCCs",
@ -54,9 +54,9 @@
"quickStats.QSL.hover": "QSL Liste",
"quickStats.QSL.label": "QSL",
"quickLoad.clearLive.hover": "GridTracker's Live-Daten zurücksetzen",
"quickLoad.clearLive.label": "Live zurücksetzen",
"quickLoad.clearLive.label": "Live löschen",
"quickLoad.clearLog.hover": "Log-Daten zurücksetzen (löscht keine Dateien)",
"quickLoad.clearLog.label": "Log zurücksetzen",
"quickLoad.clearLog.label": "Log löschen",
"quickLoad.loadLog.label": "Log laden",
"mapFilter.title.hover": "Kartenansicht-Einstellungen",
"mapFilter.title.label": "Kartenansicht-Filter",
@ -165,6 +165,7 @@
"settings.Logging.label": "Logging",
"settings.Alerts.label": "Alarme",
"settings.CallRoster.label": "Rufzeichenliste",
"settings.Columns.label": "Spalten",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Simplepush Nachrichtenweiterleitung",
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
@ -560,7 +561,7 @@
"roster.secondary.wanted.marathon": "Marathon",
"roster.secondary.wanted.county": "Kreis",
"roster.secondary.wanted.cont": "Kont",
"roster.secondary.exceptions.label": "Filter",
"roster.exceptions.label": "Filter",
"roster.secondary.exceptions.cqOnly": "Nur CQ",
"roster.secondary.exceptions.hasGrid": "Nur mit Locator",
"roster.secondary.exceptions.minDB": "Min dB",
@ -573,7 +574,7 @@
"roster.secondary.exceptions.onlyMyDXCC": "Nur mein DXCC",
"roster.secondary.exceptions.useseQSL":" Benutzt eQSL",
"roster.secondary.exceptions.usesOQRS": "Benutzt OQRS",
"roster.secondary.exceptions.allOnlyNew": "Nur neue Rufzeichen",
"roster.secondary.exceptions.allOnlyNew": "Nur neue Calls",
"roster.secondary.exceptions.wantRRCQ": "RR73 als CQ",
"roster.secondary.exceptions.noUnknownDXCC": "Keine unbekannten DXCC",
"roster.secondary.exceptions.noMsg.label": "Keine",
@ -583,8 +584,10 @@
"roster.secondary.exceptions.regex.label": "Regex",
"roster.secondary.exceptions.regex.hover": "Rufzeichen RegEx",
"roster.secondary.instances.label": "Instanzen",
"roster.ignoresTable.title": "Rufzeichen, CQ and DXCC Ausnahmen",
"roster.ignoresTable.close": "Schliessen",
"roster.ignores.label": "Ignoriert",
"roster.close": "Schliessen",
"roster.watcher.label": "Beobachten",
"roster.add.watcher.label": "Beobachter hinzufügen",
"COMMENT_gt_stats.html": "",
"stats.title": "Statistiken",
"stats.tabs.logbook": "Logbücher",
@ -1027,15 +1030,18 @@
"roster.ignore.DXCCs": "DXCCs",
"roster.ignore.CQZones": "CQ-Zonen",
"roster.ignore.ITUZones": "ITU-Zonen",
"roster.menu.Settings": "Einstellungen",
"roster.menu.HideControls": "Einstellungen ausblenden",
"roster.menu.ShowControls": "Einstellungen anzeigen",
"roster.menu.CompactMode": "Kompaktmodus",
"roster.menu.RosterMode": "Rostermodus",
"roster.menu.Lookup": "Nachschlagen",
"roster.menu.GenMesg": "WSJT-X befüllen",
"roster.menu.AimRotator": "Rotor ausrichten",
"roster.menu.IgnoreCall": "Rufzeichen ignorieren",
"roster.menu.Realtime": "Echtzeit",
"roster.menu.MoveLeft": "Spalte nach links verschieben",
"roster.menu.MoveRight": "Spalte nach rechts verschieben",
"roster.menu.ClearCallIgnore": "Ignorierte Rufzeichen aufheben",
"roster.menu.ClearIgnore": "Ignorierte aufheben",
"roster.menu.ClearCQFromDXCC": "CQ von DXCC aufheben",

Wyświetl plik

@ -164,6 +164,7 @@
"settings.Logging.label": "Logging",
"settings.Alerts.label": "Alerts",
"settings.CallRoster.label": "Call Roster",
"settings.Columns.label": "Columns",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding",
"settings.OAMS.simplepush.apikey.label": "Simplepush API Key",
@ -373,7 +374,7 @@
"settings.logging.pstrotator.details.Port": "UDP Port",
"settings.callroster.AlwaysOnTop.label": "Window Always On Top",
"settings.callroster.AlwaysOnTop.hover": "Keep Call Roster Above Other Windows",
"settings.callroster.MaxAge.label": "Call Roster Max Age",
"settings.callroster.MaxAge.label": "Roster Max Age",
"settings.callroster.MultiRig.label": "On QSO Reply",
"settings.callroster.MultiRig.HaltTx.label": "Halt Tx On All Other Instances",
"settings.callroster.MultiRig.SwitchView.label": "Switch View to Transmitting Instance",
@ -505,7 +506,7 @@
"lookup.title": "Callsign Lookup",
"lookup.callsign.label": "Callsign",
"lookup.callsign.button": "Lookup",
"lookup.noinfo": "No Callsign information to display<br />try a lookup!",
"lookup.noinfo": "No Callsign information to display, try a lookup!",
"COMMENT_gt_popup.html": "",
"popup.title": "Data Breakout",
"COMMENT_gt_roster.html": "",
@ -561,7 +562,7 @@
"roster.secondary.wanted.marathon": "Marathon",
"roster.secondary.wanted.county": "County",
"roster.secondary.wanted.cont": "Continent",
"roster.secondary.exceptions.label": "Exceptions",
"roster.exceptions.label": "Exceptions",
"roster.secondary.exceptions.cqOnly": "CQ Only",
"roster.secondary.exceptions.hasGrid": "Has Grid",
"roster.secondary.exceptions.minDB": "Min dB",
@ -584,8 +585,10 @@
"roster.secondary.exceptions.regex.label": "Regex",
"roster.secondary.exceptions.regex.hover": "Callsign Regular Expression",
"roster.secondary.instances.label": "Instances",
"roster.ignoresTable.title": "Callsign, CQ and DXCC Ignores",
"roster.ignoresTable.close": "Close",
"roster.ignores.label": "Ignores",
"roster.close": "Close",
"roster.watcher.label": "Watcher",
"roster.add.watcher.label": "Add Watcher",
"COMMENT_gt_stats.html": "",
"stats.title": "Statistics",
"stats.tabs.logbook": "Logbook",
@ -1013,6 +1016,7 @@
"roster.menu.IgnoreCall": "Ignore Call",
"roster.menu.Realtime": "Realtime",
"roster.menu.MoveLeft": "Move Column Left",
"roster.menu.MoveRight": "Move Column Right",
"roster.menu.ClearCallIgnore": "Clear Call Ignore",
"roster.menu.ClearIgnore": "Clear Ignore",
"roster.menu.ClearCQFromDXCC": "Clear CQ from DXCC",

Wyświetl plik

@ -164,6 +164,7 @@
"settings.Logging.label": "Registros",
"settings.Alerts.label": "Alertas",
"settings.CallRoster.label": "Lista de llamadas",
"settings.Columns.label": "Columnas",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Reenvío mensajes Simplepush.io",
"settings.OAMS.simplepush.apikey.label": "Llave de API Simplepush",
@ -504,7 +505,7 @@
"lookup.title": "Búsqueda de Indicativo",
"lookup.callsign.label": "Indicativo",
"lookup.callsign.button": "Buscar",
"lookup.noinfo": "No hay información de indicativo para mostrar<br />intente una búsqueda",
"lookup.noinfo": "No hay información de indicativo para mostrar, intente una búsqueda",
"COMMENT_gt_popup.html": "",
"popup.title": "Desglose de Datos",
"COMMENT_gt_roster.html": "",
@ -560,7 +561,7 @@
"roster.secondary.wanted.marathon": "Maratón",
"roster.secondary.wanted.county": "Condado",
"roster.secondary.wanted.cont": "Continente",
"roster.secondary.exceptions.label": "Excepciones",
"roster.exceptions.label": "Excepciones",
"roster.secondary.exceptions.cqOnly": "Solo CQ",
"roster.secondary.exceptions.hasGrid": "Tiene Grid",
"roster.secondary.exceptions.minDB": "dB Mínimo",
@ -583,8 +584,10 @@
"roster.secondary.exceptions.regex.label": "Regex",
"roster.secondary.exceptions.regex.hover": "Expresión Regular de Indicativo",
"roster.secondary.instances.label": "Instancias",
"roster.ignoresTable.title": "Ignorar Indicativos de Llamada, CQ y DXCC",
"roster.ignoresTable.close": "Cerrar",
"roster.ignores.label": "Ignorar",
"roster.close": "Cerrar",
"roster.watcher.label": "Observador",
"roster.add.watcher.label": "Agregar observador",
"COMMENT_gt_stats.html": "",
"stats.title": "Estadísticas",
"stats.tabs.logbook": "Libro de Guardia",
@ -1007,7 +1010,8 @@
"roster.menu.AimRotator": "Apuntar Rotador",
"roster.menu.IgnoreCall": "Ignorar Llamada",
"roster.menu.Realtime": "En Vivo",
"roster.menu.MoveLeft": "Mover Columna a la Izquierda",
"roster.menu.MoveLeft": "Mover Columna a la izquierda",
"roster.menu.MoveRight": "Mover Columna a la derecha",
"roster.menu.ClearCallIgnore": "Borrar Ignorar Llamada",
"roster.menu.ClearIgnore": "Borrar Ignorar",
"roster.menu.ClearCQFromDXCC": "Borrar CQ de DXCC",

Wyświetl plik

@ -164,6 +164,7 @@
"settings.Logging.label": "Enregistrement",
"settings.Alerts.label": "Alertes",
"settings.CallRoster.label": "Liste des appels",
"settings.Columns.label": "Colonnes",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Transfert de messages Simplepush.io",
"settings.OAMS.simplepush.apikey.label": "Clé API Simplepush",
@ -505,7 +506,7 @@
"lookup.title": "Recherche d'un indicatif",
"lookup.callsign.label": "Indicatif",
"lookup.callsign.button": "Consulter",
"lookup.noinfo": "Pas d'information sur l'indicatif à afficher<br />essayez une recherche !",
"lookup.noinfo": "Pas d'information sur l'indicatif à afficher, essayez une recherche !",
"COMMENT_gt_popup.html": "",
"popup.title": "Répartition des données",
"COMMENT_gt_roster.html": "",
@ -561,7 +562,7 @@
"roster.secondary.wanted.marathon": "Marathon",
"roster.secondary.wanted.county": "Pays",
"roster.secondary.wanted.cont": "Continent",
"roster.secondary.exceptions.label": "Exceptions",
"roster.exceptions.label": "Exceptions",
"roster.secondary.exceptions.cqOnly": "CQ uniquement",
"roster.secondary.exceptions.hasGrid": "Dispose d'une grille",
"roster.secondary.exceptions.minDB": "Min dB",
@ -584,8 +585,10 @@
"roster.secondary.exceptions.regex.label": "Filtre",
"roster.secondary.exceptions.regex.hover": "Recherche indicatifs (même partielle)",
"roster.secondary.instances.label": "Instances",
"roster.ignoresTable.title": "Ignorer les indicatifs, les CQ et les DXCC",
"roster.ignoresTable.close": "Fermer",
"roster.ignores.label": "Ignorer",
"roster.close": "Fermer",
"roster.watcher.label": "Observateur",
"roster.add.watcher.label": "Ajouter observateur",
"COMMENT_gt_stats.html": "",
"stats.title": "Statistiques",
"stats.tabs.logbook": "Journal de bord",
@ -1013,6 +1016,7 @@
"roster.menu.IgnoreCall": "Ignorer l'appel",
"roster.menu.Realtime": "Temps réel",
"roster.menu.MoveLeft": "Déplacer la colonne vers la gauche",
"roster.menu.MoveRight": "Déplacer la colonne vers la droite",
"roster.menu.ClearCallIgnore": "Effacer l'appel Ignorer",
"roster.menu.ClearIgnore": "Effacer Ignorer",
"roster.menu.ClearCQFromDXCC": "Effacer le CQ du DXCC",

Wyświetl plik

@ -164,6 +164,7 @@
"settings.Logging.label": "Registrazione",
"settings.Alerts.label": "Allarmi",
"settings.CallRoster.label": "Elenco delle chiamate",
"settings.Columns.label": "Colonne",
"settings.OAMS.label": "OAMS",
"settings.OAMS.simplepush.enable.label": "Trasferimento di messaggi con Simplepush.io",
"settings.OAMS.simplepush.apikey.label": "Chiave API Simplepush",
@ -505,7 +506,7 @@
"lookup.title": "Cerca un nominativo",
"lookup.callsign.label": "Nominativo",
"lookup.callsign.button": "Consultare",
"lookup.noinfo": "Non ci sono informazioni sul nominativo da visualizzare<br />prova a fare una ricerca!",
"lookup.noinfo": "Non ci sono informazioni sul nominativo da visualizzare, prova a fare una ricerca!",
"COMMENT_gt_popup.html": "",
"popup.title": "Distribuzione dei dati",
"COMMENT_gt_roster.html": "",
@ -561,7 +562,7 @@
"roster.secondary.wanted.marathon": "Marathon",
"roster.secondary.wanted.county": "Paese",
"roster.secondary.wanted.cont": "Continente",
"roster.secondary.exceptions.label": "Eccezioni",
"roster.exceptions.label": "Eccezioni",
"roster.secondary.exceptions.cqOnly": "Solo CQ",
"roster.secondary.exceptions.hasGrid": "Ha una griglia",
"roster.secondary.exceptions.minDB": "Min dB",
@ -584,8 +585,10 @@
"roster.secondary.exceptions.regex.label": "Filtro",
"roster.secondary.exceptions.regex.hover": "Ricerca nominativo (anche parziale)",
"roster.secondary.instances.label": "Enti",
"roster.ignoresTable.title": "Ignorare i nominativi, i CQ e i DXCC",
"roster.ignoresTable.close": "Chiudere",
"roster.ignores.label": "Ignorare",
"roster.close": "Chiudere",
"roster.watcher.label": "Osservatore",
"roster.add.watcher.label": "Aggiungi Osservatore",
"COMMENT_gt_stats.html": "",
"stats.title": "Statistiche",
"stats.tabs.logbook": "Diario di bordo",
@ -1013,6 +1016,7 @@
"roster.menu.IgnoreCall": "Ignorare la chiamata",
"roster.menu.Realtime": "Tempo reale",
"roster.menu.MoveLeft": "Spostare la colonna a sinistra",
"roster.menu.MoveRight": "Sposta la colonna a destra",
"roster.menu.ClearCallIgnore": "Eliminare la chiamata Ignorare",
"roster.menu.ClearIgnore": "Elimina Ignora",
"roster.menu.ClearCQFromDXCC": "Cancellare CQ da DXCC",

Plik binarny nie jest wyświetlany.

Przed

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

Plik binarny nie jest wyświetlany.

Przed

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

Wyświetl plik

@ -9,8 +9,11 @@ var validSettings = [
"awardTracker",
"bandActivity",
"blockedCQ",
"ignoredCQ",
"blockedCalls",
"blockedDxcc",
"blockedCQz",
"blockedITUz",
"callsignLookups",
"classicAlerts",
"classicAlertsVersion",

Wyświetl plik

@ -7,6 +7,7 @@ var gtVersionStr = pjson.version
var gtVersion = parseInt(gtVersionStr.replace(/\./g, ""));
var gtBeta = pjson.betaVersion;
GT.startingUp = true;
// var GT is in screen.js
GT.startVersion = 0;
@ -15,8 +16,14 @@ if (typeof localStorage.currentVersion != "undefined")
GT.startVersion = parseInt(localStorage.currentVersion);
}
GT.firstRun = false;
if (typeof localStorage.currentVersion == "undefined" || localStorage.currentVersion != String(gtVersion))
{
if (typeof localStorage.currentVersion == "undefined")
{
GT.firstRun = true;
}
localStorage.currentVersion = String(gtVersion);
}
@ -48,13 +55,18 @@ if (GT.platform.indexOf("darwin") > -1)
const gui = require("nw.gui");
const win = gui.Window.get();
if (GT.firstRun)
{
win.moveTo(2, 2);
}
GT.developerMode = process.versions["nw-flavor"] == "sdk";
GT.popupWindowHandle = null;
GT.callRosterWindowHandle = null;
GT.conditionsWindowHandle = null;
GT.conditionsWindowInitialized = false;
GT.chatWindowHandle = null;
GT.chatWindowInitialized = false;
GT.statsWindowHandle = null;
GT.lookupWindowHandle = null;
GT.lookupWindowInitialized = false;
@ -455,6 +467,7 @@ GT.directCallToITUzone = {};
GT.prefixToCQzone = {};
GT.prefixToITUzone = {};
GT.dxccToAltName = {};
GT.altNameToDXCC = {};
GT.dxccToADIFName = {};
GT.gridToDXCC = {};
@ -552,17 +565,17 @@ GT.pskColors["2200m"] = "FF4500";
GT.pskColors["630m"] = "1E90FF";
GT.pskColors["160m"] = "7CFC00";
GT.pskColors["80m"] = "E550E5";
GT.pskColors["60m"] = "0000FF";
GT.pskColors["40m"] = "4949FF";
GT.pskColors["60m"] = "99CCFF";
GT.pskColors["40m"] = "00FFFF";
GT.pskColors["30m"] = "62FF62";
GT.pskColors["20m"] = "FFC40C";
GT.pskColors["17m"] = "F2F261";
GT.pskColors["15m"] = "CCA166";
GT.pskColors["12m"] = "B22222";
GT.pskColors["12m"] = "CB3D3D";
GT.pskColors["11m"] = "00FF00";
GT.pskColors["10m"] = "FF69B4";
GT.pskColors["8m"] = "8b00fb";
GT.pskColors["6m"] = "FF0000";
GT.pskColors["6m"] = "ff4d4d";
GT.pskColors["4m"] = "df0040";
GT.pskColors["2m"] = "FF1493";
GT.pskColors["1.25m"] = "beff00";
@ -976,7 +989,7 @@ function getWpx(callsign)
if (foundPrefix) prefix = callsign.substr(0, prefixEnd + 1);
return prefix;
return String(prefix);
}
function setState(details)
@ -1467,20 +1480,6 @@ function addDeDx(
}
}
// we don't need confirmations, worked is enough
/* if (finalPOTA)
{
GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA] = true;
GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + mode] = true;
GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + band] = true;
GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + band + mode] = true;
if (isDigi == true)
{
GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + "dg"] = true;
GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + band + "dg"] = true;
}
} */
GT.tracker.confirmed.call[finalDXcall + band + mode] = true;
GT.tracker.confirmed.call[finalDXcall] = true;
GT.tracker.confirmed.call[finalDXcall + mode] = true;
@ -2014,6 +2013,10 @@ function createTooltTipTable(toolElement)
"<td>" + $.i18n("gt.newCallList.LastMsg") + "</td>" +
"<td>" + $.i18n("gt.newCallList.DXCC") + "</td>" +
"<td>" + $.i18n("gt.newCallList.Time") + "</td>";
if (GT.callsignLookups.lotwUseEnable == true) worker += "<td>" + $.i18n("gt.qsoPage.LoTW") + "</td>";
if (GT.callsignLookups.eqslUseEnable == true) worker += "<td>" + $.i18n("gt.qsoPage.eQSL") + "</td>";
if (GT.callsignLookups.oqrsUseEnable == true) worker += "<td>" + $.i18n("gt.qsoPage.OQRS") + "</td>";
worker += "</tr>";
}
for (var KeyIsHash in toolElement.hashes)
@ -2127,30 +2130,28 @@ function createTooltTipTable(toolElement)
ageString +
"</td>";
if (toolElement.qso == false)
if (GT.callsignLookups.lotwUseEnable == true)
{
if (GT.callsignLookups.lotwUseEnable == true)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.lotwCallsigns ? "&#10004;" : "") +
"</td>";
}
if (GT.callsignLookups.eqslUseEnable == true)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.eqslCallsigns ? "&#10004;" : "") +
"</td>";
}
if (GT.callsignLookups.oqrsUseEnable == true)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.oqrsCallsigns ? "&#10004;" : "") +
"</td>";
}
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.eqslUseEnable == true)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.oqrsUseEnable == true)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.oqrsCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
worker += "</tr>";
}
worker += "</table>";
@ -2167,12 +2168,11 @@ function createTooltTipTableLogbook(toolElement)
{
colspan += 2;
}
else
{
if (GT.callsignLookups.lotwUseEnable == true) colspan++;
if (GT.callsignLookups.eqslUseEnable == true) colspan++;
if (GT.callsignLookups.oqrsUseEnable == true) colspan++;
}
if (GT.callsignLookups.lotwUseEnable == true) colspan++;
if (GT.callsignLookups.eqslUseEnable == true) colspan++;
if (GT.callsignLookups.oqrsUseEnable == true) colspan++;
var worker =
"<table id='tooltipTable' class='darkTable' ><tr><th colspan=" +
colspan +
@ -2192,12 +2192,10 @@ function createTooltTipTableLogbook(toolElement)
"<td>" + $.i18n("gt.newCallList.DXCC") + "</td>" +
"<td>" + $.i18n("gt.newCallList.Time") + "</td>";
if (toolElement.qso == false)
{
if (GT.callsignLookups.lotwUseEnable == true) worker += "<td>" + $.i18n("gt.newCallList.LoTW") + "</td>";
if (GT.callsignLookups.eqslUseEnable == true) worker += "<td>" + $.i18n("gt.newCallList.eQSL") + "</td>";
if (GT.callsignLookups.oqrsUseEnable == true) worker += "<td>" + $.i18n("gt.newCallList.OQRS") + "</td>";
}
if (GT.callsignLookups.lotwUseEnable == true) worker += "<td>" + $.i18n("gt.newCallList.LoTW") + "</td>";
if (GT.callsignLookups.eqslUseEnable == true) worker += "<td>" + $.i18n("gt.newCallList.eQSL") + "</td>";
if (GT.callsignLookups.oqrsUseEnable == true) worker += "<td>" + $.i18n("gt.newCallList.OQRS") + "</td>";
worker += "</tr>";
var newCallList = Array();
@ -2261,39 +2259,37 @@ function createTooltTipTableLogbook(toolElement)
ageString +
"</td>";
if (toolElement.qso == false)
if (GT.callsignLookups.lotwUseEnable == true)
{
if (GT.callsignLookups.lotwUseEnable == true)
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.eqslUseEnable == true)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.oqrsUseEnable == true)
{
if (callsign.DEcall in GT.oqrsCallsigns)
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.lotwCallsigns ? "&#10004;" : "") +
"</td>";
"<td style='cursor:pointer;' align='center' " +
"onClick='window.opener.openSite(\"https://clublog.org/logsearch/logsearch.php?log=" +
callsign.DEcall + "&call=" + callsign.DXcall + "&SubmitLogSearch=Show+contacts\");'>" +
"🙋🏻‍♂️ &#128236;</td>";
}
if (GT.callsignLookups.eqslUseEnable == true)
else
{
worker +=
"<td align='center'>" +
(callsign.DEcall in GT.eqslCallsigns ? "&#10004;" : "") +
"</td>";
}
if (GT.callsignLookups.oqrsUseEnable == true)
{
if (callsign.DEcall in GT.oqrsCallsigns)
{
worker +=
"<td align='center' " +
"onClick='window.opener.openSite(\"https://clublog.org/logsearch/logsearch.php?log=" +
callsign.DEcall + "&call=" + callsign.DXcall + "&SubmitLogSearch=Show+contacts\");'>" +
"&#10004;&#128236;</td>";
}
else
{
worker +=
"<td align='center'></td>";
}
"<td align='center'></td>";
}
}
worker += "</tr>";
}
worker += "</table>";
@ -2380,7 +2376,12 @@ function openConditionsWindow()
GT.conditionsWindowHandle = new_win;
new_win.on("loaded", function ()
{
GT.conditionsWindowHandle.setMinimumSize(490, 290);
GT.conditionsWindowHandle.setMinimumSize(490, 280);
if (GT.firstRun)
{
GT.conditionsWindowHandle.resizeTo(490, 280);
GT.conditionsWindowHandle.moveTo(100, 100);
}
});
new_win.on("close", function ()
{
@ -2482,6 +2483,11 @@ function openCallRosterWindow(show = true)
{
GT.callRosterWindowHandle.setMinimumSize(390, 250);
GT.callRosterWindowHandle.setResizable(true);
if (GT.firstRun)
{
GT.callRosterWindowHandle.resizeTo(1000, 500);
GT.callRosterWindowHandle.moveTo(15, 15);
}
});
new_win.on("close", function ()
{
@ -2583,6 +2589,11 @@ function openStatsWindow(show = true)
{
GT.statsWindowHandle.setMinimumSize(620, 200);
GT.statsWindowHandle.setResizable(true);
if (GT.firstRun)
{
GT.statsWindowHandle.resizeTo(640, 480);
GT.statsWindowHandle.moveTo(50, 50);
}
});
new_win.on("close", function ()
{
@ -2638,6 +2649,11 @@ function showMessaging(show = true, cid)
{
GT.chatWindowHandle.setMinimumSize(450, 140);
GT.chatWindowHandle.setResizable(true);
if (GT.firstRun)
{
GT.chatWindowHandle.resizeTo(640, 300);
GT.chatWindowHandle.moveTo(50, 50);
}
});
GT.chatWindowHandle.on("close", function ()
{
@ -2788,48 +2804,6 @@ GT.tempGrids = Array();
function onMyKeyDown(event)
{
if (GT.MyGridIsUp == true && GT.MyCurrentGrid.length == 4)
{
var processedAlert = false;
var mediaClip = "";
var failedToAdd = GT.dirSeperator + "Balloon-deflating-1.mp3";
if (event.code == "KeyM")
{
mediaClip = GT.dirSeperator + "Clicky-1.mp3";
var valid = addAlert(GT.MyCurrentGrid, 2, 3, 2, "", "");
if (!valid)
{
mediaClip = failedToAdd;
}
processedAlert = true;
}
else if (event.code == "KeyT")
{
mediaClip = GT.dirSeperator + "Ping-coin.mp3";
var valid = addAlert(GT.MyCurrentGrid, 2, 1, 2, "", "");
if (!valid)
{
mediaClip = failedToAdd;
}
processedAlert = true;
}
else if (event.code == "KeyV")
{
mediaClip = GT.dirSeperator + "Slide-ping.mp3";
var valid = addAlert(GT.MyCurrentGrid, 2, 2, 2, "", "");
if (!valid)
{
mediaClip = failedToAdd;
}
processedAlert = true;
}
if (processedAlert == true)
{
playAlertMediaFile(mediaClip);
}
return;
}
if (event.keyCode == 27)
{
rootSettingsDiv.style.display = "none";
@ -2940,9 +2914,7 @@ function registerHotKeys()
registerHotKey("KeyE", toggleMoonTrack);
registerHotKey("KeyF", toggleSpotPaths);
registerHotKey("KeyG", toggleGtMap);
// registerHotKey("KeyH", cycleSpotView);
registerHotKey("KeyI", showRootInfoBox);
// registerHotKey("KeyJ", setTrophyOverlay, 8);
registerHotKey("KeyK", makeScreenshots);
registerHotKey("KeyL", adifLoadDialog);
registerHotKey("KeyM", toggleAlertMute);
@ -2956,7 +2928,6 @@ function registerHotKeys()
registerHotKey("KeyU", toggleMergeOverlay);
registerHotKey("KeyW", toggleGridMode);
registerHotKey("KeyX", toggleMouseTrack);
// registerHotKey("KeyY", toggleGlobalStrikes);
registerHotKey("KeyZ", setCenterQTH);
registerHotKey("Minus", toggleCRScript);
@ -6153,7 +6124,7 @@ function handleWsjtxStatus(newMessage)
}
}
if (GT.pskBandActivityTimerHandle == null) pskGetBandActivity();
if (bandChange || modeChange)
if (bandChange || modeChange || GT.startingUp)
{
removePaths();
goProcessRoster();
@ -6168,6 +6139,7 @@ function handleWsjtxStatus(newMessage)
updateChatWindow();
oamsBandActivityCheck();
GT.gtLiveStatusUpdate = true;
GT.startingUp = false;
}
GT.appSettings.myRawFreq = newMessage.Frequency;
@ -6547,10 +6519,17 @@ function finalWsjtxDecode(newMessage, isFox = false, foxMessage)
for (const i in decodeWords)
{
decodeWords[i] = decodeWords[i].replace("<", "").replace(">", "");
if (decodeWords[i].indexOf("...") != 1)
if (decodeWords[i].indexOf("...") != -1)
{
// simply ignore <...> , we don't know who they are and we aint talking to them.
return;
if (i != 0)
{
// simply ignore <...> , we don't know who they are and we aint talking to them.
return;
}
else
{
decodeWords[0] = "UNKNOWN";
}
}
}
}
@ -7455,21 +7434,21 @@ function showCallsignBox(redraw)
{
worker +=
"<td align='center'>" +
(thisCall in GT.lotwCallsigns ? "&#10004;" : "") +
(thisCall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.eqslUseEnable == true)
{
worker +=
"<td align='center'>" +
(thisCall in GT.eqslCallsigns ? "&#10004;" : "") +
(thisCall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.oqrsUseEnable == true)
{
worker +=
"<td align='center'>" +
(thisCall in GT.oqrsCallsigns ? "&#10004;" : "") +
(thisCall in GT.oqrsCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
worker += "</tr>";
@ -7969,7 +7948,16 @@ function showWorkedBox(sortIndex, nextPage, redraw)
worker += "<th><div id='qslFilterDiv'></div></th>";
worker += "<th></th>";
worker += "<th></th>";
worker += "<th colspan=2><div id='dxccFilterDiv'></div></th>";
if (GT.filterDxcc != 0)
{
worker += "<th style='border-right:none;'><div id='dxccFilterDiv'></div></th>";
worker += "<th style='border-left:none;'><img title='Show All' onclick='window.opener.GT.filterDxcc = 0; window.opener.showWorkedBox();' src='/img/trash_24x48.png' style='width: 30px; margin:0px; padding:0px; margin-bottom: -4px; cursor: pointer'/></th>";
}
else
{
worker += "<th colspan=2><div id='dxccFilterDiv'></div><th>";
}
worker += "</tr> ";
worker += "<tr><th style='cursor:pointer;' align=center onclick='window.opener.showWorkedBox(0);'>" + $.i18n("gt.qsoPage.Station") + "</th>";
worker += "<th style='cursor:pointer;' align=center onclick='window.opener.showWorkedBox(1);'>" + $.i18n("gt.qsoPage.Grid") + "</th>";
@ -7981,6 +7969,9 @@ function showWorkedBox(sortIndex, nextPage, redraw)
worker += "<th style='cursor:pointer;' align=center onclick='window.opener.showWorkedBox(3);'>" + $.i18n("gt.qsoPage.DXCC") + "</th>";
worker += "<th style='cursor:pointer;' align=center onclick='window.opener.showWorkedBox(3);'>" + $.i18n("gt.qsoPage.Flag") + "</th>";
worker += "<th style='cursor:pointer;' align=center onclick='window.opener.showWorkedBox(4);'>" + $.i18n("gt.qsoPage.When") + "</th>";
if (GT.callsignLookups.lotwUseEnable == true) worker += "<th>" + $.i18n("gt.qsoPage.LoTW") + "</th>";
if (GT.callsignLookups.eqslUseEnable == true) worker += "<th>" + $.i18n("gt.qsoPage.eQSL") + "</th>";
if (GT.callsignLookups.oqrsUseEnable == true) worker += "<th>" + $.i18n("gt.qsoPage.OQRS") + "</th>";
worker += "</tr>";
var key = null;
@ -8024,6 +8015,27 @@ function showWorkedBox(sortIndex, nextPage, redraw)
"<td style='color:lightblue'>" +
userTimeString(key.time * 1000) +
"</td>";
if (GT.callsignLookups.lotwUseEnable == true)
{
worker +=
"<td align=center>" +
(key.DEcall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.eqslUseEnable == true)
{
worker +=
"<td align=center>" +
(key.DEcall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
if (GT.callsignLookups.oqrsUseEnable == true)
{
worker +=
"<td align=center>" +
(key.DEcall in GT.oqrsCallsigns ? "🙋🏻‍♂️" : "") +
"</td>";
}
worker += "</tr>";
}
@ -8165,20 +8177,14 @@ function showWorkedBox(sortIndex, nextPage, redraw)
function statsValidateCallByElement(elementString)
{
if (
GT.statsWindowHandle != null &&
typeof GT.statsWindowHandle.window.validateCallByElement !== "undefined"
)
if (GT.statsWindowHandle != null && typeof GT.statsWindowHandle.window.validateCallByElement !== "undefined")
{
GT.statsWindowHandle.window.validateCallByElement(elementString);
}
}
function statsFocus(selection)
{
if (
GT.statsWindowHandle != null &&
typeof GT.statsWindowHandle.window.statsFocus !== "undefined"
)
if (GT.statsWindowHandle != null && typeof GT.statsWindowHandle.window.statsFocus !== "undefined")
{
GT.statsWindowHandle.window.statsFocus(selection);
}
@ -8186,10 +8192,7 @@ function statsFocus(selection)
function lookupValidateCallByElement(elementString)
{
if (
GT.lookupWindowHandle != null && GT.lookupWindowInitialized &&
typeof GT.lookupWindowHandle.window.validateCallByElement !== "undefined"
)
if (GT.lookupWindowHandle != null && GT.lookupWindowInitialized && typeof GT.lookupWindowHandle.window.validateCallByElement !== "undefined")
{
GT.lookupWindowHandle.window.validateCallByElement(elementString);
}
@ -8197,10 +8200,7 @@ function lookupValidateCallByElement(elementString)
function lookupFocus(selection)
{
if (
GT.lookupWindowHandle != null && GT.lookupWindowInitialized &&
typeof GT.lookupWindowHandle.window.statsFocus !== "undefined"
)
if (GT.lookupWindowHandle != null && GT.lookupWindowInitialized && typeof GT.lookupWindowHandle.window.statsFocus !== "undefined")
{
GT.lookupWindowHandle.window.statsFocus(selection);
}
@ -8208,10 +8208,7 @@ function lookupFocus(selection)
function statsAppendChild(elementString, object, onInputString, defaultValue)
{
if (
GT.statsWindowHandle != null &&
typeof GT.statsWindowHandle.window.appendToChild !== "undefined"
)
if (GT.statsWindowHandle != null && typeof GT.statsWindowHandle.window.appendToChild !== "undefined")
{
GT.statsWindowHandle.window.appendToChild(
elementString,
@ -8682,6 +8679,11 @@ function openBaWindow(show = true)
new_win.on("loaded", function ()
{
GT.baWindowHandle.setMinimumSize(198, 52);
if (GT.firstRun)
{
GT.baWindowHandle.resizeTo(198, 52);
GT.baWindowHandle.moveTo(250, 250);
}
});
new_win.on("close", function ()
{
@ -8794,6 +8796,11 @@ function openLookupWindow(show = false)
{
GT.lookupWindowHandle.setMinimumSize(680, 200);
GT.lookupWindowHandle.setResizable(true);
if (GT.firstRun)
{
GT.lookupWindowHandle.resizeTo(680, 200);
GT.lookupWindowHandle.moveTo(75, 75);
}
});
new_win.on("close", function ()
{
@ -9377,8 +9384,7 @@ function renderStatsBox()
for (var band in stats[i][key].confirmed_bands)
{
output[i].confirmed_bands[band] =
~~output[i].confirmed_bands[band] + 1;
output[i].confirmed_bands[band] = ~~output[i].confirmed_bands[band] + 1;
}
for (var mode in stats[i][key].worked_modes)
@ -9388,8 +9394,7 @@ function renderStatsBox()
for (var mode in stats[i][key].confirmed_modes)
{
output[i].confirmed_modes[mode] =
~~output[i].confirmed_modes[mode] + 1;
output[i].confirmed_modes[mode] = ~~output[i].confirmed_modes[mode] + 1;
}
for (var type in stats[i][key].worked_types)
@ -9399,8 +9404,7 @@ function renderStatsBox()
for (var type in stats[i][key].confirmed_types)
{
output[i].confirmed_types[type] =
~~output[i].confirmed_types[type] + 1;
output[i].confirmed_types[type] = ~~output[i].confirmed_types[type] + 1;
}
}
@ -11505,16 +11509,6 @@ function workingDateChanged()
var fields = workingDateValue.value.split("-");
var time = workingTimeValue.value.split(":");
var date = new Date(
Date.UTC(
parseInt(fields[0]),
parseInt(fields[1]) - 1,
parseInt(fields[2]),
parseInt(time[0]),
parseInt(time[1]),
0
)
);
GT.appSettings.workingDate =
Date.UTC(
parseInt(fields[0]),
@ -11748,7 +11742,8 @@ function loadMaidenHeadData()
{
GT.dxccToAltName[GT.dxccInfo[key].dxcc] = GT.dxccInfo[key].name;
GT.dxccToADIFName[GT.dxccInfo[key].dxcc] = GT.dxccInfo[key].aname;
GT.altNameToDXCC[GT.dxccInfo[key].name] = GT.dxccInfo[key].dxcc;
for (var x = 0; x < GT.dxccInfo[key].prefix.length; x++)
{
GT.prefixToMap[GT.dxccInfo[key].prefix[x]] = key;
@ -12777,7 +12772,7 @@ function initSpeech()
{
window.speechSynthesis.onvoiceschanged = function ()
{
nodeTimers.setTimeout(timedGetVoices, 500);
nodeTimers.setTimeout(timedGetVoices, 3000);
};
var msg = new SpeechSynthesisUtterance("\n");
msg.lang = GT.localeString;
@ -14970,19 +14965,19 @@ function displayLookupObject(lookup, gridPass, fromCache = false)
if (GT.callsignLookups.lotwUseEnable == true && thisCall in GT.lotwCallsigns)
{
lookup.ulotw =
"&#10004; (" +
"🙋🏻‍♂️ (" +
userDayString(GT.lotwCallsigns[thisCall] * 86400 * 1000) +
")";
worker += makeRow("LoTW Member", lookup, "ulotw");
}
if (GT.callsignLookups.eqslUseEnable == true && thisCall in GT.eqslCallsigns)
{
lookup.ueqsl = "&#10004;";
lookup.ueqsl = "🙋🏻‍♂️";
worker += makeRow("eQSL Member", lookup, "ueqsl");
}
if (GT.callsignLookups.oqrsUseEnable == true && thisCall in GT.oqrsCallsigns)
{
lookup.uoqrs = "&#10004;";
lookup.uoqrs = "🙋🏻‍♂️";
worker += makeRow("ClubLog OQRS", lookup, "uoqrs");
}

Wyświetl plik

@ -47,20 +47,38 @@ GT.potaUnknownPark = {
grid: ""
};
GT.gtParkIconActive = new ol.style.Icon({
src: "./img/pota_icon_active.png",
anchorYUnits: "pixels",
anchorXUnits: "pixels",
anchor: [10, 19]
GT.gtParkOnInstance = new ol.style.Text({
text: "🏕️",
font: "20px Verdana",
textAlign: "center",
justify: "center"
});
GT.gtParkIconInactive = new ol.style.Icon({
src: "./img/pota_icon_inactive.png",
anchorYUnits: "pixels",
anchorXUnits: "pixels",
anchor: [10, 19]
GT.gtParkOffInstance = new ol.style.Text({
text: "🌲",
font: "20px Verdana",
textAlign: "center",
justify: "center"
});
function iconText(center, iconObj, zIndex, propName)
{
var feature = new ol.Feature({
geometry: new ol.geom.Point(center),
textAlign: "center",
justify: "center",
prop: propName
});
var iconStyle = new ol.style.Style({
zIndex: zIndex,
text: iconObj
});
feature.setStyle(iconStyle);
return feature;
}
function initPota()
{
potaEnabled.checked = (GT.appSettings.potaEnabled == 1);
@ -139,7 +157,18 @@ function makeParkFeatures()
var report = GT.pota.parkSpots[park][call];
if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode) && Date.now() < report.expire)
{
parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), GT.gtParkIconActive, 1, "parkFlag");
let parkIcon = GT.gtParkOffInstance;
let zIndex = 1;
for (let instance in GT.instances)
{
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
{
parkIcon = GT.gtParkOnInstance;
zIndex = 2;
break;
}
}
parkObj.feature = iconText(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), parkIcon, zIndex, "parkFlag");
parkObj.feature.key = park;
parkObj.feature.size = 22;
@ -179,7 +208,6 @@ function potaSpotFromDecode(callObj)
if (!(hash in GT.pota.rbnReportTimes) || Date.now() > GT.pota.rbnReportTimes[hash])
{
GT.pota.rbnReportTimes[hash] = Date.now() + GT.pota.rbnFrequency;
// reportPotaRBN(GT.pota.parkSpots[park][callObj.DEcall]);
}
}
else if (callObj.DEcall in GT.pota.callSchedule)
@ -205,7 +233,6 @@ function potaSpotFromDecode(callObj)
if (!(hash in GT.pota.rbnReportTimes) || Date.now() > GT.pota.rbnReportTimes[hash])
{
GT.pota.rbnReportTimes[hash] = Date.now() + GT.pota.rbnFrequency;
// reportPotaRBN(GT.pota.parkSpots[park][callObj.DEcall]);
}
}
else
@ -245,39 +272,6 @@ function leftClickPota(parkId)
}
}
/* function reportPotaRBN(callSpot)
{
if (Date.now() < callSpot.expire)
{
var report = {
activator: callSpot.activator,
spotter: GT.appSettings.myCall + "-#",
frequency: String(parseInt(callSpot.frequency * 1000)),
reference: callSpot.reference,
mode: callSpot.mode,
source: "RBN",
comments: callSpot.comments,
activatorGrid: callSpot.activatorGrid,
spotterGrid: callSpot.spotterGrid
};
if (Number(report.frequency) > 0)
{
getPostJSONBuffer(
"https://api.pota.app/spot",
rbnReportResult,
null,
"https",
443,
report,
10000,
null,
null
);
}
}
} */
function reportPotaQSO(record)
{
var report = {
@ -357,7 +351,18 @@ function addParkSpotFeature(park, report)
if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode))
{
parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), GT.gtParkIconActive, 1, "parkFlag");
let parkIcon = GT.gtParkOffInstance;
let zIndex = 1;
for (let instance in GT.instances)
{
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
{
parkIcon = GT.gtParkOnInstance;
zIndex = 2;
break;
}
}
parkObj.feature = iconText(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), parkIcon, zIndex, "parkFlag");
parkObj.feature.key = park;
parkObj.feature.size = 22;
GT.layerSources.pota.addFeature(parkObj.feature);

Plik diff jest za duży Load Diff

Wyświetl plik

@ -29,31 +29,6 @@ function prepareRosterSettings()
window.opener.GT.appSettings.gtShareEnable == true &&
window.opener.GT.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
// all three at the same time?
// this section is for LoTW users, can be a function
if (window.opener.GT.callsignLookups.lotwUseEnable == true)
{
usesLoTWDiv.style.display = "";
if (CR.rosterSettings.usesLoTW == true)
{
maxLoTW.style.display = "";
maxLoTWView.style.display = "";
}
else
{
maxLoTW.style.display = "none";
maxLoTWView.style.display = "none";
}
}
else
{
usesLoTWDiv.style.display = "none";
maxLoTW.style.display = "none";
maxLoTWView.style.display = "none";
}
if (CR.rosterSettings.huntNeed == "mixed")
{
rosterSettings.huntIndex = CR.confirmed;

Wyświetl plik

@ -53,11 +53,6 @@ function processRosterFiltering(callRoster, rosterSettings)
entry.tx = false;
continue;
}
if (CR.rosterSettings.noUnknownDXCC && callObj.dxcc == -1)
{
entry.tx = false;
continue;
}
if (window.opener.GT.instances[callObj.instance].crEnable == false)
{
entry.tx = false;
@ -68,7 +63,7 @@ function processRosterFiltering(callRoster, rosterSettings)
entry.tx = false;
continue;
}
if (entry.DXcall + " from All" in CR.blockedCQ || entry.DXcall + " from " + window.opener.GT.dxccToAltName[callObj.dxcc] in CR.blockedCQ)
if (entry.DXcall in CR.ignoredCQ || entry.DXcall + ":" + callObj.dxcc in CR.ignoredCQ)
{
entry.tx = false;
continue;
@ -104,19 +99,6 @@ function processRosterFiltering(callRoster, rosterSettings)
continue;
}
}
if (CR.rosterSettings.useRegex && CR.rosterSettings.callsignRegex.length > 0)
{
var regexObj = regexObj || new RegExp(CR.rosterSettings.callsignRegex, "i")
try
{
if (!call.match(regexObj))
{
entry.tx = false;
continue;
}
}
catch (e) {}
}
if (CR.rosterSettings.requireGrid == true && callObj.grid.length != 4)
{
entry.tx = false;
@ -143,31 +125,6 @@ function processRosterFiltering(callRoster, rosterSettings)
continue;
}
if (CR.rosterSettings.noMsg == true)
{
try
{
if (callObj.msg.match(CR.rosterSettings.noMsgValue))
{
entry.tx = false;
continue;
}
}
catch (e) {}
}
if (CR.rosterSettings.onlyMsg == true)
{
try
{
if (!callObj.msg.match(CR.rosterSettings.onlyMsgValue))
{
entry.tx = false;
continue;
}
}
catch (e) {}
}
if (callObj.dxcc == window.opener.GT.myDXCC)
{
if (CR.rosterSettings.noMyDxcc == true)

Wyświetl plik

@ -3,7 +3,6 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
// these lets, do they rely on anything between the top and here?
// if not could they be put in the let list at the beginning?
let hasGtPin = false;
let inversionAlpha = "DD";
let row = "#000000";
let bold = "#000000;font-weight: bold;";
@ -18,6 +17,29 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
const potaEnabled = (window.opener.GT.appSettings.potaEnabled == 1);
// TODO: Hunting results might be used to filter, based on the "Callsigns: Only Wanted" option,
// so maybe we can move this loop first, and add a check to the filtering loop?
// award tracker overrides
let awardTrackerOverrides = {
call: false,
grids: false,
dxcc: false,
states: false,
cnty: false,
cqz: false,
px: false,
cont: false
};
if (CR.rosterSettings.reference == LOGBOOK_AWARD_TRACKER)
{
for (let key in awardTracker)
{
if (awardTracker[key].enable)
{
awardTrackerOverrides[awardTracker[key].rule.type] = true;
}
}
}
// Second loop, hunting and highlighting
for (const callHash in callRoster)
@ -63,10 +85,12 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
let callsign = entry.DEcall;
callObj.hunting = {}
callObj.callFlags = {}
callObj.style = callObj.style || {}
callObj.DEcallHTML = callObj.DEcall
callObj.hunting = {};
callObj.callFlags = {};
callObj.style = callObj.style || {};
callObj.DEcallHTML = null;
callObj.DXcallHTML = null;
callObj.msgHTML = null;
let colorObject = Object();
@ -95,11 +119,8 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
"";
let cntyPointer = (callObj.cnty && callObj.qual == false) ? "cursor: pointer;" : "";
let didWork = false;
let hash = callsign + workHashSuffix;
let layeredHash = layeredHashSuffix && (callsign + layeredHashSuffix)
// Call worked in current logbook settings, regardless of hunting mode
if (hash in CR.worked.call)
@ -170,28 +191,6 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
}
}
// award tracker overrides
let awardTrackerOverrides = {
call: false,
grids: false,
dxcc: false,
states: false,
cnty: false,
cqz: false,
px: false,
cont: false
};
if (CR.rosterSettings.reference == LOGBOOK_AWARD_TRACKER)
{
for (let key in awardTracker)
{
if (awardTracker[key].enable)
{
awardTrackerOverrides[awardTracker[key].rule.type] = true;
}
}
}
// Hunting for callsigns
if (huntCallsign.checked || awardTrackerOverrides.call)
{
@ -251,25 +250,9 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
}
}
if (huntRegex.checked == true && CR.rosterSettings.huntRegexValue.length > 0)
if (huntWatcher.checked)
{
var huntRegexObj = huntRegexObj || new RegExp(CR.rosterSettings.huntRegexValue, "gi")
try
{
if (callsign.match(huntRegexObj))
{
shouldAlert = true;
callObj.reason.push("regex");
callObj.hunting.regex = "hunted";
callObj.DEcallHTML = callsign.replace(huntRegexObj, (x, y) => `<span class='regexMatch'>${x}</span>`)
if (!callObj.hunting.call && !callObj.callFlags.worked)
{
callBg = `${call}${inversionAlpha};`;
call = bold;
}
}
}
catch (e) {}
shouldAlert = processWatchers(callObj);
}
// Hunting for "stations calling you"
@ -339,7 +322,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
}
// Hunting for DXCC
if (huntDXCC.checked || awardTrackerOverrides.dxcc)
if (huntDXCC.checked || awardTrackerOverrides.dxcc || awardTrackerOverrides.dxcc2band)
{
let hash = String(callObj.dxcc) + "|" + workHashSuffix;
let layeredHash = rosterSettings.layeredMode && (String(callObj.dxcc) + "|" + layeredHashSuffix)
@ -469,11 +452,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
if ((huntCounty.checked || awardTrackerOverrides.cnty) && window.opener.GT.callsignLookups.ulsUseEnable == true)
{
let finalDxcc = callObj.dxcc;
if (
callObj.cnty &&
(finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) &&
callObj.cnty.length > 0
)
if (callObj.cnty && (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) && callObj.cnty.length > 0)
{
let hash = callObj.cnty + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
@ -790,11 +769,25 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
}
}
let huzzah = "";
// Uncomment to test
// callObj.DXcall = "CQ GT";
if (CR.rosterSettings.animateCQGT == true && callObj.CQ == true && (callObj.DXcall == "CQ GT" || callObj.DXcall == "GridTracker"))
{
huzzah = "class='huzzah' ";
callObj.DXcall = "GridTracker";
calling = "white";
}
else if (CR.rosterSettings.animateCQGT == false && callObj.DXcall == "GridTracker")
{
callObj.DXcall = "CQ GT";
}
// Assemble all styles
colorObject.call = "style='" + callConf + "background-color:" + callBg + ";color:" +
call + ";" + callPointer + "'";
colorObject.grid = "style='" + gridConf + "background-color:" + gridBg + ";color:" + grid + ";cursor:pointer'";
colorObject.calling = "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'";
colorObject.calling = huzzah + "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'";
colorObject.dxcc = "style='" + dxccConf + "background-color:" + dxccBg + ";color:" + dxcc + "'";
colorObject.state = "style='" + stateConf + "background-color:" + stateBg + ";color:" + state + "'";
colorObject.cnty = "style='" + cntyConf + "background-color:" + cntyBg + ";color:" + cnty + ";" + cntyPointer + "'";
@ -818,3 +811,76 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
}
}
}
function buildWatcher(watcher)
{
if (watcher.regex)
{
watcher.test = new RegExp(watcher.text, "gi");
}
else
{
watcher.test = new RegExp("^" + watcher.text + "$", "gi");
}
if (watcher.type == "Callsign")
{
watcher.source = "DEcall";
watcher.html = "DEcallHTML";
}
else if (watcher.type == "Calling")
{
watcher.source = "DXcall";
watcher.html = "DXcallHTML";
}
else
{
watcher.source = "msg";
watcher.html = "msgHTML";
}
return watcher.test;
}
function processWatchers(callObj)
{
let now = Date.now();
for (let key in CR.watchers)
{
let watcher = CR.watchers[key];
if (watcher.watch)
{
if (watcher.start && now < watcher.startTime) continue;
if (watcher.end && now > watcher.endTime)
{
if (watcher.autoDelete)
{
// Don't call deleteWatcher() as it calls the roster renderer
delete CR.watchers[key];
writeRosterSettings();
wantRenderWatchersTab();
}
else
{
watcher.watch = false;
wantRenderWatchersTab();
}
continue;
}
watcher.test = watcher.test || buildWatcher(watcher);
try
{
if (callObj[watcher.source].match(watcher.test))
{
callObj.reason.push("watcher");
callObj.hunting.watcher = "hunted";
callObj.watcherKey = key;
let htmlPrevent = htmlEntities(callObj[watcher.source]);
callObj[watcher.html] = htmlPrevent.replace(watcher.test, (x, y) => `<span class='regexMatch'>${x}</span>`);
return true;
}
}
catch (e) {}
}
}
return false;
}

Wyświetl plik

@ -19,7 +19,7 @@ function renderCompactRosterRow(callObj, showBand)
let wholeClick = (CR.isCompactCounty ? "" : onClick);
let callsignClick = (CR.isCompactCounty ? onClick : "");
let worker = "<div class='compact' " + wholeClick + " >";
worker += "<div class='compactCallsign' " + callsignClick + " name='Callsign' " + callObj.style.call + " >" + formatCallsign(callObj.DEcall) + bandView + "</div>";
worker += "<div class='compactCallsign' " + callsignClick + " name='Callsign' " + callObj.style.call + " >" + formatCallsign(callObj.DEcallHTML || callObj.DEcall) + bandView + "</div>";
worker += "<div class='compactData'>";
worker += renderEntryForColumn(CR.rosterSettings.compactEntity, callObj, "div");
worker += "</div></div>";

Wyświetl plik

@ -26,11 +26,12 @@ function renderRoster(callRoster, rosterSettings)
if (window.opener.GT.callsignLookups.lotwUseEnable == true)
{
// Do nothing
usesLoTWDiv.style.display = "";
}
else
{
columnOverrides.LoTW = false;
usesLoTWDiv.style.display = "none";
}
if (rosterSettings.canMsg == true)
@ -53,10 +54,6 @@ function renderRoster(callRoster, rosterSettings)
columnOverrides.POTA = false;
}
if (rosterSettings.isAwardTracker)
{
columnOverrides.Wanted = true;
}
// dealing with spots
if (CR.rosterSettings.columns.Spot == true) onlySpotDiv.style.display = "";
else onlySpotDiv.style.display = "none";

Wyświetl plik

@ -131,7 +131,7 @@ function changeRosterColumnOrder(columns)
function moveColumnLeft(column)
{
const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true, Grid: true });
const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true });
const pos = columns.indexOf(column);
if (pos > 1)
{
@ -140,3 +140,29 @@ function moveColumnLeft(column)
}
changeRosterColumnOrder(columns);
}
function moveColumnRight(column)
{
const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true });
const pos = columns.indexOf(column);
if (pos > 0 && pos + 1 < Object.keys(columns).length)
{
columns[pos] = columns[pos + 1];
columns[pos + 1] = column;
}
changeRosterColumnOrder(columns);
}
function toggleColumn(target, column = null)
{
let label = column || target.label;
CR.rosterSettings.columns[label] = target.checked;
CR.columnMembers[label].checked = target.checked;
if (label == "Spot")
{
window.opener.setRosterSpot(CR.rosterSettings.columns.Spot);
}
writeRosterSettings();
viewRoster();
resize();
}

Wyświetl plik

@ -111,13 +111,16 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
rawAttrs: callObj.style.calling,
name: callObj.CQ ? "CQ" : "Calling",
html: (CR.rosterSettings.wantRRCQ && callObj.RR73) ? "RR73" : formatCallsign(callObj.DXcall)
html: (CR.rosterSettings.wantRRCQ && callObj.RR73) ? "RR73" : formatCallsign(callObj.DXcallHTML || callObj.DXcall)
})
},
Msg: {
compare: callObjLocaleComparer("DXcall"),
tableData: (callObj) => ({ html: callObj.msg })
tableData: (callObj) => ({
name: "Msg",
html: callObj.msgHTML || htmlEntities(callObj.msg)
})
},
DXCC: {
@ -272,7 +275,7 @@ const ROSTER_COLUMNS = {
title: `${$.i18n("rosterColumns.LoTW.LastUpdate")}${
window.opener.userDayString(window.opener.GT.lotwCallsigns[callObj.DEcall] * 86400000)
}`,
html: "&#10004;"
html: "🙋🏻‍♂️"
}
}
}
@ -284,7 +287,7 @@ const ROSTER_COLUMNS = {
title: `${$.i18n("rosterColumns.LoTW.LastUpdate")}${
window.opener.userDayString(window.opener.GT.lotwCallsigns[callObj.DEcall] * 86400000)
}`,
html: "&#10004;"
html: "🙋🏻‍♂️"
}
}
}
@ -302,7 +305,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
style: "color: #0F0;",
align: "center",
html: (callObj.DEcall in window.opener.GT.eqslCallsigns ? "&#10004;" : "&nbsp;")
html: (callObj.DEcall in window.opener.GT.eqslCallsigns ? "🙋🏻‍♂️" : "&nbsp;")
})
},
@ -311,7 +314,7 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
style: "color: #0F0;",
align: "center",
html: (callObj.DEcall in window.opener.GT.oqrsCallsigns ? "&#10004;" : "&nbsp;")
html: (callObj.DEcall in window.opener.GT.oqrsCallsigns ? "🙋🏻‍♂️" : "&nbsp;")
})
},
@ -449,7 +452,7 @@ function potaColumnHover(callObj)
return value;
}
WANTED_ORDER = ["call", "qrz", "regex", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "pota", "grid", "cnty", "wpx", "oams"];
WANTED_ORDER = ["call", "qrz", "watcher", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "pota", "grid", "cnty", "wpx", "oams"];
WANTED_LABELS = {};
function wantedColumnParts(callObj, options)
@ -472,7 +475,7 @@ function wantedColumnParts(callObj, options)
// else if (wanted == "caller") { parts.push("Called"); }
else if (wanted == "hunted" && field == "qrz") { parts.push("Caller"); }
else if (wanted == "hunted" && field == "oams") { parts.push("OAMS User"); }
else if (wanted == "hunted" && field == "regex") { parts.push("Regex match"); }
else if (wanted == "hunted" && field == "watcher") { parts.push(callObj.watcherKey); }
else if (wanted == "hunted") { parts.push(`${options.html ? "<b>" : ""}New ${WANTED_LABELS[field]}${options.html ? "<b>" : ""}`); }
else if (wanted == "worked") { parts.push(`Worked ${WANTED_LABELS[field]}`); }
else if (wanted == "mixed") { parts.push(`${callObj.band} ${WANTED_LABELS[field]}`); }

Wyświetl plik

@ -683,12 +683,8 @@ a {
text-align: center;
width: auto;
border-top: 1px solid green;
vertical-align: top;
white-space: normal;
/* animation: fadeEffect .3s; Fading effect takes 1 second */
}
/* Style the tab content */

Wyświetl plik

@ -6,11 +6,16 @@ td {
white-space: nowrap;
font-family: Sans-Serif;
text-align: auto;
vertical-align: baseline;
padding: 0px;
margin: 0px;
top: 0;
}
th {
vertical-align: bottom;
}
table,
th,
td,
@ -21,24 +26,20 @@ select,
th,
td {
padding-bottom: 2px;
padding-bottom: 1px;
padding-right: 1px;
margin-right: 2px;
padding-left: 2px;
}
input[type="checkbox"] {
appearance: checkbox !important;
margin: 0;
margin-top: -1px;
margin-right: 1px;
vertical-align: middle;
vertical-align: top;
position: relative;
top: 0px;
}
/* input[type="checkbox"]:checked {
appearance: checkbox !important;
} */
}
select {
appearance: none;
@ -136,36 +137,42 @@ body.roster {
min-height: 28px;
margin-top: 4px;
display: flex;
flex-direction: column;
flex-direction: row;
align-items: stretch;
justify-content: flex-start;
}
#RosterControls.normal #MainRosterControls {
margin-left: 180px;
margin-right: 100px;
margin-left: 1px;
margin-top: 3px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-evenly;
}
#TransmitControls {
position: absolute;
top: 3px;
left: 6px;
width: 180px;
left: 3px;
width: 246px;
display: flex;
flex-direction: row;
justify-content: center;
}
#MoreLessControls {
#LessControls {
position: absolute;
top: 7px;
left: 50%;
text-align: center;
}
#MoreControls {
position: absolute;
top: 5px;
right: 6px;
text-align: right;
}
#RosterControls.normal #ShowFewerControlsLink {
display: none;
}
@ -174,10 +181,11 @@ body.roster {
}
#RosterControls.normal #MainRosterControls {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-evenly;
position: absolute;
top: 3px;
left: 250px;
text-align: left;
justify-content: left;
}
#RosterControls.extended {
@ -190,7 +198,7 @@ body.roster {
#RosterControls.extended #MainRosterControls {
margin-top: 30px;
min-width: 210px;
min-width: 250px;
flex: 0;
}
@ -232,13 +240,13 @@ body.roster {
max-height: 142px;
}
@media (max-width: 1050px) {
@media (max-width: 1000px) {
#RosterControls.normal #HuntModeControls {
display: none !important;
}
}
@media (max-width: 735px) {
@media (max-width: 800px) {
#RosterControls.normal #CallsignsControls {
display: none;
}
@ -274,7 +282,7 @@ body.roster {
flex-direction: row;
align-items: flex-start;
justify-content: flex-start;
margin-right: 8px;
margin-right: 1px;
margin-bottom: 4px;
}
@ -305,16 +313,16 @@ body.roster {
.secondaryControlGroup {
flex: 1;
margin-left: 8px;
margin-left: 4px;
padding: 0px;
}
#huntingMatrixDiv {
flex: 0.75;
flex: .9;
}
#exceptionDiv {
flex: 1.25;
flex: .25;
}
.secondaryControlGroup h3 {
@ -328,51 +336,57 @@ body.roster {
#huntingMatrixDiv h3 {
color: #099;
border-bottom: 2px solid #066;
margin-bottom: 2px;
margin-bottom: 3px;
}
#exceptionDiv h3 {
color: #944;
border-bottom: 2px solid #622;
margin-bottom: 2px;
color: rgb(206, 89, 89);
border-bottom: 2px solid rgba(253, 113, 113, 0.644);
margin-bottom: 3px;
}
.secondaryControlGroup .columns {
/* column-count: 2; */
max-height: 135px;
max-height: 100px;
display: flex;
flex-direction: column;
flex-wrap: wrap;
justify-content: flex-start;
align-items: stretch;
align-items: normal;
}
@media (min-width: 1100px) {
.secondaryControlGroup .columns {
max-height: 80px;
}
}
.secondaryControlGroup .columns > div {
.secondaryControlGroup .columns div {
text-align: left;
margin-bottom: 2px;
vertical-align: bottom;
margin-top: 3px;
margin-right: 0px;
}
.secondaryControlGroup input.slider {
input.slider {
display: inline-block;
width: 75px;
width: max-content;
}
.secondaryControlGroup input.inputTextValue {
.inputTextValue {
border-radius: 6px;
border: 1px solid #999;
background-color: green;
color: yellow;
outline: none;
margin: 0px;
padding: 2px;
border-style: inset;
}
.secondaryControlGroup .roundBorderValue {
padding: 2px;
.inputTextValue:hover {
border-color: #fff;
border-style: outset;
}
.roundBorderValue {
padding: 3px;
font-size: larger;
}
#instancesWrapper .button {
display: inline-block;
@ -390,11 +404,12 @@ body.roster {
#txrxdec {
padding-left: 5px;
padding-right: 5px;
width: 68px;
}
.link {
cursor: hand;
color: #ffffaa;
color: #ffffaaa1;
}
.link:hover {
@ -419,13 +434,13 @@ table.awardTableCSS th {
border-left: none;
border-right: none;
font-size: 12px;
vertical-align: baseline;
}
table.awardTableCSS tr {
padding: 0px;
margin: 0px;
max-height: 16px;
bottom: 0;
}
table.awardTableCSS thead {
@ -487,7 +502,8 @@ table.rosterTable thead th:first-child {
}
.regexMatch {
text-decoration: underline;
background-color: #ffffff;
color: #000;
}
.dxCaller {
@ -569,3 +585,235 @@ table.rosterTable thead th:first-child {
text-overflow: ellipsis;
white-space: nowrap;
}
/* Style the tab */
.infotab {
overflow: hidden;
background-color: black;
}
/* Style the buttons that are used to open the tab content */
.infotab button {
border: 1px solid lightblue;
padding: 3px;
font-weight: bold;
border-top-right-radius: 6px;
border-top-left-radius: 6px;
margin-left: 5px;
margin-right: 0px;
color: #eee;
background: black;
text-align: center;
cursor: pointer;
white-space: nowrap;
border-bottom-style: none;
transition: 0.1s;
}
/* Create an active/current tablink class */
.infotab button.active {
background-color: cyan;
color: black;
}
/* Style the tab content */
.infoTabcontent {
margin: auto;
display: none;
background-color: black;
padding: 0;
padding-top: 4px;
text-align: center;
width: auto;
left:0;
right:0;
border-top: 1px solid lightblue;
vertical-align: top;
white-space: normal;
overflow:auto;
min-width: 480px;
}
.exceptionTab {
display: grid;
grid-template-columns: repeat(auto-fill,minmax(150px, 1fr));
justify-content:center;
align-items:center;
}
.exceptionTab > div {
margin: 6px;
padding: 5px;
height: 35px;
width: 140px;
border-width: 1px;
border-color: #aaa;
border-style: inset;
vertical-align:baseline;
border-radius: 4px;
transition: border-color;
}
p {
margin-top: 4px;
margin-bottom: 1px;
margin-left: 1px;
margin-right: 1px;
}
.exceptionTab > div:hover {
border-color: #fff;
}
.break {
flex-basis: 100%;
}
:root {
accent-color: #4ab9f8;
color-scheme: dark;
}
.columnEditView {
margin:5px;
padding:5px;
vertical-align:top;
display:inline-block;
overflow:auto;
overflow-x:hidden;
height: fit-content;
}
.columnEditRow {
display:grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
margin-top:2px;
margin-bottom: 5px;
}
.columnEditRowHeader {
border: 1px solid #cecccc;
grid-row: 1 / span 4;
font-weight: bold;
margin-bottom: 5px;
}
.columnEditRow:hover {
box-shadow: inset 0px 11px 6px -8px #888, inset 0px -11px 6px -8px #888;
}
.columnAvailableRow {
display:grid;
grid-template-columns: 1fr 3fr;
margin-top:2px;
margin-bottom: 5px;
}
.columnAvailableRow:hover {
box-shadow: inset 0px 11px 6px -8px #888, inset 0px -11px 6px -8px #888;
}
.huzzah {
background: linear-gradient(135deg, #360000, #00580f, rgb(11, 0, 80));
background-size: 500% 500%;
animation: AnimationHuzzah 5s alternate infinite;
text-shadow: black 0 0 6px;
}
@keyframes AnimationHuzzah {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.rowBuilder {
border-width: 1px;
border-color: #aaa;
border-style: outset;
vertical-align: top;
border-radius: 4px;
display: flex;
flex-direction: row;
transition: border-color;
text-align: center;
vertical-align:middle;
justify-content:center;
align-items:center;
width: fit-content;
left:0;
right:0;
margin: auto;
padding: 4px;
}
.rowBuilder:hover {
border-color: #fff;
}
.rowBuilder > * {
margin-right: 4px;
padding: 2px;
}
.flexButton {
border-radius: 4px;
cursor: pointer;
border-width: 1px;
border-color: #999;
border-style: outset;
color: #eee;
transition: border-style;
vertical-align: middle;
padding: 2px;
padding-bottom: 1px;
text-align: center;
width: fit-content;
}
.flexButton:hover {
border-color: #fff;
}
.ignoresTables {
margin:10px;
padding:0px;
vertical-align:top;
display:inline-block;
margin-right:2px;
overflow:auto;
overflow-x:hidden;
}
#watcherTable {
margin: auto;
left:0;
right:0;
width:fit-content;
padding:0px;
vertical-align:top;
display:inline-block;
margin-top:2px;
overflow:auto;
overflow-x:hidden;
}
#settingsDiv {
padding: 3px;
overflow: hidden;
margin: auto;
top: 3px;
left:0;
right:0;
width: fit-content;
display:none;
padding: 1px;
text-align: center;
vertical-align: middle;
position: absolute;
z-index: 600;
border: 1px solid lightblue;
}

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "GridTracker",
"product_string_do_not_use": "gridtracker",
"version": "1.23.1112",
"version": "1.23.1202",
"betaVersion": "",
"description": "GridTracker: An Amateur Radio Companion",
"author": "GridTracker.org",
@ -12,7 +12,7 @@
"icon": "gridview.png",
"toolbar": false,
"show": false,
"width": 800,
"width": 860,
"height": 652
},
"webkit": {