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 gridtracker (1.23.1207) unstable; urgency=high
- BIGCTY - Update from December 5th - BIGCTY - Update from December 5th
- System - LoTW, eQSL and OQRS membership columns icon updated - System - LoTW, eQSL and OQRS membership columns icon updated

Wyświetl plik

@ -1,6 +1,6 @@
Name: {{{ git_name name=gridtracker }}} Name: {{{ git_name name=gridtracker }}}
Summary: GridTracker: An Amateur Radio Companion Summary: GridTracker: An Amateur Radio Companion
Version: 1.23.1207 Version: 1.23.1217
Release: 1%{?dist} Release: 1%{?dist}
BuildArch: noarch BuildArch: noarch
Source0: {{{ git_dir_pack }}} Source0: {{{ git_dir_pack }}}
@ -40,6 +40,14 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
%license %{_docdir}/%{name}/ %license %{_docdir}/%{name}/
%changelog %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 * Thu Dec 07 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1207-1
- BIGCTY - Update from December 5th - BIGCTY - Update from December 5th
- System - LoTW, eQSL and OQRS membership columns icon updated - 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"> align="right">
QSO QSO
</td> </td>
<td style="cursor: pointer" class="roundBorderValue" <td style="cursor: pointer" class="roundBorderValue" id="qsoCountStyle"
onclick="resetSearch(); openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox);" title="Worked Stations" onclick="resetSearch(); openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox);" title="Worked Stations"
align="center"> align="center">
<div id="qsoCount">0</div> <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> <div id="countryCount">0</div>
</td> </td>
<td data-i18n="quickStats.QSL.label" style="cursor: pointer" <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"> title="Show Confirmed List" align="right">
QSL QSL
</td> </td>
<td style="cursor: pointer" class="roundBorderValue" <td style="cursor: pointer" class="roundBorderValue" id="qslCountStyle"
onclick="resetSearch(); GT.filterQSL = 'true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)" onclick="resetSearch(); GT.filterQSL='true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
title="Show Confirmed List" align="center"> title="Show Confirmed List" align="center">
<div id="qslCount">0</div> <div id="qslCount">0</div>
</td> </td>
@ -1610,7 +1610,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div> </div>
</div> </div>
<br/> <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"> <table align="center">
<tr> <tr>
<td align="center">Logbook Items Per Page</td> <td align="center">Logbook Items Per Page</td>

Wyświetl plik

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

Wyświetl plik

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

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -779,37 +779,24 @@ function lookupUsCallsign(object, writeState = false)
} }
} }
object.zipcode = String(results.rows[0].zip); 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); var counties = GT.zipToCounty[object.zipcode];
request.onsuccess = function (event) if (counties.length > 1)
{ {
let save = false; object.qual = false;
if (request.result && object.cnty == null) }
{ else
object.cnty = request.result.cnty; {
object.qual = true; object.qual = true;
save = true; }
} object.cnty = counties[0];
if (object.cnty == null && object.zipcode in GT.zipToCounty) save = true;
{
var counties = GT.zipToCounty[object.zipcode]; if (writeState)
if (counties.length > 1) {
{ refreshQSOs();
object.qual = false; }
}
else
{
object.qual = true;
}
object.cnty = counties[0];
save = true;
}
if (writeState && save)
{
refreshQSOs();
}
};
} }
} }
}, },

Wyświetl plik

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

Wyświetl plik

@ -543,7 +543,9 @@ GT.NWappData = "";
GT.screenshotDir = ""; GT.screenshotDir = "";
GT.scriptDir = ""; GT.scriptDir = "";
GT.qsoLogFile = ""; GT.qsoLogFile = "";
GT.clublogLogFile = "";
GT.LoTWLogFile = ""; GT.LoTWLogFile = "";
GT.QrzLogFile = "";
GT.userMediaDir = ""; GT.userMediaDir = "";
GT.gtMediaDir = path.resolve("./media"); GT.gtMediaDir = path.resolve("./media");
GT.localeString = navigator.language; GT.localeString = navigator.language;
@ -1018,7 +1020,7 @@ function processQSOs()
let fourGrid = details.grid.substr(0, 4); let fourGrid = details.grid.substr(0, 4);
let isDigi = details.digital; let isDigi = details.digital;
let isPhone = details.phone; let isPhone = details.phone;
GT.tracker.worked.call[details.DEcall + details.band + details.mode] = true; GT.tracker.worked.call[details.DEcall + details.band + details.mode] = true;
GT.tracker.worked.call[details.DEcall] = true; GT.tracker.worked.call[details.DEcall] = true;
GT.tracker.worked.call[details.DEcall + details.mode] = true; GT.tracker.worked.call[details.DEcall + details.mode] = true;
@ -1290,6 +1292,10 @@ function processQSOs()
} }
} }
} }
qsoCountStyle.className = "roundBorderValue";
qslCountStyle.className = "roundBorderValue";
updateRosterWorked(); updateRosterWorked();
goProcessRoster(); goProcessRoster();
redrawGrids(); redrawGrids();
@ -1336,7 +1342,8 @@ function addQSO(
finalPhone = false, finalPhone = false,
finalIOTA = "", finalIOTA = "",
finalSatName = "", finalSatName = "",
finalPOTA = null finalPOTA = null,
confSource = null
) )
{ {
let hash = ""; let hash = "";
@ -1352,6 +1359,7 @@ function addQSO(
if (hash in GT.QSOhash) if (hash in GT.QSOhash)
{ {
details = GT.QSOhash[hash]; 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) if (finalGrid.length > 0 && finalGrid != details.grid)
{ {
// only touch the grid if it's larger than the last grid && the 4wide is the same // 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; details.grid = finalGrid;
} }
else if (details.grid.length != 0 && confirmed == true) else if (details.grid.length != 0 && confirmed == true && canWrite)
{ {
details.grid = finalGrid; details.grid = finalGrid;
} }
@ -1369,16 +1377,15 @@ function addQSO(
if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv; if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv;
if (finalCqZone.length > 0) details.cqz = finalCqZone; if (finalCqZone.length > 0) details.cqz = finalCqZone;
if (finalItuZone.length > 0) details.ituz = finalItuZone; 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; details.state = finalState;
} }
else if (details.state == null && finalState != null) details.state = finalState; else if (details.state == null && finalState != null) details.state = finalState;
if (finalDxcc < 1 && details.dxcc > 0) finalDxcc = details.dxcc; if (finalDxcc < 1 && details.dxcc > 0) finalDxcc = details.dxcc;
if (finalCont == null && details.cont) finalCont = details.cont; 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; details.cnty = finalCnty;
} }
else if (details.cnty == null && details.cnty != null) 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 (finalSatName.length > 0) details.satName = finalSatName;
if (finalPOTA) details.pota = finalPOTA; if (finalPOTA) details.pota = finalPOTA;
details.confirmed |= confirmed; details.confirmed |= confirmed;
if (confirmed == true)
{
details.confSrcs[confSource] = true;
}
} }
else else
{ {
@ -1420,6 +1431,11 @@ function addQSO(
details.pota = finalPOTA; details.pota = finalPOTA;
details.worked = true; details.worked = true;
details.confirmed = confirmed; details.confirmed = confirmed;
details.confSrcs = {};
if (confirmed == true)
{
details.confSrcs[confSource] = true;
}
} }
if (finalDxcc < 1) finalDxcc = callsignToDxcc(finalDXcall); if (finalDxcc < 1) finalDxcc = callsignToDxcc(finalDXcall);
@ -1445,7 +1461,7 @@ function addQSO(
details.qual = true; details.qual = true;
} }
if (isKnownCallsignUSplus(finalDxcc)) if (confirmed == false && isKnownCallsignUSplus(finalDxcc))
{ {
if (details.state == null && fourGrid.length > 0) if (details.state == null && fourGrid.length > 0)
{ {
@ -2571,6 +2587,30 @@ function updateRosterInstances()
function changeLogbookPage() function changeLogbookPage()
{ {
qsoItemsPerPageTd.innerHTML = GT.appSettings.qsoItemsPerPage = parseInt(qsoItemsPerPageValue.value); 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() function updateLogbook()
@ -4901,7 +4941,7 @@ function clearAndLoadQSOs()
startupAdifLoadCheck(); startupAdifLoadCheck();
} }
function clearQSOs() function clearQSOs(clearFiles = true)
{ {
initQSOdata(); initQSOdata();
GT.QSOhash = {}; GT.QSOhash = {};
@ -4913,7 +4953,10 @@ function clearQSOs()
updateLogbook(); updateLogbook();
updateRosterWorked(); updateRosterWorked();
goProcessRoster(); goProcessRoster();
clearLogFilesAndCounts(); if (clearFiles == true)
{
clearLogFilesAndCounts();
}
} }
function clearLogFilesAndCounts() function clearLogFilesAndCounts()
@ -7369,7 +7412,7 @@ function showCallsignBox(redraw)
"<th>" + $.i18n("gt.callsignBox.ITU") + "</th>" + "<th>" + $.i18n("gt.callsignBox.ITU") + "</th>" +
"<th>" + $.i18n("gt.callsignBox.Flag") + "</th>" + "<th>" + $.i18n("gt.callsignBox.Flag") + "</th>" +
"<th align=left>" + $.i18n("gt.callsignBox.QSO") + "</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>"; "<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.lotwUseEnable == true) worker += "<th>" + $.i18n("gt.callsignBox.LoTW") + "</th>";
if (GT.callsignLookups.eqslUseEnable == true) worker += "<th>" + $.i18n("gt.callsignBox.eQSL") + "</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 bands = {};
var modes = {}; var modes = {};
var dxccs = {}; var dxccs = {};
var confSrcs = {};
var ObjectCount = 0; var ObjectCount = 0;
myObjects = GT.QSOhash; 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 : "?"; var pp = list[key].dxcc in GT.dxccInfo ? GT.dxccInfo[list[key].dxcc].pp : "?";
dxccs[GT.dxccToAltName[list[key].dxcc] + " (" + pp + ")"] = list[key].dxcc; 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") if (GT.filterBand != "Mixed")
{ {
list = list.filter(function (value) list = list.filter(function (value)
@ -7832,7 +7879,18 @@ function showWorkedBox(sortIndex, nextPage, redraw)
{ {
list = list.filter(function (value) 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>"; worker += "</tr>";
var key = null; var key = null;
var confTitle = "";
var confTd = "";
for (var i = startIndex; i < endIndex; i++) for (var i = startIndex; i < endIndex; i++)
{ {
key = list[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 += "<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:cyan;'>" + key.grid + (key.vucc_grids.length ? ", " + key.vucc_grids.join(", ") : "") + "</td>";
worker += "<td style='color:lightgreen'>" + key.band + "</td>"; worker += "<td style='color:lightgreen'>" + key.band + "</td>";
worker += "<td style='color:lightblue'>" + key.mode + "</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.RSTsent + "</td>";
worker += "<td>" + key.RSTrecv + "</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>"; 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"; option.text = "No";
newSelect.appendChild(option); 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( statsAppendChild(
"qslFilterDiv", "qslFilterDiv",
newSelect, newSelect,
@ -12896,6 +12972,7 @@ function setMsgSettingsView()
function loadAdifSettings() function loadAdifSettings()
{ {
qslAuthority.value = GT.appSettings.qslAuthority;
qsoItemsPerPageTd.innerHTML = qsoItemsPerPageValue.value = GT.appSettings.qsoItemsPerPage; qsoItemsPerPageTd.innerHTML = qsoItemsPerPageValue.value = GT.appSettings.qsoItemsPerPage;
workingCallsignEnable.checked = GT.appSettings.workingCallsignEnable; workingCallsignEnable.checked = GT.appSettings.workingCallsignEnable;
@ -14369,13 +14446,7 @@ function addLookupObjectToIndexedDB(lookupObject)
}; };
} }
function getLookupCachedObject( function getLookupCachedObject(call, gridPass, resultFunction = null, noResultFunction = null, callObject = null)
call,
gridPass,
resultFunction = null,
noResultFunction = null,
callObject = null
)
{ {
var request = GT.Idb var request = GT.Idb
.transaction(["lookups"], "readwrite") .transaction(["lookups"], "readwrite")
@ -14384,10 +14455,7 @@ function getLookupCachedObject(
request.onsuccess = function (event) request.onsuccess = function (event)
{ {
if ( if (request.result && parseInt(request.result.cached) + 604800 > timeNowSec())
request.result &&
parseInt(request.result.cached) + 604800 > timeNowSec()
)
{ {
// 7 days, should an option Tag! I know right?! // 7 days, should an option Tag! I know right?!
delete request.result; delete request.result;
@ -15244,6 +15312,8 @@ function mediaCheck()
GT.qsoLogFile = path.join(GT.appData, "GridTracker_QSO.adif"); GT.qsoLogFile = path.join(GT.appData, "GridTracker_QSO.adif");
GT.LoTWLogFile = path.join(GT.appData, "LogbookOfTheWorld.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")); logEventMedia.appendChild(newOption("none", "None"));
msgAlertMedia.appendChild(newOption("none", "Select File")); msgAlertMedia.appendChild(newOption("none", "Select File"));
@ -15303,7 +15373,7 @@ function mediaCheck()
try try
{ {
let fileExists = fs.existsSync(GT.NWappData + "internal_qso.json"); 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")); var data = JSON.parse(fs.readFileSync(GT.NWappData + "internal_qso.json"));
GT.tracker = data.tracker; GT.tracker = data.tracker;

Wyświetl plik

@ -11,6 +11,7 @@ CR.blockedCalls = {};
CR.blockedCQ = {}; CR.blockedCQ = {};
CR.ignoredCQ = {}; CR.ignoredCQ = {};
CR.blockedDxcc = {}; CR.blockedDxcc = {};
CR.blockedGrid = {};
CR.blockedCQz = {}; CR.blockedCQz = {};
CR.blockedITUz = {}; CR.blockedITUz = {};
CR.scriptReport = {}; CR.scriptReport = {};
@ -39,6 +40,7 @@ CR.targetHash = "";
CR.dxccMenu = null; CR.dxccMenu = null;
CR.targetDxcc = -1; CR.targetDxcc = -1;
CR.CQMenu = null; CR.CQMenu = null;
CR.GridMenu = null;
CR.MsgMenu = null; CR.MsgMenu = null;
CR.targetCQ = ""; CR.targetCQ = "";
CR.timerInterval = null; CR.timerInterval = null;
@ -211,11 +213,17 @@ if (typeof localStorage.blockedITUz == "undefined")
localStorage.blockedITUz = "{}"; localStorage.blockedITUz = "{}";
} }
if (typeof localStorage.blockedGrid == "undefined")
{
localStorage.blockedGrid = "{}";
}
if (typeof localStorage.blockedCalls != "undefined") if (typeof localStorage.blockedCalls != "undefined")
{ {
CR.blockedCalls = JSON.parse(localStorage.blockedCalls); CR.blockedCalls = JSON.parse(localStorage.blockedCalls);
CR.blockedCQ = JSON.parse(localStorage.blockedCQ); CR.blockedCQ = JSON.parse(localStorage.blockedCQ);
CR.blockedDxcc = JSON.parse(localStorage.blockedDxcc); CR.blockedDxcc = JSON.parse(localStorage.blockedDxcc);
CR.blockedGrid = JSON.parse(localStorage.blockedGrid);
CR.blockedCQz = JSON.parse(localStorage.blockedCQz); CR.blockedCQz = JSON.parse(localStorage.blockedCQz);
CR.blockedITUz = JSON.parse(localStorage.blockedITUz); CR.blockedITUz = JSON.parse(localStorage.blockedITUz);
} }
@ -223,6 +231,7 @@ else
{ {
localStorage.blockedCalls = "{}"; localStorage.blockedCalls = "{}";
localStorage.blockedDxcc = "{}"; localStorage.blockedDxcc = "{}";
localStorage.blockedGrid = "{}";
localStorage.blockedCQz = "{}"; localStorage.blockedCQz = "{}";
localStorage.blockedITUz = "{}"; localStorage.blockedITUz = "{}";
localStorage.ignoredCQ = "{}"; localStorage.ignoredCQ = "{}";
@ -263,6 +272,7 @@ function storeBlocks(render = true)
localStorage.blockedCalls = JSON.stringify(CR.blockedCalls); localStorage.blockedCalls = JSON.stringify(CR.blockedCalls);
localStorage.ignoredCQ = JSON.stringify(CR.ignoredCQ); localStorage.ignoredCQ = JSON.stringify(CR.ignoredCQ);
localStorage.blockedDxcc = JSON.stringify(CR.blockedDxcc); localStorage.blockedDxcc = JSON.stringify(CR.blockedDxcc);
localStorage.blockedGrid = JSON.stringify(CR.blockedGrid);
localStorage.blockedCQz = JSON.stringify(CR.blockedCQz); localStorage.blockedCQz = JSON.stringify(CR.blockedCQz);
localStorage.blockedITUz = JSON.stringify(CR.blockedITUz); localStorage.blockedITUz = JSON.stringify(CR.blockedITUz);
if (render) if (render)
@ -1307,6 +1317,7 @@ function initSelectors()
CR.ignoreTypeInputs = {}; CR.ignoreTypeInputs = {};
CR.ignoreTypeInputs.Callsign = ignoreCallsignValue; CR.ignoreTypeInputs.Callsign = ignoreCallsignValue;
CR.ignoreTypeInputs.Grid = ignoreGridValue;
CR.ignoreTypeInputs.CQ = ignoreCqDiv; CR.ignoreTypeInputs.CQ = ignoreCqDiv;
CR.ignoreTypeInputs.DXCC = ignoreDxccSelect; CR.ignoreTypeInputs.DXCC = ignoreDxccSelect;
CR.ignoreTypeInputs.CQz = ignoreCqzSelect; CR.ignoreTypeInputs.CQz = ignoreCqzSelect;
@ -1319,6 +1330,7 @@ function initSelectors()
function hideIgnoreElements() function hideIgnoreElements()
{ {
ignoreCallsignValue.style.display = "none"; ignoreCallsignValue.style.display = "none";
ignoreGridValue.style.display = "none";
ignoreCqDiv.style.display = "none"; ignoreCqDiv.style.display = "none";
ignoreDxccSelect.style.display = "none"; ignoreDxccSelect.style.display = "none";
ignoreCqzSelect.style.display = "none"; ignoreCqzSelect.style.display = "none";
@ -1337,9 +1349,25 @@ function ignoreTypeChanged(ignoreTypeValue)
CR.ignoreType = ignoreTypeValue; CR.ignoreType = ignoreTypeValue;
} }
ValidateTextInput(ignoreCallsignValue); ValidateTextInput(ignoreCallsignValue);
gridInputValidate(ignoreGridValue);
ValidateTextInput(ignoreCqCallsignValue); 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() function addNewIgnore()
{ {
if (CR.ignoreType == "Callsign") if (CR.ignoreType == "Callsign")
@ -1360,6 +1388,10 @@ function addNewIgnore()
{ {
ignoreDxcc(ignoreDxccSelect.value); ignoreDxcc(ignoreDxccSelect.value);
} }
else if (CR.ignoreType == "Grid")
{
ignoreGrid(ignoreGridValue.value);
}
else if (CR.ignoreType == "CQz") else if (CR.ignoreType == "CQz")
{ {
ignoreCQz(ignoreCqzSelect.value) ignoreCQz(ignoreCqzSelect.value)
@ -1429,6 +1461,13 @@ function ignoreDxcc(dxcc)
viewRoster(); viewRoster();
} }
function ignoreGrid(grid)
{
CR.blockedGrid[grid] = true;
storeBlocks();
viewRoster();
}
function ignoreCQ(cq, dxcc) function ignoreCQ(cq, dxcc)
{ {
if (dxcc > 0) if (dxcc > 0)
@ -1465,6 +1504,13 @@ function deleteDxccIgnore(key)
viewRoster(); viewRoster();
} }
function deleteGridIgnore(key)
{
delete CR.blockedGrid[key];
storeBlocks();
viewRoster();
}
function deleteCQIgnore(key) function deleteCQIgnore(key)
{ {
delete CR.ignoredCQ[key]; delete CR.ignoredCQ[key];
@ -1500,6 +1546,13 @@ function clearAllDxccIgnores()
viewRoster(); viewRoster();
} }
function clearAllGridIgnores()
{
CR.blockedGrid = Object();
storeBlocks();
viewRoster();
}
function clearAllCQIgnores() function clearAllCQIgnores()
{ {
CR.ignoredCQ = Object(); CR.ignoredCQ = Object();
@ -1585,7 +1638,7 @@ function renderIgnoresTab()
let key = split[0]; let key = split[0];
let dxcc = -1; let dxcc = -1;
if (split.length == 2) dxcc = parseInt(split[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>"; worker += "</table></div>";
} }
@ -1603,6 +1656,19 @@ function renderIgnoresTab()
worker += "</table></div>"; 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) if (Object.keys(CR.blockedCQz).length > 0)
{ {
clearString = "<th style='cursor:pointer;' onclick='clearAllCQzIgnores()'>Clear All</th>"; clearString = "<th style='cursor:pointer;' onclick='clearAllCQzIgnores()'>Clear All</th>";
@ -2175,6 +2241,42 @@ function addControls()
CR.dxccMenu.append(item); 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; callsignNeed.value = CR.rosterSettings.callsign;
huntMode.value = CR.rosterSettings.hunting; huntMode.value = CR.rosterSettings.hunting;
huntNeed.value = CR.rosterSettings.huntNeed; huntNeed.value = CR.rosterSettings.huntNeed;
@ -2358,6 +2460,14 @@ function handleContextMenu(ev)
CR.targetHash = parent.id; CR.targetHash = parent.id;
CR.MsgMenu.popup(mouseX, mouseY); 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") else if (name == "CQ")
{ {
if (CR.callRoster[parent.id].DXcall != "CQ") if (CR.callRoster[parent.id].DXcall != "CQ")
@ -3753,13 +3863,15 @@ function watcherTypeChanged(value)
watcherType.value = value; watcherType.value = value;
if (value == "Callsign") if (value == "Callsign")
{ {
// fix i18n watcherTextTh.innerHTML = $.i18n("roster.controls.hunting.callsign");
watcherTextTh.innerHTML = "Callsign";
} }
if (value == "Calling") if (value == "Calling")
{ {
// fix i18n watcherTextTh.innerHTML = $.i18n("alerts.QRZ.speech");
watcherTextTh.innerHTML = "Calling"; }
if (value == "Grid")
{
watcherTextTh.innerHTML = $.i18n("roster.controls.hunting.grid");
} }
if (value == "Message") if (value == "Message")
{ {
@ -3789,6 +3901,11 @@ function watcherOnText()
testCallsign = true; testCallsign = true;
watcherText.value = watcherText.value.toUpperCase().replace(/[^A-Z0-9/\s]+/g, ""); watcherText.value = watcherText.value.toUpperCase().replace(/[^A-Z0-9/\s]+/g, "");
} }
else if (watcherType.value == "Grid")
{
gridInputValidate(watcherText);
return;
}
else else
{ {
testCallsign = true; 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 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) function processRosterFiltering(callRoster, rosterSettings)
{ {
// First loop, exclude calls, mostly based on "Exceptions" settings // First loop, exclude calls, mostly based on "Exceptions" settings
@ -83,6 +85,11 @@ function processRosterFiltering(callRoster, rosterSettings)
entry.tx = false; entry.tx = false;
continue; continue;
} }
if (callObj.grid in CR.blockedGrid)
{
entry.tx = false;
continue;
}
if (CR.rosterSettings.cqOnly == true) if (CR.rosterSettings.cqOnly == true)
{ {
if (CR.rosterSettings.wantRRCQ == 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 // 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 // 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) window.opener.GT.instances[callObj.instance].status.DXcall == entry.DEcall)
{ {
entry.tx = true; entry.tx = true;
@ -91,6 +91,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
callObj.DEcallHTML = null; callObj.DEcallHTML = null;
callObj.DXcallHTML = null; callObj.DXcallHTML = null;
callObj.msgHTML = null; callObj.msgHTML = null;
callObj.gridHTML = null;
let colorObject = Object(); let colorObject = Object();
@ -833,6 +834,11 @@ function buildWatcher(watcher)
watcher.source = "DXcall"; watcher.source = "DXcall";
watcher.html = "DXcallHTML"; watcher.html = "DXcallHTML";
} }
else if (watcher.type == "Grid")
{
watcher.source = "grid";
watcher.html = "gridHTML";
}
else else
{ {
watcher.source = "msg"; watcher.source = "msg";

Wyświetl plik

@ -102,7 +102,8 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({ tableData: (callObj) => ({
rawAttrs: callObj.style.grid, rawAttrs: callObj.style.grid,
onClick: `centerOn("${callObj.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; min-width: 20px;
outline: none; 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 { .roundBorderDEInfo {
border: 1px solid white; border: 1px solid white;
-webkit-border-radius: 6px; -webkit-border-radius: 6px;

Wyświetl plik

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