Merge branch 'jan-2024' into 'master'

Processing indicator for QSOs

See merge request gridtracker.org/gridtracker!306

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
fix-state-keys-shapesjson v1.23.1217
T Loomis 2023-12-18 17:47:17 +00:00
commit 15132c5243
22 zmienionych plików z 502 dodań i 193 usunięć

9
debian/changelog vendored
Wyświetl plik

@ -1,3 +1,12 @@
gridtracker (1.23.1217) unstable; urgency=low
- BIGCTY - Update from December 15th
- System - Add QSO processing indicator
- System - QSL location authority selector added in Settings > Logbook
- Logbook Viewer - QSL sources added
- Call Roster - Added Grid to Watcher and Ignores
- Language - Updates to Chinese simplified and traditional translations
- Logging - DX Keeper grid bug workaround
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 17 Dec 2023 00:00:00 -0000
gridtracker (1.23.1207) unstable; urgency=high
- BIGCTY - Update from December 5th
- System - LoTW, eQSL and OQRS membership columns icon updated

Wyświetl plik

@ -1,6 +1,6 @@
Name: {{{ git_name name=gridtracker }}}
Summary: GridTracker: An Amateur Radio Companion
Version: 1.23.1207
Version: 1.23.1217
Release: 1%{?dist}
BuildArch: noarch
Source0: {{{ git_dir_pack }}}
@ -40,6 +40,14 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
%license %{_docdir}/%{name}/
%changelog
* Sun Dec 17 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1217-1
- BIGCTY - Update from December 15th
- System - Add QSO processing indicator
- System - QSL location authority selector added in Settings > Logbook
- Logbook Viewer - QSL sources added
- Call Roster - Added Grid to Watcher and Ignores
- Language - Updates to Chinese simplified and traditional translations
- Logging - DX Keeper grid bug workaround
* Thu Dec 07 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1207-1
- BIGCTY - Update from December 5th
- System - LoTW, eQSL and OQRS membership columns icon updated

Wyświetl plik

@ -334,7 +334,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
align="right">
QSO
</td>
<td style="cursor: pointer" class="roundBorderValue"
<td style="cursor: pointer" class="roundBorderValue" id="qsoCountStyle"
onclick="resetSearch(); openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox);" title="Worked Stations"
align="center">
<div id="qsoCount">0</div>
@ -350,12 +350,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="countryCount">0</div>
</td>
<td data-i18n="quickStats.QSL.label" style="cursor: pointer"
onclick="resetSearch(); GT.filterQSL = 'true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
onclick="resetSearch(); GT.filterQSL='true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
title="Show Confirmed List" align="right">
QSL
</td>
<td style="cursor: pointer" class="roundBorderValue"
onclick="resetSearch(); GT.filterQSL = 'true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
<td style="cursor: pointer" class="roundBorderValue" id="qslCountStyle"
onclick="resetSearch(); GT.filterQSL='true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
title="Show Confirmed List" align="center">
<div id="qslCount">0</div>
</td>
@ -1610,7 +1610,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div>
</div>
<br/>
<div class="mapItem">
<div style="padding: 5px" class="mapItem">
<table align="center">
<tr>
<td> QSL Location Authority</td>
</tr>
<tr>
<td>
<select id="qslAuthority" onchange="qslAuthorityChanged();">
<option value="L">LoTW</option>
<option value="Q">QRZ.com</option>
<option value="e">eQSL</option>
<option value="C">Clublog</option>
<option value="O">Other</option>
<option value="0">Last Loaded</option>
</select>
</td>
</tr>
</table>
</div>
<div class="mapItem" style="padding: 5px">
<table align="center">
<tr>
<td align="center">Logbook Items Per Page</td>

Wyświetl plik

@ -1517,7 +1517,7 @@
"VE9TEN/5",
"VE9XX/6",
"VE9ZP/4",
"VER20231205",
"VER20231215",
"VF0X",
"VF0X/M",
"VO/DL2GF",
@ -2628,6 +2628,7 @@
"K6VH",
"K7BUF",
"K7CAP",
"K7DN",
"K7EJM",
"K7LOP",
"K7MVX",
@ -3085,6 +3086,7 @@
"KK6BVH",
"KK6CAU",
"KK6IMB",
"KK6IQC",
"KK6IUY",
"KK6LL",
"KK6NRF",
@ -10568,6 +10570,7 @@
"R11QRP/8/P",
"R11QRP/9",
"R11UND",
"R120I",
"R120RAEM",
"R120RB",
"R120RDP",
@ -10580,7 +10583,10 @@
"R120RU",
"R120RW",
"R120RZ",
"R120S",
"R120T",
"R120TM",
"R120W",
"R123JDR",
"R125NSK",
"R135TU",
@ -10830,6 +10836,7 @@
"R71RRC",
"R7378TM",
"R73EPC/P",
"R73YOTA",
"R750X",
"R7AA/0",
"R7AB/0",
@ -12242,6 +12249,7 @@
"UA3WB/9",
"UA3YH/0",
"UA3ZAF/9",
"UA4FMQ/P",
"UA4LCQ/9",
"UA4LU/0",
"UA4LU/9/P",
@ -15245,6 +15253,7 @@
"RW9C": "20",
"RX9CC": "20",
"R0MQ/9": "31",
"R120I": "31",
"R135TU": "31",
"R140TU": "31",
"R2BDY/9": "31",
@ -15961,6 +15970,7 @@
"RQ0J/QRP": "33",
"RU3HD/0": "33",
"RW80KEDR": "33",
"UA4FMQ/P": "33",
"UA9MUY/0": "33",
"UE75OJ": "33",
"R2015RY": "25",
@ -16149,6 +16159,7 @@
"UE60QA": "23",
"UE6MAC/0": "23",
"R11QRP/9": "32",
"R120W": "32",
"R150LA": "32",
"R150LB": "32",
"R18SWE": "32",
@ -16399,6 +16410,7 @@
"UE18U": "18",
"UE18Z": "19",
"R0MQ/9": "18",
"R120I": "18",
"R135TU": "18",
"R140TU": "18",
"R2BDY/9": "18",
@ -17235,6 +17247,7 @@
"RQ0J/QRP": "19",
"RU3HD/0": "19",
"RW80KEDR": "19",
"UA4FMQ/P": "19",
"UA9MUY/0": "19",
"UE75OJ": "19",
"R2015RY": "19",
@ -17423,6 +17436,7 @@
"UE60QA": "19",
"UE6MAC/0": "19",
"R11QRP/9": "18",
"R120W": "18",
"R150LA": "18",
"R150LB": "18",
"R18SWE": "18",
@ -20445,8 +20459,10 @@
"R100RK",
"R100UD",
"R110A/P",
"R120K",
"R120RK",
"R120RP",
"R120X",
"R155PM",
"R160PM",
"R16NOR",
@ -21471,7 +21487,6 @@
"UA3YH/ANT",
"UA4ASE/FF",
"UA4ATL/FF",
"UA4FMQ/P",
"UA4H",
"UA4HAZ/P",
"UA4HBM",
@ -22480,6 +22495,7 @@
"R0000O": "19",
"R100FA": "19",
"R100K": "19",
"R120K": "19",
"R20ARRS": "19",
"R25ILIM": "19",
"R350AR": "19",
@ -22591,6 +22607,7 @@
"RZ30RR": "19",
"UB1Z": "19",
"UB1ZBD/N": "19",
"R120X": "30",
"R170SG": "30",
"R2023EN": "30",
"R20SAM": "30",
@ -22700,7 +22717,7 @@
"UE77MR": "30",
"UE77WT": "30",
"UF4H": "30",
"UG4I": "30",
"UG4I": "29",
"UG4I/P": "30",
"UI4H": "30",
"UI4I": "29",
@ -23480,9 +23497,7 @@
"confirmed_bands": {},
"worked_modes": {},
"confirmed_modes": {},
"direct": [
"VERSION"
],
"direct": [],
"prefixITU": {},
"prefixCQ": {},
"directITU": {},
@ -30349,7 +30364,6 @@
"AC6IF",
"AC9PT",
"AD6YJ",
"AE3TT",
"AE5AB",
"AE5LR",
"AE7QR",
@ -30547,6 +30561,7 @@
"KC9KEX",
"KC9NJG",
"KC9SBG",
"KC9WIB",
"KD0JNO",
"KD0OLJ",
"KD0OXU",
@ -31036,7 +31051,6 @@
"WK1K",
"WL7CSW",
"WL7CSW/H",
"WL7M",
"WV0Z",
"WV6K",
"WW7CC",
@ -35775,7 +35789,8 @@
"worked_modes": {},
"confirmed_modes": {},
"direct": [
"3D5X"
"3D5X",
"VERSION"
],
"prefixITU": {},
"prefixCQ": {},
@ -38203,6 +38218,7 @@
"OH6OG/SA",
"OH6OS/S",
"OH6OT/S",
"OH6P/S",
"OH6P/SA",
"OH6PA/S",
"OH6QR/S",
@ -38479,6 +38495,7 @@
"F/ON7RU/LH",
"F/PH2CV/LH",
"F4FET/LH",
"F4IGB/TRC",
"F5HPY/LH",
"F5NBX/LH",
"F5NMK/LH",
@ -41364,6 +41381,7 @@
"GB8SPD",
"GB8STM",
"GB8UKR",
"GB8WWA",
"GB90RSGB/82",
"GB90SOM",
"GB9AFD",
@ -42524,6 +42542,7 @@
"GB0SFM",
"GB0SHP",
"GB0SI",
"GB0SIC",
"GB0SIM",
"GB0SJR",
"GB0SK",
@ -42754,6 +42773,7 @@
"GB4SMM",
"GB4SRO",
"GB4SWF",
"GB4WWA",
"GB50FVS",
"GB50GDS",
"GB50GT",
@ -45456,6 +45476,7 @@
"AD4MM",
"AD5S",
"AD5XX",
"AE3TT",
"AE4RM",
"AE6CA",
"AE6I",
@ -46300,7 +46321,6 @@
"KC9HYY/LUS100",
"KC9HYY/MMD",
"KC9JDB",
"KC9WIB",
"KD0EBY",
"KD0ETC/LH",
"KD0FDP",
@ -47454,6 +47474,7 @@
"KL3TY",
"KL3UA",
"KL3UX",
"KL3UY",
"KL3VA",
"KL3VJ",
"KL3VN",
@ -48314,6 +48335,7 @@
"KY0C",
"KY7W",
"KZ5DX",
"KZ9G",
"KZ9V",
"N0BHR",
"N0CO",
@ -48431,6 +48453,7 @@
"N5UC",
"N5WE",
"N5XKG",
"N5YDC",
"N5YIZ",
"N5ZWF",
"N6AI",
@ -49390,6 +49413,7 @@
"WH6ADS",
"WH6AFM",
"WH6AFV",
"WH6AIR",
"WH6AJS",
"WH6AKZ",
"WH6AM",
@ -51627,6 +51651,7 @@
"KL7GLK/B": "07",
"KL7GT": "07",
"KL7HR": "07",
"KL7IEI": "07",
"KL7IWT": "07",
"KL7IXI": "07",
"KL7JGJ": "07",
@ -53005,6 +53030,7 @@
"N4UK": "08",
"N4Z": "08",
"N5HPW": "08",
"N5YDC": "08",
"N6RMQ": "08",
"N6TSM": "08",
"N7CGC": "08",
@ -53221,6 +53247,7 @@
"WH2G": "08",
"WH6A": "08",
"WH6ACF": "08",
"WH6AIR": "08",
"WH6AJS": "08",
"WH6AQ": "08",
"WH6AVU": "08",
@ -55214,6 +55241,7 @@
"KL3TQ": "06",
"KL3TW": "06",
"KL3TY": "06",
"KL3UY": "06",
"KL3VJ": "06",
"KL3XS": "06",
"KL4AO": "06",
@ -55294,7 +55322,6 @@
"KL7IAL": "06",
"KL7IBT": "06",
"KL7IDY": "06",
"KL7IEI": "06",
"KL7IFK": "06",
"KL7IG": "06",
"KL7IGB": "06",
@ -56072,6 +56099,7 @@
"WP4PLR": "08",
"WT3A": "08",
"AC9H": "08",
"AE3TT": "08",
"AH6DA": "08",
"AH6EZ/9": "08",
"AH6OM": "08",
@ -56108,7 +56136,6 @@
"KC9HYY/EOI": "08",
"KC9HYY/LUS100": "08",
"KC9HYY/MMD": "08",
"KC9WIB": "08",
"KD9Q/M": "08",
"KD9TWW": "08",
"KE5DDD": "08",
@ -56165,6 +56192,7 @@
"KP4TD": "08",
"KP4WG": "08",
"KV4AA": "08",
"KZ9G": "08",
"KZ9V": "08",
"N3QKX": "08",
"N4RIH": "08",
@ -56684,6 +56712,7 @@
"KL7GLK/B": "04",
"KL7GT": "04",
"KL7HR": "04",
"KL7IEI": "04",
"KL7IWT": "04",
"KL7IXI": "04",
"KL7JGJ": "04",
@ -58062,6 +58091,7 @@
"N4UK": "05",
"N4Z": "05",
"N5HPW": "05",
"N5YDC": "05",
"N6RMQ": "05",
"N6TSM": "05",
"N7CGC": "05",
@ -58278,6 +58308,7 @@
"WH2G": "05",
"WH6A": "05",
"WH6ACF": "05",
"WH6AIR": "05",
"WH6AJS": "05",
"WH6AQ": "05",
"WH6AVU": "05",
@ -60271,6 +60302,7 @@
"KL3TQ": "03",
"KL3TW": "03",
"KL3TY": "03",
"KL3UY": "03",
"KL3VJ": "03",
"KL3XS": "03",
"KL4AO": "03",
@ -60351,7 +60383,6 @@
"KL7IAL": "03",
"KL7IBT": "03",
"KL7IDY": "03",
"KL7IEI": "03",
"KL7IFK": "03",
"KL7IG": "03",
"KL7IGB": "03",
@ -61129,6 +61160,7 @@
"WP4PLR": "04",
"WT3A": "04",
"AC9H": "04",
"AE3TT": "04",
"AH6DA": "04",
"AH6EZ/9": "04",
"AH6OM": "04",
@ -61165,7 +61197,6 @@
"KC9HYY/EOI": "04",
"KC9HYY/LUS100": "04",
"KC9HYY/MMD": "04",
"KC9WIB": "04",
"KD9Q/M": "04",
"KD9TWW": "04",
"KE5DDD": "04",
@ -61222,6 +61253,7 @@
"KP4TD": "04",
"KP4WG": "04",
"KV4AA": "04",
"KZ9G": "04",
"KZ9V": "04",
"N3QKX": "04",
"N4RIH": "04",
@ -62134,6 +62166,7 @@
"GB50RSC",
"GB50SGP",
"GB5AC",
"GB5ANT",
"GB5BPL",
"GB5FI",
"GB5GEO",
@ -62162,6 +62195,7 @@
"GB6TS",
"GB6TSG",
"GB6WT",
"GB6WWA",
"GB6WWT",
"GB70BTF",
"GB70W",

Wyświetl plik

@ -285,8 +285,9 @@
</td>
<td>
<select id="watcherType" onchange="watcherTypeChanged(this.value)">
<option value="Callsign">Callsign</option>
<option value="Calling">Calling</option>
<option value="Callsign" data-i18n="roster.controls.hunting.callsign">Callsign</option>
<option value="Calling" data-i18n="alerts.QRZ.speech">Calling</option>
<option value="Grid" data-i18n="roster.controls.hunting.grid">Grid</option>
<option value="Message" data-i18n="gt.WSJTMessage.Message">Message</option>
</select>
</td>
@ -408,10 +409,12 @@
<option value="Callsign" selected="true">Callsign</option>
<option value="CQ">CQ</option>
<option value="DXCC">DXCC</option>
<option value="Grid">Grid</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"/>
<input id="ignoreGridValue" type="text" class="inputTextValue" oninput="gridInputValidate(this)" size="10"/>
<div id ="ignoreCqDiv">
CQ "<input id="ignoreCqCallsignValue" type="text" class="inputTextValue" oninput="this.value = this.value.toUpperCase()" size="4" value=""/>"
From

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -250,7 +250,7 @@
"312": "柬埔寨",
"315": "斯里兰卡",
"318": "中国",
"321": "香港",
"321": "香港",
"324": "印度",
"327": "印度尼西亚",
"330": "伊朗",
@ -328,8 +328,8 @@
"502": "北马其顿",
"503": "捷克",
"504": "斯洛伐克",
"505": "东沙群岛",
"506": "黄岩岛",
"505": "东沙群岛",
"506": "黄岩岛",
"507": "泰莫图省",
"508": "南方群岛",
"509": "马克萨斯岛",

Wyświetl plik

@ -4,7 +4,7 @@
"The GridTracker Team",
"VR2UPU"
],
"last-updated": "2023-12-03",
"last-updated": "2023-12-07",
"locale": "hk",
"message-documentation": "Traditional Chinese: VR2UPU"
},
@ -576,7 +576,7 @@
"roster.secondary.exceptions.onlyMyDXCC": "我需要的DXCC",
"roster.secondary.exceptions.useseQSL": "eQSL用戶",
"roster.secondary.exceptions.usesOQRS": "OQRS用戶",
"roster.secondary.exceptions.allOnlyNew": "僅限新呼號",
"roster.secondary.exceptions.allOnlyNew": "新呼號",
"roster.secondary.exceptions.wantRRCQ": "RR73當作CQ",
"roster.secondary.exceptions.noUnknownDXCC": "禁止不明DXCC",
"roster.secondary.exceptions.noMsg.label": "不包含",
@ -595,8 +595,8 @@
"stats.tabs.logbook": "日誌",
"stats.tabs.scores": "分數",
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ 分區",
"stats.tabs.ITUZones": "ITU 分區",
"stats.tabs.CQZones": "CQ分區",
"stats.tabs.ITUZones": "ITU分區",
"stats.tabs.WASWAC": "洲大陸/美國州",
"stats.tabs.live": "在線",
"stats.noDecodes": "還沒有解碼",
@ -624,7 +624,7 @@
"adif.LoggedHRDLogbook": "已記錄到 HRD Logbook",
"adif.ExceptionHRDLogbook": "HRD 日誌異常",
"adif.ExceptionLoTW": "LoTW 日誌異常",
"adif.ExceptionAlertLog": "Alert 日誌異常",
"adif.ExceptionAlertLog": "警報日誌異常",
"adif.ExceptionHideLookup": "隱藏查找異常",
"adif.BadPassUser": "錯誤<br/>密碼<br/>或<br/>暱稱",
"adif.UnknownCall": "不明<br/>呼號",

Wyświetl plik

@ -4,7 +4,7 @@
"The GridTracker Team",
"BD3OOX"
],
"last-updated": "2023-12-02",
"last-updated": "2023-12-07",
"locale": "cn",
"message-documentation": "Simplified Chinese: BD3OOX"
},
@ -576,11 +576,11 @@
"roster.secondary.exceptions.onlyMyDXCC": "我需要的DXCC",
"roster.secondary.exceptions.useseQSL": "在用eQSL",
"roster.secondary.exceptions.usesOQRS": "在用OQRS",
"roster.secondary.exceptions.allOnlyNew": "仅限新呼号",
"roster.secondary.exceptions.allOnlyNew": "新呼号",
"roster.secondary.exceptions.wantRRCQ": "RR73当作CQ",
"roster.secondary.exceptions.noUnknownDXCC": "禁止不明DXCC",
"roster.secondary.exceptions.noMsg.label": "不包含",
"roster.secondary.exceptions.noMsg.hover": "不包含解码...",
"roster.secondary.exceptions.noMsg.hover": "不包含解码...",
"roster.secondary.exceptions.onlyMsg.label": "仅限",
"roster.secondary.exceptions.onlyMsg.hover": "仅限包含的解码...",
"roster.secondary.exceptions.regex.label": "呼号匹配",
@ -624,8 +624,8 @@
"adif.LoggedHRDLogbook": "已保存到 HRD Logbook",
"adif.ExceptionHRDLogbook": "HRD 日志异常",
"adif.ExceptionLoTW": "LoTW 日志异常",
"adif.ExceptionAlertLog": "Alert 日志异常",
"adif.ExceptionHideLookup": "Hide Lookup 异常",
"adif.ExceptionAlertLog": "警报日志异常",
"adif.ExceptionHideLookup": "隐藏查找异常",
"adif.BadPassUser": "错误<br/>密码<br/>或<br/>昵称",
"adif.UnknownCall": "未知<br/>呼号",
"adif.QTHNickname": "需要<br/>QTH昵称",

Wyświetl plik

@ -250,7 +250,7 @@
"312": "柬埔寨",
"315": "斯里蘭卡",
"318": "中國",
"321": "香港",
"321": "香港",
"324": "印度",
"327": "印度尼西亞",
"330": "伊朗",
@ -328,8 +328,8 @@
"502": "北馬其頓",
"503": "捷克",
"504": "斯洛伐克",
"505": "東沙群島",
"506": "黃岩島",
"505": "東沙群島",
"506": "黃岩島",
"507": "泰莫圖省",
"508": "南方群島",
"509": "馬克薩斯島",

Wyświetl plik

@ -662,7 +662,7 @@
"alerts.callsign.popup": "Ricerca",
"alerts.gridsquare.speech": "Grid square",
"alerts.gridsquare.popup": "Grid square",
"alerts.QRZ.speech": "Chiamata",
"alerts.QRZ.speech": "Chiamando",
"alerts.QRZ.popup": "QRZ",
"alerts.AlertPop.Type": "Tipo",
"alerts.AlertPop.Value": "Valore",

Wyświetl plik

@ -81,6 +81,14 @@ function findAdiField(row, field)
return value;
}
GT.confSrcNames = {
C: "Clublog",
e: "eQSL",
L: "LoTW",
Q: "QRZ.com",
O: "Other"
}
function onAdiLoadComplete(adiBuffer)
{
var rawAdiBuffer = "";
@ -90,11 +98,18 @@ function onAdiLoadComplete(adiBuffer)
var activeAdifArray = Array();
var activeAdifLogMode = true;
var eQSLfile = false;
var clublogFile = false;
var lotwTimestampUpdated = false;
if (rawAdiBuffer.indexOf("PSKReporter") > -1) activeAdifLogMode = false;
if (activeAdifLogMode == true)
{
qsoCountStyle.className = "roundBorderValue QsoQslActive";
qslCountStyle.className = "roundBorderValue QsoQslActive";
}
if (rawAdiBuffer.indexOf("Received eQSLs") > -1) eQSLfile = true;
if (rawAdiBuffer.indexOf("clublog.adif") > -1 || rawAdiBuffer.indexOf("ADIF export from Club Log") > -1) clublogFile = true;
if (rawAdiBuffer.length > 1)
{
@ -114,6 +129,8 @@ function onAdiLoadComplete(adiBuffer)
{
if (activeAdifLogMode)
{
let confSource = null;
let lotwConfirmed = false;
// let object = parseADIFRecord(activeAdifArray[x]);
var appLoTW_RXQSO = findAdiField(activeAdifArray[x], "APP_LOTW_RXQSO");
if (appLoTW_RXQSO != "")
@ -145,6 +162,7 @@ function onAdiLoadComplete(adiBuffer)
GT.adifLogSettings.lastFetch.lotw_qsl = timestring.slice(0, 10) + " " + timestring.slice(11, 19);
lotwTimestampUpdated = true;
}
lotwConfirmed = true;
}
var finalDEcall = findAdiField(activeAdifArray[x], "STATION_CALLSIGN").replace("_", "/");
@ -288,6 +306,26 @@ function onAdiLoadComplete(adiBuffer)
if (qrzConfirmed == "C" || lotw_qsl_rcvd == "Y" || lotw_qsl_rcvd == "V" || lotwConfirmed1 == "Y" || eqsl_qsl_rcvd == "Y" || eqsl_qsl_rcvd == "V" || eQSLfile == true)
{
confirmed = true;
if (qrzConfirmed == "C")
{
confSource = "Q";
}
else if (eQSLfile == true)
{
confSource = "e";
}
else if (lotwConfirmed == true)
{
confSource = "L";
}
else if (clublogFile == true)
{
confSource = "C";
}
else
{
confSource = "O";
}
}
finalGrid = finalGrid.substr(0, 6);
@ -340,7 +378,8 @@ function onAdiLoadComplete(adiBuffer)
isPhone,
finalIOTA,
finalSatName,
finalPOTA
finalPOTA,
confSource
);
}
}
@ -507,6 +546,12 @@ function clubLogCallback(buffer, flag, cookie)
GT.isGettingClub = false;
function grabClubLog(test)
{
if (fs.existsSync(GT.clublogLogFile) && getFilesizeInBytes(GT.clublogLogFile) > 0)
{
GT.fromDirectCallNoFileDialog = true;
onAdiLoadComplete(fs.readFileSync(GT.clublogLogFile));
}
if (GT.isGettingClub == false)
{
if (test) clubTestResult.innerHTML = "Testing";
@ -559,7 +604,6 @@ function cleanAndPrepADIF(name, adiBuffer, reverse = false, noheader = false)
regex = new RegExp("<EOH>", "i");
var adiArray = rawAdiBuffer.split(regex);
var activeAdifArray = Array();
var activeAdifLogMode = true;
var finalBuffer = "";
if (noheader == false) finalBuffer = name + "<EOH>\r\n";
@ -808,6 +852,12 @@ function qrzCallback(buffer, flag)
GT.isGettingQRZCom = false;
function grabQrzComLog(test)
{
if (fs.existsSync(GT.QrzLogFile) && getFilesizeInBytes(GT.QrzLogFile) > 0)
{
GT.fromDirectCallNoFileDialog = true;
onAdiLoadComplete(fs.readFileSync(GT.QrzLogFile));
}
if (GT.isGettingQRZCom == false)
{
var action = "FETCH";
@ -1437,21 +1487,11 @@ function startupAdifLoadCheck()
{
logEventMedia.value = GT.alertSettings.logEventMedia;
loadWsjtLogFile();
if (loadGTCheckBox.checked == true) loadGtQSOLogFile();
if (loadAdifCheckBox.checked == true && GT.startupLogs.length > 0)
{ startupAdifLoadFunction(); }
if (loadAdifCheckBox.checked == true && GT.startupLogs.length > 0) startupAdifLoadFunction();
if (GT.mapSettings.offlineMode == false)
{
if (GT.appSettings.gtFlagImgSrc == 1) showGtFlags();
if (loadLOTWCheckBox.checked == true)
{
grabLOtWLog(false);
}
if (loadLOTWCheckBox.checked == true) grabLOtWLog(false);
if (loadQRZCheckBox.checked == true) grabQrzComLog(false);
@ -1459,6 +1499,10 @@ function startupAdifLoadCheck()
if (loadPsk24CheckBox.checked == true) grabPsk24();
}
if (loadGTCheckBox.checked == true) loadGtQSOLogFile();
loadWsjtLogFile();
}
function getABuffer(file_url, callback, flag, mode, port, imgToGray, stringOfFlag, timeoutX)
@ -2005,11 +2049,7 @@ function finishSendingReport(record, localMode)
addLastTraffic("<font style='color:white'>Spotted to POTA</font>");
}
if (
GT.N1MMSettings.enable == true &&
GT.N1MMSettings.port > 1024 &&
GT.N1MMSettings.ip.length > 4
)
if (GT.N1MMSettings.enable == true && GT.N1MMSettings.port > 1024 && GT.N1MMSettings.ip.length > 4)
{
sendUdpMessage(
report,
@ -2020,11 +2060,7 @@ function finishSendingReport(record, localMode)
addLastTraffic("<font style='color:white'>Logged to N1MM</font>");
}
if (
GT.log4OMSettings.enable == true &&
GT.log4OMSettings.port > 1024 &&
GT.log4OMSettings.ip.length > 4
)
if (GT.log4OMSettings.enable == true && GT.log4OMSettings.port > 1024 && GT.log4OMSettings.ip.length > 4)
{
sendUdpMessage(
"ADD " + report,
@ -2058,9 +2094,7 @@ function finishSendingReport(record, localMode)
catch (e)
{
console.log(e);
addLastTraffic(
"<font style='color:red'>Exception GridTracker backup</font>"
);
addLastTraffic("<font style='color:red'>Exception GridTracker backup</font>");
}
try
@ -2099,11 +2133,7 @@ function finishSendingReport(record, localMode)
addLastTraffic("<font style='color:red'>Exception Cloudlog Log</font>");
}
if (
GT.acLogSettings.enable == true &&
GT.acLogSettings.port > 0 &&
GT.acLogSettings.ip.length > 4
)
if (GT.acLogSettings.enable == true && GT.acLogSettings.port > 0 && GT.acLogSettings.ip.length > 4)
{
try
{
@ -2116,19 +2146,29 @@ function finishSendingReport(record, localMode)
}
}
if (
GT.dxkLogSettings.enable == true &&
GT.dxkLogSettings.port > 0 &&
GT.dxkLogSettings.ip.length > 4
)
if (GT.dxkLogSettings.enable == true && GT.dxkLogSettings.port > 0 && GT.dxkLogSettings.ip.length > 4)
{
try
{
sendDXKeeperLogMessage(
report,
GT.dxkLogSettings.port,
GT.dxkLogSettings.ip
);
let DXreport = "";
for (const key in record)
{
if ("MY_GRIDSQUARE" in record)
{
record.MY_GRIDSQUARE = record.MY_GRIDSQUARE.substr(0, 6);
}
if ("GRIDSQUARE" in record)
{
record.GRIDSQUARE = record.GRIDSQUARE.substr(0, 6);
}
if (key != "POTA")
{
DXreport += "<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
}
}
DXreport += "<EOR>";
sendDXKeeperLogMessage(DXreport, GT.dxkLogSettings.port, GT.dxkLogSettings.ip);
addLastTraffic("<font style='color:white'>Logged to DXKeeper</font>");
}
catch (e)
@ -2137,22 +2177,12 @@ function finishSendingReport(record, localMode)
}
}
if (
GT.HRDLogbookLogSettings.enable == true &&
GT.HRDLogbookLogSettings.port > 0 &&
GT.HRDLogbookLogSettings.ip.length > 4
)
if (GT.HRDLogbookLogSettings.enable == true && GT.HRDLogbookLogSettings.port > 0 && GT.HRDLogbookLogSettings.ip.length > 4)
{
try
{
sendHRDLogbookEntry(
record,
GT.HRDLogbookLogSettings.port,
GT.HRDLogbookLogSettings.ip
);
addLastTraffic(
"<font style='color:white'>Logged to HRD Logbook</font>"
);
sendHRDLogbookEntry(record, GT.HRDLogbookLogSettings.port, GT.HRDLogbookLogSettings.ip);
addLastTraffic("<font style='color:white'>Logged to HRD Logbook</font>");
}
catch (e)
{
@ -2178,29 +2208,27 @@ function finishSendingReport(record, localMode)
addLastTraffic("<font style='color:red'>Exception HamCQ Log</font>");
}
if (
logeQSLQSOCheckBox.checked == true &&
nicknameeQSLCheckBox.checked == true &&
eQSLNickname.value.trim().length > 0
)
if (logeQSLQSOCheckBox.checked == true && (nicknameeQSLCheckBox.checked == false || (nicknameeQSLCheckBox.checked == true && eQSLNickname.value.trim().length > 0)))
{
record.APP_EQSL_QTH_NICKNAME = eQSLNickname.value.trim();
report = "";
if (nicknameeQSLCheckBox.checked == true)
{
record.APP_EQSL_QTH_NICKNAME = eQSLNickname.value.trim();
}
let eQSLreport = "";
for (var key in record)
{
report +=
"<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
eQSLreport += "<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
}
report += "<EOR>";
}
eQSLreport += "<EOR>";
try
{
sendeQSLEntry(report);
}
catch (e)
{
addLastTraffic("<font style='color:red'>Exception LoTW Log</font>");
try
{
sendeQSLEntry(eQSLreport);
}
catch (e)
{
addLastTraffic("<font style='color:red'>Exception eQSL Log</font>");
}
}
try
@ -2321,23 +2349,21 @@ function sendeQSLEntry(report)
{
if (GT.mapSettings.offlineMode == true) return;
if (logeQSLQSOCheckBox.checked == true)
{
var pid = "GridTracker";
var pver = String(gtVersion);
var header = "<PROGRAMID:" + pid.length + ">" + pid + "\r\n";
header += "<PROGRAMVERSION:" + pver.length + ">" + pver + "\r\n";
header += "<EOH>\r\n";
var eReport = encodeURIComponent(header + report);
var fUrl =
"https://www.eQSL.cc/qslcard/importADIF.cfm?ADIFData=" +
eReport +
"&EQSL_USER=" +
encodeURIComponent(eQSLUser.value) +
"&EQSL_PSWD=" +
encodeURIComponent(eQSLPassword.value);
getABuffer(fUrl, eqslCallback, false, "https", 443);
}
var pid = "GridTracker";
var pver = String(gtVersion);
var header = "<PROGRAMID:" + pid.length + ">" + pid + "\r\n";
header += "<PROGRAMVERSION:" + pver.length + ">" + pver + "\r\n";
header += "<EOH>\r\n";
var eReport = encodeURIComponent(header + report);
var fUrl =
"https://www.eQSL.cc/qslcard/importADIF.cfm?ADIFData=" +
eReport +
"&EQSL_USER=" +
encodeURIComponent(eQSLUser.value) +
"&EQSL_PSWD=" +
encodeURIComponent(eQSLPassword.value);
getABuffer(fUrl, eqslCallback, false, "https", 443);
}
function testTrustedQSL(test)

Wyświetl plik

@ -779,37 +779,24 @@ function lookupUsCallsign(object, writeState = false)
}
}
object.zipcode = String(results.rows[0].zip);
if (object.cnty == null)
if (object.cnty == null && object.zipcode in GT.zipToCounty)
{
let request = GT.Idb.transaction(["lookups"], "readwrite").objectStore("lookups").get(object.DEcall);
request.onsuccess = function (event)
var counties = GT.zipToCounty[object.zipcode];
if (counties.length > 1)
{
let save = false;
if (request.result && object.cnty == null)
{
object.cnty = request.result.cnty;
object.qual = true;
save = true;
}
if (object.cnty == null && object.zipcode in GT.zipToCounty)
{
var counties = GT.zipToCounty[object.zipcode];
if (counties.length > 1)
{
object.qual = false;
}
else
{
object.qual = true;
}
object.cnty = counties[0];
save = true;
}
if (writeState && save)
{
refreshQSOs();
}
};
object.qual = false;
}
else
{
object.qual = true;
}
object.cnty = counties[0];
save = true;
if (writeState)
{
refreshQSOs();
}
}
}
},

Wyświetl plik

@ -100,7 +100,8 @@ var def_appSettings = {
workingCallsigns: {},
workingDateEnable: false,
workingDate: 0,
qsoItemsPerPage: 100
qsoItemsPerPage: 100,
qslAuthority: "L"
};
var def_mapSettings = {
@ -296,6 +297,7 @@ var def_qso = {
band: "",
cnty: null,
confirmed: false,
confSrcs: {},
cont: null,
cqz: "",
DEcall: "",

Wyświetl plik

@ -543,7 +543,9 @@ GT.NWappData = "";
GT.screenshotDir = "";
GT.scriptDir = "";
GT.qsoLogFile = "";
GT.clublogLogFile = "";
GT.LoTWLogFile = "";
GT.QrzLogFile = "";
GT.userMediaDir = "";
GT.gtMediaDir = path.resolve("./media");
GT.localeString = navigator.language;
@ -1018,7 +1020,7 @@ function processQSOs()
let fourGrid = details.grid.substr(0, 4);
let isDigi = details.digital;
let isPhone = details.phone;
GT.tracker.worked.call[details.DEcall + details.band + details.mode] = true;
GT.tracker.worked.call[details.DEcall] = true;
GT.tracker.worked.call[details.DEcall + details.mode] = true;
@ -1290,6 +1292,10 @@ function processQSOs()
}
}
}
qsoCountStyle.className = "roundBorderValue";
qslCountStyle.className = "roundBorderValue";
updateRosterWorked();
goProcessRoster();
redrawGrids();
@ -1336,7 +1342,8 @@ function addQSO(
finalPhone = false,
finalIOTA = "",
finalSatName = "",
finalPOTA = null
finalPOTA = null,
confSource = null
)
{
let hash = "";
@ -1352,6 +1359,7 @@ function addQSO(
if (hash in GT.QSOhash)
{
details = GT.QSOhash[hash];
let canWrite = (details.confirmed == false || GT.appSettings.qslAuthority == "0" || GT.appSettings.qslAuthority == confSource || !(GT.appSettings.qslAuthority in details.confSrcs));
if (finalGrid.length > 0 && finalGrid != details.grid)
{
// only touch the grid if it's larger than the last grid && the 4wide is the same
@ -1359,7 +1367,7 @@ function addQSO(
{
details.grid = finalGrid;
}
else if (details.grid.length != 0 && confirmed == true)
else if (details.grid.length != 0 && confirmed == true && canWrite)
{
details.grid = finalGrid;
}
@ -1369,16 +1377,15 @@ function addQSO(
if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv;
if (finalCqZone.length > 0) details.cqz = finalCqZone;
if (finalItuZone.length > 0) details.ituz = finalItuZone;
if (details.state != null && finalState != null && details.state != finalState && confirmed == true)
if (details.state != null && finalState != null && details.state != finalState && confirmed == true && canWrite)
{
details.state = finalState;
}
else if (details.state == null && finalState != null) details.state = finalState;
if (finalDxcc < 1 && details.dxcc > 0) finalDxcc = details.dxcc;
if (finalCont == null && details.cont) finalCont = details.cont;
if (details.cnty != null && finalCnty != null && details.cnty != finalCnty && confirmed == true)
if (details.cnty != null && finalCnty != null && details.cnty != finalCnty && confirmed == true && canWrite)
{
details.qual = true;
details.cnty = finalCnty;
}
else if (details.cnty == null && details.cnty != null) details.cnty = finalCnty;
@ -1388,6 +1395,10 @@ function addQSO(
if (finalSatName.length > 0) details.satName = finalSatName;
if (finalPOTA) details.pota = finalPOTA;
details.confirmed |= confirmed;
if (confirmed == true)
{
details.confSrcs[confSource] = true;
}
}
else
{
@ -1420,6 +1431,11 @@ function addQSO(
details.pota = finalPOTA;
details.worked = true;
details.confirmed = confirmed;
details.confSrcs = {};
if (confirmed == true)
{
details.confSrcs[confSource] = true;
}
}
if (finalDxcc < 1) finalDxcc = callsignToDxcc(finalDXcall);
@ -1445,7 +1461,7 @@ function addQSO(
details.qual = true;
}
if (isKnownCallsignUSplus(finalDxcc))
if (confirmed == false && isKnownCallsignUSplus(finalDxcc))
{
if (details.state == null && fourGrid.length > 0)
{
@ -2571,6 +2587,30 @@ function updateRosterInstances()
function changeLogbookPage()
{
qsoItemsPerPageTd.innerHTML = GT.appSettings.qsoItemsPerPage = parseInt(qsoItemsPerPageValue.value);
saveAppSettings();
}
GT.qslAuthorityTimer = null;
// Called from GridTracher.html
function qslAuthorityChanged()
{
if (GT.qslAuthorityTimer != null)
{
nodeTimers.clearTimeout(GT.qslAuthorityTimer);
GT.qslAuthorityTimer = null;
}
GT.appSettings.qslAuthority = qslAuthority.value;
saveAppSettings();
// we set the timer as calling directly will pause the input queue
GT.qslAuthorityTimer = nodeTimers.setTimeout(reloadFromQslAuthorityChanged, 500);
}
function reloadFromQslAuthorityChanged()
{
GT.qslAuthorityTimer = null;
clearQSOs(false); // do not clear what's on disk!
startupAdifLoadCheck();
}
function updateLogbook()
@ -4901,7 +4941,7 @@ function clearAndLoadQSOs()
startupAdifLoadCheck();
}
function clearQSOs()
function clearQSOs(clearFiles = true)
{
initQSOdata();
GT.QSOhash = {};
@ -4913,7 +4953,10 @@ function clearQSOs()
updateLogbook();
updateRosterWorked();
goProcessRoster();
clearLogFilesAndCounts();
if (clearFiles == true)
{
clearLogFilesAndCounts();
}
}
function clearLogFilesAndCounts()
@ -7369,7 +7412,7 @@ function showCallsignBox(redraw)
"<th>" + $.i18n("gt.callsignBox.ITU") + "</th>" +
"<th>" + $.i18n("gt.callsignBox.Flag") + "</th>" +
"<th align=left>" + $.i18n("gt.callsignBox.QSO") + "</th>" +
"<th>" + $.i18n("gt.callsignBox.Grid") + "</th>" +
"<th>" + $.i18n("gt.callsignBox.QSL") + "</th>" +
"<th>" + $.i18n("gt.callsignBox.When") + "</th>"; // <th>ITUz</th><th>CQz</th><th>ISO</th>";
if (GT.callsignLookups.lotwUseEnable == true) worker += "<th>" + $.i18n("gt.callsignBox.LoTW") + "</th>";
if (GT.callsignLookups.eqslUseEnable == true) worker += "<th>" + $.i18n("gt.callsignBox.eQSL") + "</th>";
@ -7727,7 +7770,7 @@ function showWorkedBox(sortIndex, nextPage, redraw)
var bands = {};
var modes = {};
var dxccs = {};
var confSrcs = {};
var ObjectCount = 0;
myObjects = GT.QSOhash;
@ -7792,8 +7835,12 @@ function showWorkedBox(sortIndex, nextPage, redraw)
var pp = list[key].dxcc in GT.dxccInfo ? GT.dxccInfo[list[key].dxcc].pp : "?";
dxccs[GT.dxccToAltName[list[key].dxcc] + " (" + pp + ")"] = list[key].dxcc;
if (list[key].confirmed)
{
confSrcs = Object.assign(confSrcs, list[key].confSrcs);
}
}
if (GT.filterBand != "Mixed")
{
list = list.filter(function (value)
@ -7832,7 +7879,18 @@ function showWorkedBox(sortIndex, nextPage, redraw)
{
list = list.filter(function (value)
{
return value.confirmed == (GT.filterQSL == "true");
if (GT.filterQSL == "false" || GT.filterQSL == "true")
{
return value.confirmed == (GT.filterQSL == "true");
}
else
{
if (value.confirmed && GT.filterQSL in value.confSrcs)
{
return true;
}
return false;
}
});
}
@ -7969,14 +8027,23 @@ function showWorkedBox(sortIndex, nextPage, redraw)
worker += "</tr>";
var key = null;
var confTitle = "";
var confTd = "";
for (var i = startIndex; i < endIndex; i++)
{
key = list[i];
if (confirmed)
{
let srcs = {};
Object.keys(key.confSrcs).forEach(src => { srcs[GT.confSrcNames[src]] = true; });
confTd = Object.keys(key.confSrcs).join("");
confTitle = "title='" + Object.keys(srcs).join(", ") + "'";
}
worker += "<tr align=left><td style='color:#ff0;cursor:pointer' onclick='window.opener.startLookup(\"" + key.DEcall + "\",\"" + key.grid + "\");' >" + formatCallsign(key.DEcall) + "</td>";
worker += "<td style='color:cyan;'>" + key.grid + (key.vucc_grids.length ? ", " + key.vucc_grids.join(", ") : "") + "</td>";
worker += "<td style='color:lightgreen'>" + key.band + "</td>";
worker += "<td style='color:lightblue'>" + key.mode + "</td>";
worker += "<td align=center>" + (key.confirmed ? "&#10004;" : "") + "</td>";
worker += "<td align=left " + confTitle + ">" + confTd + "</td>";
worker += "<td>" + key.RSTsent + "</td>";
worker += "<td>" + key.RSTrecv + "</td>";
worker += "<td style='color:orange'>" + GT.dxccToAltName[key.dxcc] + " <font color='lightgreen'>(" + (key.dxcc in GT.dxccInfo ? GT.dxccInfo[key.dxcc].pp : "?") + ")</font></td>";
@ -8112,6 +8179,15 @@ function showWorkedBox(sortIndex, nextPage, redraw)
option.text = "No";
newSelect.appendChild(option);
Object.keys(confSrcs)
.forEach(function (key)
{
var option = document.createElement("option");
option.value = key
option.text = GT.confSrcNames[key];
newSelect.appendChild(option);
});
statsAppendChild(
"qslFilterDiv",
newSelect,
@ -12896,6 +12972,7 @@ function setMsgSettingsView()
function loadAdifSettings()
{
qslAuthority.value = GT.appSettings.qslAuthority;
qsoItemsPerPageTd.innerHTML = qsoItemsPerPageValue.value = GT.appSettings.qsoItemsPerPage;
workingCallsignEnable.checked = GT.appSettings.workingCallsignEnable;
@ -14369,13 +14446,7 @@ function addLookupObjectToIndexedDB(lookupObject)
};
}
function getLookupCachedObject(
call,
gridPass,
resultFunction = null,
noResultFunction = null,
callObject = null
)
function getLookupCachedObject(call, gridPass, resultFunction = null, noResultFunction = null, callObject = null)
{
var request = GT.Idb
.transaction(["lookups"], "readwrite")
@ -14384,10 +14455,7 @@ function getLookupCachedObject(
request.onsuccess = function (event)
{
if (
request.result &&
parseInt(request.result.cached) + 604800 > timeNowSec()
)
if (request.result && parseInt(request.result.cached) + 604800 > timeNowSec())
{
// 7 days, should an option Tag! I know right?!
delete request.result;
@ -15244,6 +15312,8 @@ function mediaCheck()
GT.qsoLogFile = path.join(GT.appData, "GridTracker_QSO.adif");
GT.LoTWLogFile = path.join(GT.appData, "LogbookOfTheWorld.adif");
GT.QrzLogFile = path.join(GT.appData, "qrz.adif");
GT.clublogLogFile = path.join(GT.appData, "clublog.adif");
logEventMedia.appendChild(newOption("none", "None"));
msgAlertMedia.appendChild(newOption("none", "Select File"));
@ -15303,7 +15373,7 @@ function mediaCheck()
try
{
let fileExists = fs.existsSync(GT.NWappData + "internal_qso.json");
if (fileExists == true && GT.startVersion > 1231202)
if (fileExists == true && GT.startVersion > 1231207)
{
var data = JSON.parse(fs.readFileSync(GT.NWappData + "internal_qso.json"));
GT.tracker = data.tracker;

Wyświetl plik

@ -11,6 +11,7 @@ CR.blockedCalls = {};
CR.blockedCQ = {};
CR.ignoredCQ = {};
CR.blockedDxcc = {};
CR.blockedGrid = {};
CR.blockedCQz = {};
CR.blockedITUz = {};
CR.scriptReport = {};
@ -39,6 +40,7 @@ CR.targetHash = "";
CR.dxccMenu = null;
CR.targetDxcc = -1;
CR.CQMenu = null;
CR.GridMenu = null;
CR.MsgMenu = null;
CR.targetCQ = "";
CR.timerInterval = null;
@ -211,11 +213,17 @@ if (typeof localStorage.blockedITUz == "undefined")
localStorage.blockedITUz = "{}";
}
if (typeof localStorage.blockedGrid == "undefined")
{
localStorage.blockedGrid = "{}";
}
if (typeof localStorage.blockedCalls != "undefined")
{
CR.blockedCalls = JSON.parse(localStorage.blockedCalls);
CR.blockedCQ = JSON.parse(localStorage.blockedCQ);
CR.blockedDxcc = JSON.parse(localStorage.blockedDxcc);
CR.blockedGrid = JSON.parse(localStorage.blockedGrid);
CR.blockedCQz = JSON.parse(localStorage.blockedCQz);
CR.blockedITUz = JSON.parse(localStorage.blockedITUz);
}
@ -223,6 +231,7 @@ else
{
localStorage.blockedCalls = "{}";
localStorage.blockedDxcc = "{}";
localStorage.blockedGrid = "{}";
localStorage.blockedCQz = "{}";
localStorage.blockedITUz = "{}";
localStorage.ignoredCQ = "{}";
@ -263,6 +272,7 @@ function storeBlocks(render = true)
localStorage.blockedCalls = JSON.stringify(CR.blockedCalls);
localStorage.ignoredCQ = JSON.stringify(CR.ignoredCQ);
localStorage.blockedDxcc = JSON.stringify(CR.blockedDxcc);
localStorage.blockedGrid = JSON.stringify(CR.blockedGrid);
localStorage.blockedCQz = JSON.stringify(CR.blockedCQz);
localStorage.blockedITUz = JSON.stringify(CR.blockedITUz);
if (render)
@ -1307,6 +1317,7 @@ function initSelectors()
CR.ignoreTypeInputs = {};
CR.ignoreTypeInputs.Callsign = ignoreCallsignValue;
CR.ignoreTypeInputs.Grid = ignoreGridValue;
CR.ignoreTypeInputs.CQ = ignoreCqDiv;
CR.ignoreTypeInputs.DXCC = ignoreDxccSelect;
CR.ignoreTypeInputs.CQz = ignoreCqzSelect;
@ -1319,6 +1330,7 @@ function initSelectors()
function hideIgnoreElements()
{
ignoreCallsignValue.style.display = "none";
ignoreGridValue.style.display = "none";
ignoreCqDiv.style.display = "none";
ignoreDxccSelect.style.display = "none";
ignoreCqzSelect.style.display = "none";
@ -1337,9 +1349,25 @@ function ignoreTypeChanged(ignoreTypeValue)
CR.ignoreType = ignoreTypeValue;
}
ValidateTextInput(ignoreCallsignValue);
gridInputValidate(ignoreGridValue);
ValidateTextInput(ignoreCqCallsignValue);
}
function gridInputValidate(element)
{
element.value = element.value.toUpperCase().replace(/[^A-Z0-9/]+/g, "").substr(0, 4);
if (!element.value.match(GRID_REGEXP))
{
element.style.color = "#000";
element.style.backgroundColor = "yellow";
}
else
{
element.style.color = "";
element.style.backgroundColor = "";
}
}
function addNewIgnore()
{
if (CR.ignoreType == "Callsign")
@ -1360,6 +1388,10 @@ function addNewIgnore()
{
ignoreDxcc(ignoreDxccSelect.value);
}
else if (CR.ignoreType == "Grid")
{
ignoreGrid(ignoreGridValue.value);
}
else if (CR.ignoreType == "CQz")
{
ignoreCQz(ignoreCqzSelect.value)
@ -1429,6 +1461,13 @@ function ignoreDxcc(dxcc)
viewRoster();
}
function ignoreGrid(grid)
{
CR.blockedGrid[grid] = true;
storeBlocks();
viewRoster();
}
function ignoreCQ(cq, dxcc)
{
if (dxcc > 0)
@ -1465,6 +1504,13 @@ function deleteDxccIgnore(key)
viewRoster();
}
function deleteGridIgnore(key)
{
delete CR.blockedGrid[key];
storeBlocks();
viewRoster();
}
function deleteCQIgnore(key)
{
delete CR.ignoredCQ[key];
@ -1500,6 +1546,13 @@ function clearAllDxccIgnores()
viewRoster();
}
function clearAllGridIgnores()
{
CR.blockedGrid = Object();
storeBlocks();
viewRoster();
}
function clearAllCQIgnores()
{
CR.ignoredCQ = Object();
@ -1585,7 +1638,7 @@ function renderIgnoresTab()
let key = split[0];
let dxcc = -1;
if (split.length == 2) dxcc = parseInt(split[1]);
worker += "<tr><td align=left style='color:cyan;' >" + key + " from " + (dxcc == -1 ? "All" : window.opener.GT.dxccToAltName[dxcc]) + "</td><td style='cursor:pointer;' onclick='deleteCQIgnore(\"" + rawKey + "\")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px'></td></tr>";
worker += "<tr><td align=left style='color:lightgreen;' >" + key + " from " + (dxcc == -1 ? "All" : window.opener.GT.dxccToAltName[dxcc]) + "</td><td style='cursor:pointer;' onclick='deleteCQIgnore(\"" + rawKey + "\")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px'></td></tr>";
});
worker += "</table></div>";
}
@ -1603,6 +1656,19 @@ function renderIgnoresTab()
worker += "</table></div>";
}
if (Object.keys(CR.blockedGrid).length > 0)
{
clearString = "<th style='cursor:pointer;' onclick='clearAllGridIgnores()'>Clear All</th>";
worker += "<div class='ignoresTables'><table class='darkTable' align=center><tr><th align=left>Grid</th>" + clearString + "</tr>";
Object.keys(CR.blockedGrid)
.sort()
.forEach(function (key, i)
{
worker += "<tr><td align=left style='color:cyan' >" + key + "</td><td style='cursor:pointer;' onclick='deleteGridIgnore(\"" + key + "\")'><img src='/img/trash_24x48.png' style='height:17px;margin:-1px;margin-bottom:-3px;padding:0px'></td></tr>";
});
worker += "</table></div>";
}
if (Object.keys(CR.blockedCQz).length > 0)
{
clearString = "<th style='cursor:pointer;' onclick='clearAllCQzIgnores()'>Clear All</th>";
@ -2175,6 +2241,42 @@ function addControls()
CR.dxccMenu.append(item);
CR.GridMenu = new nw.Menu();
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.add.watcher.label"),
click: function ()
{
addWatcher(CR.callRoster[CR.targetHash].callObj.grid, "Grid");
}
});
CR.GridMenu.append(item);
item = new nw.MenuItem({
type: "normal",
label: "Ignore Grid",
click: function ()
{
ignoreGrid(CR.callRoster[CR.targetHash].callObj.grid);
}
});
CR.GridMenu.append(item);
item = new nw.MenuItem({
type: "normal",
label: $.i18n("roster.menu.EditIgnores"),
enabled: true,
click: function ()
{
openIgnores();
}
});
CR.GridMenu.append(item);
callsignNeed.value = CR.rosterSettings.callsign;
huntMode.value = CR.rosterSettings.hunting;
huntNeed.value = CR.rosterSettings.huntNeed;
@ -2358,6 +2460,14 @@ function handleContextMenu(ev)
CR.targetHash = parent.id;
CR.MsgMenu.popup(mouseX, mouseY);
}
else if (name == "Grid")
{
if (CR.callRoster[parent.id].callObj.grid.length == 4)
{
CR.targetHash = parent.id;
CR.GridMenu.popup(mouseX, mouseY);
}
}
else if (name == "CQ")
{
if (CR.callRoster[parent.id].DXcall != "CQ")
@ -3753,13 +3863,15 @@ function watcherTypeChanged(value)
watcherType.value = value;
if (value == "Callsign")
{
// fix i18n
watcherTextTh.innerHTML = "Callsign";
watcherTextTh.innerHTML = $.i18n("roster.controls.hunting.callsign");
}
if (value == "Calling")
{
// fix i18n
watcherTextTh.innerHTML = "Calling";
watcherTextTh.innerHTML = $.i18n("alerts.QRZ.speech");
}
if (value == "Grid")
{
watcherTextTh.innerHTML = $.i18n("roster.controls.hunting.grid");
}
if (value == "Message")
{
@ -3789,6 +3901,11 @@ function watcherOnText()
testCallsign = true;
watcherText.value = watcherText.value.toUpperCase().replace(/[^A-Z0-9/\s]+/g, "");
}
else if (watcherType.value == "Grid")
{
gridInputValidate(watcherText);
return;
}
else
{
testCallsign = true;

Wyświetl plik

@ -18,6 +18,8 @@ const CALLSIGN_REGEXP =
for a optional list of postindicators separated by `\/` from the rest of the call
*/
const GRID_REGEXP = /^[A-Z]{2}[0-9]{2}$/
function processRosterFiltering(callRoster, rosterSettings)
{
// First loop, exclude calls, mostly based on "Exceptions" settings
@ -83,6 +85,11 @@ function processRosterFiltering(callRoster, rosterSettings)
entry.tx = false;
continue;
}
if (callObj.grid in CR.blockedGrid)
{
entry.tx = false;
continue;
}
if (CR.rosterSettings.cqOnly == true)
{
if (CR.rosterSettings.wantRRCQ == true)

Wyświetl plik

@ -57,7 +57,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
// If they are not ignored or we're in a QSO with them, let it through
// TODO: This is here because it's after the filtering stage
if ((!(entry.DEcall in CR.blockedCalls) && !(callObj.dxcc in CR.blockedDxcc)) ||
if ((!(entry.DEcall in CR.blockedCalls) && !(callObj.dxcc in CR.blockedDxcc) && !(callObj.grid in CR.blockedGrid)) ||
window.opener.GT.instances[callObj.instance].status.DXcall == entry.DEcall)
{
entry.tx = true;
@ -91,6 +91,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
callObj.DEcallHTML = null;
callObj.DXcallHTML = null;
callObj.msgHTML = null;
callObj.gridHTML = null;
let colorObject = Object();
@ -833,6 +834,11 @@ function buildWatcher(watcher)
watcher.source = "DXcall";
watcher.html = "DXcallHTML";
}
else if (watcher.type == "Grid")
{
watcher.source = "grid";
watcher.html = "gridHTML";
}
else
{
watcher.source = "msg";

Wyświetl plik

@ -102,7 +102,8 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
rawAttrs: callObj.style.grid,
onClick: `centerOn("${callObj.grid}")`,
html: (callObj.grid.length > 0 ? callObj.grid : "&nbsp;")
name: "Grid",
html: (callObj.grid.length > 0 ? callObj.gridHTML || callObj.grid : "&nbsp;")
})
},

Wyświetl plik

@ -270,6 +270,26 @@ html, body {
min-width: 20px;
outline: none;
}
.QsoQslActive {
background: linear-gradient(90deg, yellow, blue);
background-size: 200% 200%;
animation: AnimationQsoQsl 1s ease infinite;
text-shadow: black 0 0 6px;
}
@keyframes AnimationQsoQsl {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.roundBorderDEInfo {
border: 1px solid white;
-webkit-border-radius: 6px;

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "GridTracker",
"product_string_do_not_use": "gridtracker",
"version": "1.23.1207",
"version": "1.23.1217",
"betaVersion": "",
"description": "GridTracker: An Amateur Radio Companion",
"author": "GridTracker.org",