diff --git a/debian/changelog b/debian/changelog index 1b0e277..d328350 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,19 @@ +gridtracker (1.23.1202) unstable; urgency=low + - BIGCTY - Update from November 29th + - System - Returned LoTW, eQSL and OQRS membership columns to log entries + - System - Fixed initial install window sizes + - Logbook Viewer - Added DXCC reset view button + - Call Roster + - New “Move Column Right” added to right-click Column header + - Fixed handling of compound callsigns + - Fixed saving of Ignored CQ zones and ITU zones + - New Settings Button (Ctrl-S) + - New Callsign / Message Watcher (Ctrl-W or Ctrl-O) + - New Exceptions Settings (Ctrl-E) + - New Ignores Editor / Viewer (Ctrl-I) + - New Columns Editor (Ctrl-C) +-- Tag Loomis Sat, 02 Dec 2023 00:00:00 -0000 + gridtracker (1.23.1112) unstable; urgency=low - Language - Added Français and Italiano (Special thanks to HB9TIH and HB9SNR) - Language - Added Español (Special thanks to KI2D and HI8O) diff --git a/gridtracker.spec b/gridtracker.spec index 2ff7465..a2fb969 100644 --- a/gridtracker.spec +++ b/gridtracker.spec @@ -1,6 +1,6 @@ Name: {{{ git_name name=gridtracker }}} Summary: GridTracker: An Amateur Radio Companion -Version: 1.23.1112 +Version: 1.23.1202 Release: 1%{?dist} BuildArch: noarch Source0: {{{ git_dir_pack }}} @@ -40,6 +40,20 @@ DESTDIR=${RPM_BUILD_ROOT} make clean %license %{_docdir}/%{name}/ %changelog +* Sat Dec 02 2023 Tag Loomis - 1.23.1202-1 + - BIGCTY - Update from November 29th + - System - Returned LoTW, eQSL and OQRS membership columns to log entries + - System - Fixed initial install window sizes + - Logbook Viewer - Added DXCC reset view button + - Call Roster + - New “Move Column Right” added to right-click Column header + - Fixed handling of compound callsigns + - Fixed saving of Ignored CQ zones and ITU zones + - New Settings Button (Ctrl-S) + - New Callsign / Message Watcher (Ctrl-W or Ctrl-O) + - New Exceptions Settings (Ctrl-E) + - New Ignores Editor / Viewer (Ctrl-I) + - New Columns Editor (Ctrl-C) * Sun Nov 12 2023 Tag Loomis - 1.23.1112-1 - Language - Added Français and Italiano (Special thanks to HB9TIH and HB9SNR) - Language - Added Español (Special thanks to KI2D and HI8O) diff --git a/package.nw/GridTracker.html b/package.nw/GridTracker.html index ccca4c7..40668cc 100644 --- a/package.nw/GridTracker.html +++ b/package.nw/GridTracker.html @@ -761,9 +761,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5 Show US States Award Layer - T - Add TTS Alert - right-click
empty grid + + + 6 @@ -777,9 +777,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 7 Show US Counties Award Layer - V - Add PopUp Alert - right-click
empty grid + + + 8 @@ -910,9 +910,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - M - Add MapCenter Alert - right-click
empty grid + + + F10 Store Map Position 6 Shift-Key @@ -1444,9 +1444,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Text-to-speech Voice - -
- + @@ -3185,8 +3183,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- +
+
diff --git a/package.nw/data/mh-root-prefixed.json b/package.nw/data/mh-root-prefixed.json index f68b2dc..e2668e7 100644 --- a/package.nw/data/mh-root-prefixed.json +++ b/package.nw/data/mh-root-prefixed.json @@ -1388,6 +1388,7 @@ "VA2VFT", "VA2VVV", "VA3ELE/2", + "VA3ELE/P", "VA3MPM/2", "VA3NA/2", "VA3QSL/1", @@ -1451,6 +1452,7 @@ "VE2NN", "VE2OTT", "VE2OV/P", + "VE2PID/3", "VE2PK/3", "VE2PRG", "VE2QIP/2", @@ -1515,7 +1517,7 @@ "VE9TEN/5", "VE9XX/6", "VE9ZP/4", - "VER20231103", + "VER20231129", "VF0X", "VF0X/M", "VO/DL2GF", @@ -1770,6 +1772,7 @@ "VE2AEJ/3": "04", "VE2MAM/3": "04", "VE2MW/3": "04", + "VE2PID/3": "04", "VE2PK/3": "04", "VE2QLF/3": "04", "VE2QV/3": "04", @@ -1847,6 +1850,7 @@ "VA2VFT": "04", "VA2VVV": "04", "VA3ELE/2": "04", + "VA3ELE/P": "04", "VA3NA/2": "04", "VB2C": "04", "VB2M": "04", @@ -1927,6 +1931,7 @@ "VE2AEJ/3": "04", "VE2MAM/3": "04", "VE2MW/3": "04", + "VE2PID/3": "04", "VE2PK/3": "04", "VE2QLF/3": "04", "VE2QV/3": "04", @@ -2006,6 +2011,7 @@ "VA2VFT": "02", "VA2VVV": "02", "VA3ELE/2": "02", + "VA3ELE/P": "02", "VA3NA/2": "02", "VB2C": "02", "VB2M": "02", @@ -2589,6 +2595,7 @@ "AJ6WA", "AK0O", "AK4CM", + "AK6DA", "K0BHC", "K0ESQ", "K1BZD", @@ -2702,7 +2709,6 @@ "KB7UBH", "KB7VFZ", "KB7YEC", - "KB7ZVZ", "KB8LJT", "KB8QKR", "KB8SBG", @@ -2871,7 +2877,6 @@ "KD8KQL", "KD8RMO", "KD8SOV", - "KD8WMX", "KD9QKS", "KD9TK", "KE0DYM", @@ -3006,6 +3011,7 @@ "KG7JVJ", "KG7MIK", "KG7OQC", + "KG7ORS", "KG7OUF", "KG7OYE", "KG7SEQ", @@ -3286,7 +3292,6 @@ "WA7USX", "WA7YXF", "WB0CMZ", - "WB1BR", "WB1GZL", "WB1ILS", "WB5EAA", @@ -3393,12 +3398,12 @@ "AF7MN", "KD2UVU", "KD8TFY", + "KG7ITH", "KH0WF", "KM4YJH", "KS6EL", "KS6FS", "NH0AA", - "W9CG", "WH6BAR", "WL7BMP" ], @@ -10528,6 +10533,7 @@ "R0QAW/P", "R0SDG/P", "R0UPOL", + "R0UT", "R0WA/P", "R0WX/P", "R100D", @@ -10560,6 +10566,7 @@ "R11QRP/8/P", "R11QRP/9", "R11UND", + "R120RAEM", "R120RB", "R120RDP", "R120RG", @@ -10637,6 +10644,7 @@ "R1DA/8/M", "R1DA/9/M", "R1FW/0", + "R1LK/4", "R1PN/8", "R1ZBH/0", "R1ZY/8", @@ -10718,12 +10726,15 @@ "R2CC/0", "R2DA/9", "R2DG/0", + "R2DUZ/0", "R2DWG/0", "R2DXU/8", "R2EA/8", "R2EC/9", "R2ET/9", + "R2FCE/9", "R2SD/9", + "R2ST/9", "R2VC/9", "R300EKB", "R300NT", @@ -10741,6 +10752,7 @@ "R35NP", "R375I", "R390I", + "R3AR/9", "R3ARS/9", "R3BY/0", "R3CA/0", @@ -10748,12 +10760,14 @@ "R3CA/8", "R3CA/9", "R3CG/8", + "R3DAJ/0", "R3HD/0", "R3HD/9", "R3LA/0", "R3RRC/0", "R3RRC/0/MM", "R3RRC/8", + "R3TIP/0", "R3UBL/9", "R3XX/9", "R3YAB/9/P", @@ -10773,7 +10787,9 @@ "R4FBJ/0/P", "R4FBJ/9/P", "R4WAB/9/P", + "R4WBS/9", "R4YA/8", + "R4YAC/8", "R4YAC/9", "R50CQM", "R50JNV", @@ -10792,6 +10808,7 @@ "R5AF/0", "R5QA/0", "R5QA/9", + "R5QA/M", "R5QA/P", "R63RRC", "R66IOTA", @@ -10825,6 +10842,7 @@ "R7LZ/9", "R7MR/0", "R800SAN", + "R8CDV/0", "R8CW/0", "R8FF/8", "R8JAJ/4", @@ -11069,6 +11087,7 @@ "RC0C", "RC0F", "RC0L", + "RC0W", "RC110RAEM", "RC18EK", "RC1M/8/M", @@ -11086,6 +11105,7 @@ "RC4W/9", "RC5A/0", "RC6AR/0", + "RC6N/0", "RC7LE/9", "RC85AO", "RC8I", @@ -11871,6 +11891,7 @@ "RU27WF", "RU27WN", "RU27WO", + "RU3ADA/9", "RU3BY/0", "RU3DX/0", "RU3FF/0", @@ -11928,6 +11949,7 @@ "RV6LGY/9", "RV6LGY/9/M", "RV6LGY/9/P", + "RV6LVT/9", "RV6MD/9", "RV6YM/9", "RV7AD/0", @@ -11953,6 +11975,7 @@ "RW0BG/9", "RW0CE/9", "RW0QJ/9", + "RW0UM", "RW0UM/0", "RW110RAEM", "RW1AC/9", @@ -11973,6 +11996,7 @@ "RW3GW/0", "RW3LG/0", "RW3SN/9", + "RW3XD/0", "RW3XN/0", "RW3XX/9", "RW3YC/0", @@ -11996,12 +12020,14 @@ "RW55YG", "RW6AHV/9", "RW6BA/9", + "RW6MD/8", "RW6MD/9", "RW80KEDR", "RW8T", "RW8W", "RW90WC", "RW95WJ", + "RW9AV", "RW9C", "RW9FWR/9/M", "RW9JZ/4", @@ -12049,6 +12075,7 @@ "RX6LMQ/0", "RX80SP", "RX95WN", + "RX9CC", "RX9J", "RX9O", "RX9SN/8", @@ -12153,6 +12180,7 @@ "UA0FCB/0/P", "UA0FCB/P", "UA0KBA/9", + "UA0KBG", "UA0KBG/0", "UA0KBG/9", "UA0KBG/9/P", @@ -12168,6 +12196,7 @@ "UA0SDX/0", "UA0SIK/0", "UA0SVD/0", + "UA0UV", "UA0W", "UA0WG/0", "UA0WG/P", @@ -12257,6 +12286,7 @@ "UA9CDC/M", "UA9CDC/P", "UA9CTT/0", + "UA9CTT/9", "UA9CTT/M", "UA9CTT/P", "UA9FL/0", @@ -12279,6 +12309,7 @@ "UA9MRA/9", "UA9MUY/0", "UA9MUY/9", + "UA9MW", "UA9MW/9", "UA9OAP/9/P", "UA9P", @@ -12310,6 +12341,7 @@ "UB2FCO/8", "UB2FCO/8/P", "UB40FSU", + "UB4HOO/9", "UB5O/0", "UB5O/4/M", "UB5O/8", @@ -15207,7 +15239,9 @@ "R34SP": "75", "RD1AL/0": "75", "RI18POL": "75", + "RW9AV": "21", "RW9C": "20", + "RX9CC": "20", "R0MQ/9": "31", "R135TU": "31", "R140TU": "31", @@ -15420,11 +15454,13 @@ "UA9SUV/8": "20", "UC7T/9": "20", "R9MA": "31", + "UA9MW": "31", "R0LY/9": "31", "R0QA/9": "31", "R100MP": "31", "R110RAEM": "31", "R111EK": "31", + "R120RAEM": "31", "R120RW": "31", "R125NSK": "31", "R15CWC/9": "31", @@ -15442,6 +15478,7 @@ "R27OUO": "31", "R2ET/9": "31", "R30SIB": "31", + "R5QA/M": "31", "R7AB/9": "31", "R8OA/9/P": "31", "R8SRR": "31", @@ -15748,6 +15785,7 @@ "UA4PT/0": "32", "UA6BTN/0": "32", "UA9CTT/0": "32", + "UA9CTT/9": "32", "UA9CTT/P": "32", "UA9UAX/9": "32", "UA9WDK/0": "32", @@ -15937,6 +15975,7 @@ "RV3MA/0": "25", "RZ6LL/0": "25", "RZ6MZ/0": "25", + "UA0KBG": "26", "UA1ORT/0": "25", "UA6LP/0": "25", "R01DTV/0": "34", @@ -15945,6 +15984,7 @@ "R150L": "34", "R17CWH": "34", "R195JV": "34", + "R1FW/0": "34", "R20RMP": "34", "R20RRC/0": "34", "R2CC/0": "34", @@ -16077,6 +16117,7 @@ "R4AK/0": "23", "R70ASIA": "23", "R73EPC/P": "23", + "R8CDV/0": "23", "R9OOO/0": "23", "RA/DK2AI/0": "23", "RA/DK2AI/M": "23", @@ -16192,6 +16233,7 @@ "R10RTRS/0": "31", "RA0AM/0": "31", "RA0W": "31", + "RC0W": "31", "RD0W": "31", "RK0W": "31", "RM0W": "31", @@ -16246,7 +16288,6 @@ "UE44Y/9": "32", "UE70Y": "32", "R120RI": "35", - "R1FW/0": "35", "R6MG/0": "35", "R750X": "35", "RD9U/0": "35", @@ -16272,6 +16313,7 @@ "UE23RRC/P": "35", "UE3ATV/0": "35", "UE44V": "35", + "R0UT": "33", "R120RQ": "32", "R16FRA": "32", "R20RCK": "32", @@ -16294,9 +16336,11 @@ "RN9A/0": "32", "RP0UWZ": "32", "RP0UZF": "32", + "RW0UM": "33", "RW0UM/0": "32", "RZ19NY": "32", "UA0DAR/P": "32", + "UA0UV": "33", "UA3AKO/0/M": "32", "UE15UWC": "32", "UE70UVV": "32", @@ -16313,14 +16357,21 @@ "R14CWC/0": "19", "R16KAZ": "18", "R18KDR/0": "19", + "R2DUZ/0": "19", "R2DWG/0": "19", + "R2FCE/9": "18", + "R2ST/9": "18", "R34SP": "40", + "R3DAJ/0": "19", + "R3TIP/0": "19", "R3UBL/9": "18", "R4CDO/9/M": "18", + "R4WBS/9": "18", "RA3TND/0": "19", "RA3TND/9": "18", "RA4AAJ/9": "18", "RC6AR/0": "19", + "RC6N/0": "19", "RD17CW": "19", "RD1AL/0": "40", "RD3ARX/0/P": "19", @@ -16331,13 +16382,17 @@ "RQ17CW": "18", "RQ4D/9": "18", "RU17NY": "18", + "RU3ADA/9": "18", + "RV6LVT/9": "18", "RW1AI/0": "19", + "RW3XD/0": "19", "RX17WG": "19", "RX55YG": "18", "RX80SP": "18", "RY1AAB/0/M": "19", "RY80SP": "19", "UA0ZDA/MM": "29", + "UB4HOO/9": "18", "UB8JDH/0": "19", "UE18U": "18", "UE18Z": "19", @@ -16393,6 +16448,7 @@ "R100MP": "18", "R110RAEM": "18", "R111EK": "18", + "R120RAEM": "18", "R120RW": "18", "R125NSK": "18", "R15CWC/9": "18", @@ -16410,6 +16466,7 @@ "R27OUO": "18", "R2ET/9": "18", "R30SIB": "18", + "R5QA/M": "18", "R7AB/9": "18", "R8OA/9/P": "18", "R8SRR": "18", @@ -16659,6 +16716,7 @@ "R150SU": "16", "R18KDR/4": "16", "R1BIP/9": "16", + "R1LK/4": "16", "R2013CG": "16", "R2015AS": "16", "R2015DS": "16", @@ -17001,6 +17059,7 @@ "UA4PT/0": "18", "UA6BTN/0": "18", "UA9CTT/0": "18", + "UA9CTT/9": "18", "UA9CTT/P": "18", "UA9UAX/9": "18", "UA9WDK/0": "18", @@ -17190,6 +17249,7 @@ "RV3MA/0": "19", "RZ6LL/0": "19", "RZ6MZ/0": "19", + "UA0KBG": "19", "UA1ORT/0": "19", "UA6LP/0": "19", "R01DTV/0": "19", @@ -17198,6 +17258,7 @@ "R150L": "19", "R17CWH": "19", "R195JV": "19", + "R1FW/0": "19", "R20RMP": "19", "R20RRC/0": "19", "R2CC/0": "19", @@ -17330,6 +17391,7 @@ "R4AK/0": "19", "R70ASIA": "19", "R73EPC/P": "19", + "R8CDV/0": "19", "R9OOO/0": "19", "RA/DK2AI/0": "19", "RA/DK2AI/M": "19", @@ -17445,6 +17507,7 @@ "R10RTRS/0": "18", "RA0AM/0": "18", "RA0W": "18", + "RC0W": "18", "RD0W": "18", "RK0W": "18", "RM0W": "18", @@ -17499,7 +17562,6 @@ "UE44Y/9": "23", "UE70Y": "23", "R120RI": "19", - "R1FW/0": "19", "R6MG/0": "19", "R750X": "19", "RD9U/0": "19", @@ -17525,6 +17587,7 @@ "UE23RRC/P": "19", "UE3ATV/0": "19", "UE44V": "19", + "R0UT": "18", "R120RQ": "18", "R16FRA": "18", "R20RCK": "18", @@ -17547,9 +17610,11 @@ "RN9A/0": "18", "RP0UWZ": "18", "RP0UZF": "18", + "RW0UM": "18", "RW0UM/0": "18", "RZ19NY": "18", "UA0DAR/P": "18", + "UA0UV": "18", "UA3AKO/0/M": "18", "UE15UWC": "18", "UE70UVV": "18", @@ -17831,6 +17896,7 @@ "EA6LU/P", "EA6URI/PAZ", "EA6URL/IF", + "EA6XQ/P", "EA7DUT/6", "EA9CI/6", "EA9CP/6", @@ -18047,7 +18113,6 @@ "EA1DAV/8", "EA1EHW/8", "EA1IT/8", - "EA1RCI/P", "EA1YO/8", "EA2EJO/8", "EA2EPY/8", @@ -18090,6 +18155,7 @@ "EB7A/8", "EC1KR/8", "EC2DX/8", + "EC5AHA", "EC7AKV/8", "EC8AFM/LH", "ED4R/8", @@ -19405,8 +19471,7 @@ "worked_modes": {}, "confirmed_modes": {}, "direct": [ - "ET3AA/YOTA", - "VERSION" + "ET3AA/YOTA" ], "prefixITU": {}, "prefixCQ": {}, @@ -20344,6 +20409,7 @@ "R01DTV/6", "R01DTV/7", "R0AAE/6", + "R0AAI/4", "R0AGD/6", "R0AI/3", "R0AI/M", @@ -20351,15 +20417,20 @@ "R0BM/6", "R0CAF/1", "R0CAF/3", + "R0CBK/3", "R0CDP/3", "R0CM/4", + "R0DAD/7", "R0IA/3", "R0IT/6", + "R0QAO/3", "R0QAW/3", "R0RA/7", "R0SBC/6", "R0UAR/6", + "R0UTC/6", "R0WAS/1/P", + "R0WBQ/3", "R0XAC/1", "R0XAD/6/P", "R0XAI/7", @@ -20380,6 +20451,8 @@ "R170SG", "R18ISL", "R18PER", + "R1AT", + "R1CAA", "R1CF/M", "R2014I", "R2014WOG", @@ -20438,7 +20511,6 @@ "R4WAN/P", "R50VAZ", "R5QA/1", - "R5QA/M", "R5QQ/1", "R5VAJ/N", "R65RKP", @@ -20521,6 +20593,7 @@ "R8FF/M", "R8FF/P", "R8FR/4/M", + "R8KBB/7", "R8MB/1", "R8MB/1/P", "R8QAN/4", @@ -20590,6 +20663,7 @@ "R9J/1", "R9JBF/1", "R9JBF/4", + "R9JBH/6", "R9JBH/7", "R9JBN/3/P", "R9JBN/4", @@ -20599,6 +20673,7 @@ "R9JO/6", "R9JQ/6", "R9KC/4/M", + "R9KC/6", "R9KC/6/M", "R9KC/8/M", "R9KD/6", @@ -20619,6 +20694,7 @@ "R9PA/4", "R9SAO/1", "R9UG/3", + "R9UGW/6", "R9UT/4", "R9WGM/6/M", "R9WI/4/P", @@ -20628,6 +20704,7 @@ "R9XC/1", "R9XC/4", "R9XD/6", + "R9XE/3", "R9XT/1", "R9XT/6", "R9XV/6", @@ -20705,9 +20782,12 @@ "RA9DF/6/P", "RA9FAA/4/M", "RA9FBV/1", + "RA9FDR/3", + "RA9FDR/4", "RA9FDR/4/P", "RA9FDR/M", "RA9FEU/M", + "RA9FLR/3", "RA9FNV/1", "RA9FR/4/M", "RA9FR/4/P", @@ -20743,6 +20823,7 @@ "RA9SC/4/P", "RA9SGI/1", "RA9ST/3/P", + "RA9UDK/1", "RA9UEZ/6", "RA9UF/4", "RA9ULL/6", @@ -20766,6 +20847,7 @@ "RA9XY/3", "RA9Y/4", "RA9YA/6", + "RC0XC/3", "RC18SA", "RC1O", "RC1Z", @@ -20782,12 +20864,14 @@ "RC8C/6", "RC8X", "RC9F", + "RC9WD/6", "RC9X", "RC9XM/1", "RC9YA/3/P", "RC9YA/4/M", "RD0L/3", "RD1A/M", + "RD1A/MM", "RD4CBQ/9", "RD4I", "RD80KF", @@ -20860,6 +20944,7 @@ "RL9AA/6", "RL9F", "RL9X", + "RL9Y/4", "RM0F/3", "RM0F/7", "RM0L/1", @@ -20885,6 +20970,7 @@ "RM8X/3", "RM90FA", "RM94AE", + "RM9J/4", "RM9T/4/P", "RM9WN/1", "RM9X", @@ -21096,6 +21182,7 @@ "RU0LM/4", "RU0ZW/3", "RU0ZW/6", + "RU1AC", "RU1ZC/ANT", "RU27FQ", "RU27FW", @@ -21122,6 +21209,7 @@ "RU80OW", "RU80SB", "RU80TO", + "RU8R/6", "RU8X", "RU8X/1", "RU90FA", @@ -21178,7 +21266,9 @@ "RV9LC/6", "RV9LM/3", "RV9LM/3/P", + "RV9MD/3", "RV9MD/4", + "RV9WB/3", "RV9WB/4", "RV9WB/6", "RV9WB/M", @@ -21289,6 +21379,7 @@ "RZ9HG/6", "RZ9HK/3/P", "RZ9HT/6", + "RZ9OL/3", "RZ9OL/3/M", "RZ9OL/3/P", "RZ9ON/6", @@ -21325,6 +21416,7 @@ "UA0KT/4", "UA0LEC/6", "UA0LLM/5", + "UA0LLM/6", "UA0LQQ/6/P", "UA0QBC/3", "UA0QBR/6", @@ -21332,11 +21424,14 @@ "UA0QJA/4", "UA0QJE/3", "UA0QNE/3", + "UA0QNE/6", "UA0QNI/3", "UA0QNU/3", "UA0QNV/3", "UA0QQJ/3", "UA0QQO/3", + "UA0QQX/3", + "UA0QQX/6", "UA0S/4", "UA0SC/4", "UA0SEP/6", @@ -21349,10 +21444,12 @@ "UA0ZED/6", "UA0ZL/6", "UA0ZS/6", + "UA1A", "UA1ADQ/ANT", "UA1BJ/ANT", "UA1CDA/LH", "UA1CIO/LH", + "UA1F", "UA1JJ/ANT", "UA1PAC/1/ANT", "UA1PAC/ANT", @@ -21452,6 +21549,8 @@ "UA9KAS/6", "UA9KAS/6/P", "UA9KB/6", + "UA9KBC/4", + "UA9KBC/6", "UA9KBF/4", "UA9KBF/4/N", "UA9KBF/6", @@ -21491,6 +21590,7 @@ "UA9UAX/7/M", "UA9UDX/1", "UA9VR/6", + "UA9WMN/4", "UA9WQK/6", "UA9XC/1", "UA9XC/6", @@ -21506,7 +21606,9 @@ "UA9XRP/1", "UA9XX/4", "UA9XZ/3", + "UB0ADL/4", "UB0ADL/6", + "UB0AHN/4", "UB0AJJ/3", "UB0AZR/3", "UB0IBA/7", @@ -21523,6 +21625,8 @@ "UB5O/M", "UB8ADI/5", "UB8ADI/6", + "UB8AFZ/3", + "UB8FCO/3", "UB8JAF/3", "UB9YUW/1", "UC0LAF/3", @@ -22327,6 +22431,11 @@ "RP8X": "30", "RU4SS/9": "30", "RU4WA/9": "30", + "R1AT": "19", + "RU1AC": "19", + "UA1A": "19", + "UA1F": "19", + "R1CAA": "19", "R01DTV/1": "19", "R100RK": "19", "R20RTP": "19", @@ -22445,6 +22554,7 @@ "R325Z": "19", "RA9CFH/1": "19", "RA9CFH/1/P": "19", + "RA9UDK/1": "19", "RC1Z": "19", "RJ1Z": "19", "RK21Z": "19", @@ -22713,7 +22823,6 @@ "UA9CGL/M": "30", "UA9CUA/4/M": "30", "UA9UAX/4": "30", - "UB5O/M": "30", "UC8F": "30", "UD8F": "30", "UE16SA": "30", @@ -22806,6 +22915,7 @@ "directCQ": { "R25EMW": "17", "RA3CQ/9/M": "17", + "RD1A/MM": "40", "RG50P": "17", "RG50P/9": "17", "RI0SP": "40", @@ -22880,7 +22990,6 @@ "UA9CGL/M": "17", "UA9CUA/4/M": "17", "UA9UAX/4": "17", - "UB5O/M": "17", "UC8F": "17", "UD8F": "17", "UE16SA": "17", @@ -23251,6 +23360,7 @@ "TO1A", "TO2A", "TO2BC", + "TO2FY", "TO5BR", "TO5G", "TO5NED", @@ -26483,6 +26593,8 @@ "LU6YBK/Y", "LU6YSG/Y", "LU7AA/D", + "LU7AA/GA", + "LU7AA/L", "LU7AA/U", "LU7AC/D", "LU7ADC/D", @@ -26501,6 +26613,7 @@ "LU7CAW/D", "LU7CC/D", "LU7CC/E", + "LU7CGL/D", "LU7CP/D", "LU7DAC/D", "LU7DAF/D", @@ -30777,6 +30890,8 @@ "N6GOZ", "N6IKX", "N6KB", + "N6LTM", + "N6LZL", "N6OM", "N6PJQ", "N6QBK", @@ -30799,7 +30914,6 @@ "N9GFL", "N9PPF", "N9SBL", - "NB6R", "ND1A", "NE7SO", "NH2CC", @@ -30850,6 +30964,7 @@ "W6AKL", "W6CWJ", "W6DSD", + "W6GKL", "W6KCH", "W6KEV", "W6KIT", @@ -31411,7 +31526,8 @@ "4U150ITU", "4U1ITU", "4U1WRC", - "4U2WRC" + "4U2WRC", + "VERSION" ], "prefixITU": {}, "prefixCQ": {}, @@ -31881,6 +31997,7 @@ "RP76KB", "RQ2K", "RT2F", + "RT9K/2", "RT9T/2", "RU2F", "RU3FS/2", @@ -36360,6 +36477,7 @@ "worked_modes": {}, "confirmed_modes": {}, "direct": [ + "8J130TAM/JD", "8N1OGA", "JQ1CJK/P", "JR7ISY/JD1/CM" @@ -36644,6 +36762,7 @@ "KB2TID", "KB2TSM", "KB2VHY", + "KB2VIC", "KB2WKT", "KB2YKJ", "KB3BPK", @@ -42472,6 +42591,7 @@ "GB2AST", "GB2AYR", "GB2BAJ", + "GB2BD", "GB2BHM", "GB2BHS", "GB2BMJ", @@ -43433,6 +43553,7 @@ "EA1RCI/ICA", "EA1RCI/JBN", "EA1RCI/KD", + "EA1RCI/P", "EA1RCI/PAZ", "EA1RCI/PCV", "EA1RCI/RCC", @@ -43493,7 +43614,6 @@ "EA6RC/4", "EA6SK/2", "EA6SK/7", - "EA6XQ/P", "EA7CFU/U", "EA7FC/FCJ", "EA7HZ/F", @@ -46073,9 +46193,11 @@ "KB7VUR", "KB7YNO", "KB7ZEM", + "KB7ZVZ", "KB8JUT", "KB8NRB", "KB8YYA", + "KB9EZX", "KB9KHC", "KB9LHT", "KB9OEC", @@ -46225,6 +46347,7 @@ "KD8LNA", "KD8MDW", "KD8QML", + "KD8WMX", "KD9LE", "KD9Q/M", "KD9TWW", @@ -46617,6 +46740,7 @@ "KH6JJN", "KH6JJN/P", "KH6JJS", + "KH6JKG", "KH6JKL", "KH6JKQ", "KH6JMK", @@ -47190,6 +47314,7 @@ "KL2LN", "KL2LT", "KL2LU", + "KL2LZ", "KL2MA", "KL2MB", "KL2MI", @@ -48349,6 +48474,7 @@ "N7TSV", "N7VWB", "N7VWD", + "N7VYQ", "N7YHF", "N7YPQ", "N7ZHK", @@ -48377,6 +48503,7 @@ "N9VHU", "N9ZP", "NA1AA", + "NB6R", "NC6A", "NC6W", "ND2Y", @@ -48467,6 +48594,7 @@ "NH6HX/4", "NH6HZ", "NH6IH", + "NH6IK", "NH6J", "NH6J/6", "NH6JX", @@ -48763,6 +48891,7 @@ "NL7WJ", "NL7WM", "NL7WY", + "NL7XK", "NL7XM", "NL7XM/B", "NL7XO", @@ -49132,6 +49261,7 @@ "W8WH", "W9AGH", "W9CCC", + "W9CG", "W9EL", "W9HJW", "W9IS", @@ -49171,6 +49301,7 @@ "WB0BNR", "WB0EST", "WB0YUL", + "WB1BR", "WB2AC", "WB3JIC", "WB4LMK", @@ -49422,6 +49553,7 @@ "WH6EKI", "WH6EKV", "WH6EKW", + "WH6ELE", "WH6ELG", "WH6ELM", "WH6EMF", @@ -49443,6 +49575,7 @@ "WH6EUA", "WH6EUH", "WH6EVP", + "WH6EVX", "WH6EWB", "WH6EWC", "WH6EWE", @@ -49459,6 +49592,7 @@ "WH6FEU", "WH6FGK", "WH6FGM", + "WH6FHF", "WH6FIR", "WH6FJR", "WH6FJZ", @@ -51368,6 +51502,7 @@ "KB0UNL": "07", "KB1GC": "07", "KB7ZEM": "07", + "KB9EZX": "07", "KC0GFG": "07", "KC0KWS": "07", "KC0RMR/AT": "07", @@ -51450,6 +51585,7 @@ "KL2BG": "07", "KL2FU": "07", "KL2GR": "07", + "KL2LZ": "07", "KL2NS": "07", "KL2QO": "07", "KL2SX": "07", @@ -51776,6 +51912,7 @@ "NH0H": "08", "NH2H": "08", "NH6IH": "08", + "NH6IK": "08", "NH6XW": "08", "NH6ZB": "08", "NH7FU": "08", @@ -51823,6 +51960,7 @@ "WA1BDA": "08", "WA1WCC/100RCA": "08", "WA1WCC/IMD": "08", + "WB1BR": "08", "WD0FPY/1/LH": "08", "WH0EWX": "08", "WH2B": "08", @@ -53818,6 +53956,7 @@ "WH6FAD": "07", "WH6FGK": "07", "WH6FGM": "07", + "WH6FHF": "07", "WH6FTZ": "07", "WH6FZ/5": "07", "WH6FZN": "07", @@ -54419,6 +54558,7 @@ "WH6EEZ": "06", "WH6EHY": "06", "WH6EKB": "06", + "WH6ELE": "06", "WH6ENG": "06", "WH6EUH": "06", "WH6EZW": "06", @@ -54715,6 +54855,7 @@ "KB7QEE": "06", "KB7RQP": "06", "KB7VUR": "06", + "KB7ZVZ": "06", "KB8YYA": "06", "KB9LHT": "06", "KC0ZER": "06", @@ -54832,6 +54973,7 @@ "KH6JIM": "06", "KH6JIM/7": "06", "KH6JJS": "06", + "KH6JKG": "06", "KH6JKL": "06", "KH6JMK": "06", "KH6JPJ": "06", @@ -55353,6 +55495,7 @@ "N7TOF": "06", "N7VWB": "06", "N7VWD": "06", + "N7VYQ": "06", "N7YHF": "06", "N7YPQ": "06", "N7ZHK": "06", @@ -55361,6 +55504,7 @@ "N9CRQ": "06", "N9QPQ/M": "06", "NA1AA": "06", + "NB6R": "06", "NG1T": "06", "NH0AD": "06", "NH0F": "06", @@ -55596,6 +55740,7 @@ "WH6EQH": "06", "WH6ESS": "06", "WH6ETO": "06", + "WH6EVX": "06", "WH6EWC": "06", "WH6EWE": "06", "WH6FCT": "06", @@ -55796,6 +55941,7 @@ "KC8DXI": "08", "KC8NMN": "08", "KD8CG/LH": "08", + "KD8WMX": "08", "KE6VNI": "08", "KH6BZF/8": "08", "KH6DHK": "08", @@ -56038,6 +56184,7 @@ "NP4ZI": "08", "NW9F": "08", "W3ED": "08", + "W9CG": "08", "W9EL": "08", "W9HJW": "08", "W9IS": "08", @@ -56230,6 +56377,7 @@ "NH7RE": "08", "NL7HH": "08", "NL7OE": "08", + "NL7XK": "08", "NL7YU": "08", "NP2KS": "08", "NP2PC": "08", @@ -56404,6 +56552,7 @@ "KB0UNL": "04", "KB1GC": "04", "KB7ZEM": "04", + "KB9EZX": "04", "KC0GFG": "04", "KC0KWS": "04", "KC0RMR/AT": "04", @@ -56486,6 +56635,7 @@ "KL2BG": "04", "KL2FU": "04", "KL2GR": "04", + "KL2LZ": "04", "KL2NS": "04", "KL2QO": "04", "KL2SX": "04", @@ -56812,6 +56962,7 @@ "NH0H": "05", "NH2H": "05", "NH6IH": "05", + "NH6IK": "05", "NH6XW": "05", "NH6ZB": "05", "NH7FU": "05", @@ -56859,6 +57010,7 @@ "WA1BDA": "05", "WA1WCC/100RCA": "05", "WA1WCC/IMD": "05", + "WB1BR": "05", "WD0FPY/1/LH": "05", "WH0EWX": "05", "WH2B": "05", @@ -58854,6 +59006,7 @@ "WH6FAD": "04", "WH6FGK": "04", "WH6FGM": "04", + "WH6FHF": "04", "WH6FTZ": "04", "WH6FZ/5": "04", "WH6FZN": "04", @@ -59455,6 +59608,7 @@ "WH6EEZ": "03", "WH6EHY": "03", "WH6EKB": "03", + "WH6ELE": "03", "WH6ENG": "03", "WH6EUH": "03", "WH6EZW": "03", @@ -59751,6 +59905,7 @@ "KB7QEE": "03", "KB7RQP": "03", "KB7VUR": "03", + "KB7ZVZ": "03", "KB8YYA": "03", "KB9LHT": "03", "KC0ZER": "03", @@ -59868,6 +60023,7 @@ "KH6JIM": "03", "KH6JIM/7": "03", "KH6JJS": "03", + "KH6JKG": "03", "KH6JKL": "03", "KH6JMK": "03", "KH6JPJ": "03", @@ -60389,6 +60545,7 @@ "N7TOF": "03", "N7VWB": "03", "N7VWD": "03", + "N7VYQ": "03", "N7YHF": "03", "N7YPQ": "03", "N7ZHK": "03", @@ -60397,6 +60554,7 @@ "N9CRQ": "03", "N9QPQ/M": "03", "NA1AA": "03", + "NB6R": "03", "NG1T": "03", "NH0AD": "03", "NH0F": "03", @@ -60632,6 +60790,7 @@ "WH6EQH": "03", "WH6ESS": "03", "WH6ETO": "03", + "WH6EVX": "03", "WH6EWC": "03", "WH6EWE": "03", "WH6FCT": "03", @@ -60832,6 +60991,7 @@ "KC8DXI": "04", "KC8NMN": "04", "KD8CG/LH": "04", + "KD8WMX": "04", "KE6VNI": "04", "KH6BZF/8": "04", "KH6DHK": "04", @@ -61074,6 +61234,7 @@ "NP4ZI": "04", "NW9F": "04", "W3ED": "04", + "W9CG": "04", "W9EL": "04", "W9HJW": "04", "W9IS": "04", @@ -61266,6 +61427,7 @@ "NH7RE": "04", "NL7HH": "04", "NL7OE": "04", + "NL7XK": "04", "NL7YU": "04", "NP2KS": "04", "NP2PC": "04", @@ -70744,6 +70906,7 @@ "confirmed_modes": {}, "direct": [ "K4CY/M", + "K4CY/P", "YI1IRQ/ND" ], "prefixITU": {}, @@ -72660,6 +72823,15 @@ "A60WARD/7", "A60WARD/8", "A60WARD/9", + "A60WRC/0", + "A60WRC/1", + "A60WRC/2", + "A60WRC/3", + "A60WRC/4", + "A60WRC/5", + "A60WRC/7", + "A60WRC/8", + "A60WRC/9", "A60WSW/1", "A60WSW/2", "A60WSW/3", @@ -76060,7 +76232,9 @@ "direct": [ "7O/DL7ZM", "7O2A", + "7O2WX", "7O6T", + "7O73T", "7O8AD", "7O8AE" ], @@ -76069,14 +76243,18 @@ "directITU": { "7O/DL7ZM": "48", "7O2A": "48", + "7O2WX": "48", "7O6T": "48", + "7O73T": "48", "7O8AD": "48", "7O8AE": "48" }, "directCQ": { "7O/DL7ZM": "37", "7O2A": "37", + "7O2WX": "37", "7O6T": "37", + "7O73T": "37", "7O8AD": "37", "7O8AE": "37" } @@ -76603,6 +76781,7 @@ "FO/AC4LN/M", "FO/DJ7RJ", "FO/DL5XU", + "FO/F5JRX", "FO/F6BFH/P", "FO/F6COW", "FO/F6EPY", diff --git a/package.nw/gt_chat.html b/package.nw/gt_chat.html index bfd50f3..8492033 100644 --- a/package.nw/gt_chat.html +++ b/package.nw/gt_chat.html @@ -76,14 +76,25 @@ wrapperDiv.style.display = "block"; } + document.addEventListener("keydown", handleEnter, false); document.addEventListener("keyup", handleKey, false); + function handleEnter(event) + { + if (event.key == "Enter") + { + event.preventDefault(); + return false; + } + return true; + } + function handleKey(event) { if (event.key == "Enter") { // Do work - var msg = messageInput.value.replace(/[\n\r]/g, ''); + var msg = messageInput.value.trim(); if (msg.length > 0 && g_currentId != 0 && g_currentId in window.opener.GT.gtFlagPins && window.opener.GT.gtFlagPins[g_currentId].canmsg == true) { var worker = ""; @@ -673,7 +684,7 @@
- +
diff --git a/package.nw/gt_roster.html b/package.nw/gt_roster.html index 3a14a40..3725d7a 100644 --- a/package.nw/gt_roster.html +++ b/package.nw/gt_roster.html @@ -44,17 +44,432 @@ +
+
+ +
+
+ + + + + +
+
+
+ + + + + + + +
Animate 'CQ GT'
+ +
+
+
+ + + + + + + +
Window Always On Top
+ +
+
+
+ + + + + + + + + + +
Roster Max Age
2m 0s
+ +
+
+
+
+ + + + + + + +
Clear Roster on Band change
+ +
+
+
+ + + + + + + + + + + +
Decode Delay On Focus
+ +
+ +
+
+
+
Compact Mode
+
+
+
+
+
+ + + + + + + + + + +
Window Filters
+
+ + + + + + + + + + +
Brightness
+ +
+
+
+ + + + + + + + + + +
Contrast
+ +
+
+
+ + + + + + + + + + +
Saturate
+ +
+
+
+
+ + + + + + + + + + +
Invert
+ +
+
+
+ + + + + + + + + + +
Sepia
+ +
+
+
+ + + + + + + + + + +
Hue Rotate
+ +
+
+
+
+
Reset Filters + (Ctrl-R)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeRegexInputStart
Date
UTCEnd
Date
UTCAuto
Delete
ClearSave
+ + + + + + + + + + + + + + + + + + 🛑
+
+
+
+
+
+
+ + +
+ +
+ + +

+ + +

+ +
+ + + -24 +

+ +

+ +
+ + + .5 +

+ +

+
+ + + 400 +

+ +

+
+ + + 3500 +

+ +

+
+ + + 3 +

+ + +

+
+ + +
+
+ + +
+
+
+
+
+
+
+ Entity  + + +
+ CQ "" + From + +
+ + + + + +
+
+
+
+
+
+
+
-
+
Waiting…
-
Halt Tx
+
Halt Tx
+
+
-
+
+
+ +
@@ -106,7 +521,7 @@ -
@@ -150,8 +565,7 @@

Wanted

- -
+
@@ -180,8 +594,6 @@
-
-
@@ -207,207 +619,34 @@
- - - - + +
- -
-

Exceptions

-
+
+

Exceptions

+
- +
- -
- - -
- -
- - - - -24 -
- -
- - - - .5 -
- -
- - - - 400 -
- -
- - - - - 3500 -
- -
- - - - - 3 -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
-
- - -
- -
- - - -
- -
- - - -
- -
- - - - + +
+
+ +
-
+
More
+ +
+
@@ -419,221 +658,8 @@
- + - -
-
- - - - - - - -
Window Always On Top
- -
-
-
- - - - - - - - - - -
Call Roster Max Age
2m 0s
- -
-
-
- - - - - - - -
Clear Call Roster on Band change
- -
-
-
-
-
-
- - - - - - - - - - - -
Call Roster Decode Delay On Focus
- -
- -
-
-
-
- - - - - - - - - - -
Window Filters
-
- - - - - - - - - - -
Brightness
- -
-
-
- - - - - - - - - - -
Contrast
- -
-
-
- - - - - - - - - - -
Saturate
- -
-
-
-
- - - - - - - - - - -
Invert
- -
-
-
- - - - - - - - - - -
Sepia
- -
-
-
- - - - - - - - - - -
Hue Rotate
- -
-
-
-
-
Reset Filters (Ctrl-R)
-
-
-
-
- -
-
diff --git a/package.nw/gt_update.odt b/package.nw/gt_update.odt index c75b633..98e67e3 100644 Binary files a/package.nw/gt_update.odt and b/package.nw/gt_update.odt differ diff --git a/package.nw/gt_update.pdf b/package.nw/gt_update.pdf index 587956d..266cfbb 100644 Binary files a/package.nw/gt_update.pdf and b/package.nw/gt_update.pdf differ diff --git a/package.nw/i18n/cn-t.json b/package.nw/i18n/cn-t.json index d97b971..d1ecf53 100644 --- a/package.nw/i18n/cn-t.json +++ b/package.nw/i18n/cn-t.json @@ -165,6 +165,7 @@ "settings.Logging.label": "日志記錄", "settings.Alerts.label": "警報", "settings.CallRoster.label": "呼叫清單", + "settings.Columns.label": "表格列", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding", "settings.OAMS.simplepush.apikey.label": "Simplepush API Key", @@ -436,7 +437,7 @@ "settings.alerts.CustomAlerts.new.repeat.exit": "直到退出", "settings.alerts.CustomAlerts.new.repeat.once": "一次", "settings.alerts.CustomAlerts.new.repeat.never": "從不", - "settings.alerts.CustomAlerts.new.addButton": "增加", + "settings.alerts.CustomAlerts.new.addButton": "添加", "settings.OAMS.message.enable.label": "啟用消息傳遞", "settings.OAMS.message.enable.hover": "啟用消息傳遞", "settings.OAMS.spotting.enable.label": "啟用定位", @@ -506,7 +507,7 @@ "lookup.title": "呼號信息查詢", "lookup.callsign.label": "呼號:", "lookup.callsign.button": "尋找", - "lookup.noinfo": "沒有要顯示的呼號信息
請嘗試其他呼號尋找!", + "lookup.noinfo": "沒有要顯示的呼號信息 請嘗試其他呼號尋找!", "COMMENT_gt_popup.html": "", "popup.title": "數據突破", "COMMENT_gt_roster.html": "", @@ -561,7 +562,7 @@ "roster.secondary.wanted.marathon": "Marathon", "roster.secondary.wanted.county": "縣", "roster.secondary.wanted cont": "續", - "roster.secondary.exceptions.label": "例外情況", + "roster.exceptions.label": "例外情況", "roster.secondary.exceptions.cqOnly": "僅限CQ", "roster.secondary.exceptions.hasGrid": "有網格", "roster.secondary.exceptions.minDB": "最小dB", @@ -584,8 +585,10 @@ "roster.secondary.excpetions.regex.label": "正則表達式", "roster.secondary.exceptions.regex.hover": "調用符號正則表達式", "roster.secondary.instances.label": "實例", - "roster.ignoresTable.title": "呼號, 忽略CQ和DXCC", - "roster.ignoresTable.close": "關閉", + "roster.ignores.label": "忽視", + "roster.close": "關閉", + "roster.watcher.label": "觀察者", + "roster.add.watcher.label": "添加觀察者", "COMMENT_gt_stats.html": "", "stats.title": "日志數據統計", "stats.tabs.logbook": "日志", @@ -1012,6 +1015,7 @@ "roster.menu.IgnoreCall": "忽視呼號", "roster.menu.Realtime": "實時", "roster.menu.MoveLeft": "列向左移動", + "roster.menu.MoveRight": "列向右移動", "roster.menu.ClearCallIgnore": "清除忽視呼號", "roster.menu.ClearIgnore": "清除忽視", "roster.menu.ClearCQFromDXCC": "清除來自 DXCC 的 CQ", diff --git a/package.nw/i18n/cn.json b/package.nw/i18n/cn.json index c127bd8..aa93a68 100644 --- a/package.nw/i18n/cn.json +++ b/package.nw/i18n/cn.json @@ -165,6 +165,7 @@ "settings.Logging.label": "日志记录", "settings.Alerts.label": "警报", "settings.CallRoster.label": "呼叫列表", + "settings.Columns.label": "表格列", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding", "settings.OAMS.simplepush.apikey.label": "Simplepush API Key", @@ -436,7 +437,7 @@ "settings.alerts.CustomAlerts.new.repeat.exit": "直到退出", "settings.alerts.CustomAlerts.new.repeat.once": "一次", "settings.alerts.CustomAlerts.new.repeat.never": "从不", - "settings.alerts.CustomAlerts.new.addButton": "增加", + "settings.alerts.CustomAlerts.new.addButton": "添加", "settings.OAMS.message.enable.label": "启用消息传递", "settings.OAMS.message.enable.hover": "启用消息传递", "settings.OAMS.spotting.enable.label": "启用定位", @@ -506,7 +507,7 @@ "lookup.title": "呼号信息查询", "lookup.callsign.label": "呼号:", "lookup.callsign.button": "查找", - "lookup.noinfo": "没有要显示的呼号信息
请尝试其他呼号查找!", + "lookup.noinfo": "没有要显示的呼号信息 请尝试其他呼号查找!", "COMMENT_gt_popup.html": "", "popup.title": "数据突破", "COMMENT_gt_roster.html": "", @@ -561,7 +562,7 @@ "roster.secondary.wanted.marathon": "马拉松", "roster.secondary.wanted.county": "县", "roster.secondary.wanted cont": "续", - "roster.secondary.exceptions.label": "例外情况", + "roster.exceptions.label": "例外情况", "roster.secondary.exceptions.cqOnly": "仅限CQ", "roster.secondary.exceptions.hasGrid": "有网格", "roster.secondary.exceptions.minDB": "最小dB", @@ -584,8 +585,10 @@ "roster.secondary.excpetions.regex.label": "正则表达式", "roster.secondary.exceptions.regex.hover": "调用符号正则表达式", "roster.secondary.instances.label": "实例", - "roster.ignoresTable.title": "呼号, 忽略CQ和DXCC", - "roster.ignoresTable.close": "关闭", + "roster.ignores.label": "忽視", + "roster.close": "关闭", + "roster.watcher.label": "观察者", + "roster.add.watcher.label": "添加观察者", "COMMENT_gt_stats.html": "", "stats.title": "日志数据统计", "stats.tabs.logbook": "日志", @@ -1012,6 +1015,7 @@ "roster.menu.IgnoreCall": "忽略呼叫", "roster.menu.Realtime": "实时", "roster.menu.MoveLeft": "向左移动列", + "roster.menu.MoveRight": "向右移动列", "roster.menu.ClearCallIgnore": "清除已忽略的呼叫", "roster.menu.ClearIgnore": "清除忽略", "roster.menu.ClearCQFromDXCC": "从DXCC中清除CQ", diff --git a/package.nw/i18n/de.json b/package.nw/i18n/de.json index b011bdf..a8d60ca 100644 --- a/package.nw/i18n/de.json +++ b/package.nw/i18n/de.json @@ -46,7 +46,7 @@ "bandActivity.hover": "PSK-Reporter Band-Aktivität", "quickStats.hover": "Statistik", "quickStats.CallRX.hover": "Gehörte Rufzeichen", - "quickStats.CallRX.label": "Rx Rufzeichen", + "quickStats.CallRX.label": "Rx Calls", "quickStats.QSO.hover": "Gearbeitete Stationen", "quickStats.QSO.label": "QSO", "quickStats.DXCCRx.hover": "Gehörte DXCCs", @@ -54,9 +54,9 @@ "quickStats.QSL.hover": "QSL Liste", "quickStats.QSL.label": "QSL", "quickLoad.clearLive.hover": "GridTracker's Live-Daten zurücksetzen", - "quickLoad.clearLive.label": "Live zurücksetzen", + "quickLoad.clearLive.label": "Live löschen", "quickLoad.clearLog.hover": "Log-Daten zurücksetzen (löscht keine Dateien)", - "quickLoad.clearLog.label": "Log zurücksetzen", + "quickLoad.clearLog.label": "Log löschen", "quickLoad.loadLog.label": "Log laden", "mapFilter.title.hover": "Kartenansicht-Einstellungen", "mapFilter.title.label": "Kartenansicht-Filter", @@ -165,6 +165,7 @@ "settings.Logging.label": "Logging", "settings.Alerts.label": "Alarme", "settings.CallRoster.label": "Rufzeichenliste", + "settings.Columns.label": "Spalten", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Simplepush Nachrichtenweiterleitung", "settings.OAMS.simplepush.apikey.label": "Simplepush API Key", @@ -560,7 +561,7 @@ "roster.secondary.wanted.marathon": "Marathon", "roster.secondary.wanted.county": "Kreis", "roster.secondary.wanted.cont": "Kont", - "roster.secondary.exceptions.label": "Filter", + "roster.exceptions.label": "Filter", "roster.secondary.exceptions.cqOnly": "Nur CQ", "roster.secondary.exceptions.hasGrid": "Nur mit Locator", "roster.secondary.exceptions.minDB": "Min dB", @@ -573,7 +574,7 @@ "roster.secondary.exceptions.onlyMyDXCC": "Nur mein DXCC", "roster.secondary.exceptions.useseQSL":" Benutzt eQSL", "roster.secondary.exceptions.usesOQRS": "Benutzt OQRS", - "roster.secondary.exceptions.allOnlyNew": "Nur neue Rufzeichen", + "roster.secondary.exceptions.allOnlyNew": "Nur neue Calls", "roster.secondary.exceptions.wantRRCQ": "RR73 als CQ", "roster.secondary.exceptions.noUnknownDXCC": "Keine unbekannten DXCC", "roster.secondary.exceptions.noMsg.label": "Keine", @@ -583,8 +584,10 @@ "roster.secondary.exceptions.regex.label": "Regex", "roster.secondary.exceptions.regex.hover": "Rufzeichen RegEx", "roster.secondary.instances.label": "Instanzen", - "roster.ignoresTable.title": "Rufzeichen, CQ and DXCC Ausnahmen", - "roster.ignoresTable.close": "Schliessen", + "roster.ignores.label": "Ignoriert", + "roster.close": "Schliessen", + "roster.watcher.label": "Beobachten", + "roster.add.watcher.label": "Beobachter hinzufügen", "COMMENT_gt_stats.html": "", "stats.title": "Statistiken", "stats.tabs.logbook": "Logbücher", @@ -1027,15 +1030,18 @@ "roster.ignore.DXCCs": "DXCCs", "roster.ignore.CQZones": "CQ-Zonen", "roster.ignore.ITUZones": "ITU-Zonen", + "roster.menu.Settings": "Einstellungen", "roster.menu.HideControls": "Einstellungen ausblenden", "roster.menu.ShowControls": "Einstellungen anzeigen", "roster.menu.CompactMode": "Kompaktmodus", "roster.menu.RosterMode": "Rostermodus", "roster.menu.Lookup": "Nachschlagen", "roster.menu.GenMesg": "WSJT-X befüllen", + "roster.menu.AimRotator": "Rotor ausrichten", "roster.menu.IgnoreCall": "Rufzeichen ignorieren", "roster.menu.Realtime": "Echtzeit", "roster.menu.MoveLeft": "Spalte nach links verschieben", + "roster.menu.MoveRight": "Spalte nach rechts verschieben", "roster.menu.ClearCallIgnore": "Ignorierte Rufzeichen aufheben", "roster.menu.ClearIgnore": "Ignorierte aufheben", "roster.menu.ClearCQFromDXCC": "CQ von DXCC aufheben", diff --git a/package.nw/i18n/en.json b/package.nw/i18n/en.json index 655b0da..ba3f587 100644 --- a/package.nw/i18n/en.json +++ b/package.nw/i18n/en.json @@ -164,6 +164,7 @@ "settings.Logging.label": "Logging", "settings.Alerts.label": "Alerts", "settings.CallRoster.label": "Call Roster", + "settings.Columns.label": "Columns", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Simplepush.io Message Forwarding", "settings.OAMS.simplepush.apikey.label": "Simplepush API Key", @@ -373,7 +374,7 @@ "settings.logging.pstrotator.details.Port": "UDP Port", "settings.callroster.AlwaysOnTop.label": "Window Always On Top", "settings.callroster.AlwaysOnTop.hover": "Keep Call Roster Above Other Windows", - "settings.callroster.MaxAge.label": "Call Roster Max Age", + "settings.callroster.MaxAge.label": "Roster Max Age", "settings.callroster.MultiRig.label": "On QSO Reply", "settings.callroster.MultiRig.HaltTx.label": "Halt Tx On All Other Instances", "settings.callroster.MultiRig.SwitchView.label": "Switch View to Transmitting Instance", @@ -505,7 +506,7 @@ "lookup.title": "Callsign Lookup", "lookup.callsign.label": "Callsign", "lookup.callsign.button": "Lookup", - "lookup.noinfo": "No Callsign information to display
try a lookup!", + "lookup.noinfo": "No Callsign information to display, try a lookup!", "COMMENT_gt_popup.html": "", "popup.title": "Data Breakout", "COMMENT_gt_roster.html": "", @@ -561,7 +562,7 @@ "roster.secondary.wanted.marathon": "Marathon", "roster.secondary.wanted.county": "County", "roster.secondary.wanted.cont": "Continent", - "roster.secondary.exceptions.label": "Exceptions", + "roster.exceptions.label": "Exceptions", "roster.secondary.exceptions.cqOnly": "CQ Only", "roster.secondary.exceptions.hasGrid": "Has Grid", "roster.secondary.exceptions.minDB": "Min dB", @@ -584,8 +585,10 @@ "roster.secondary.exceptions.regex.label": "Regex", "roster.secondary.exceptions.regex.hover": "Callsign Regular Expression", "roster.secondary.instances.label": "Instances", - "roster.ignoresTable.title": "Callsign, CQ and DXCC Ignores", - "roster.ignoresTable.close": "Close", + "roster.ignores.label": "Ignores", + "roster.close": "Close", + "roster.watcher.label": "Watcher", + "roster.add.watcher.label": "Add Watcher", "COMMENT_gt_stats.html": "", "stats.title": "Statistics", "stats.tabs.logbook": "Logbook", @@ -1013,6 +1016,7 @@ "roster.menu.IgnoreCall": "Ignore Call", "roster.menu.Realtime": "Realtime", "roster.menu.MoveLeft": "Move Column Left", + "roster.menu.MoveRight": "Move Column Right", "roster.menu.ClearCallIgnore": "Clear Call Ignore", "roster.menu.ClearIgnore": "Clear Ignore", "roster.menu.ClearCQFromDXCC": "Clear CQ from DXCC", diff --git a/package.nw/i18n/es.json b/package.nw/i18n/es.json index 624ff8b..a79b481 100644 --- a/package.nw/i18n/es.json +++ b/package.nw/i18n/es.json @@ -164,6 +164,7 @@ "settings.Logging.label": "Registros", "settings.Alerts.label": "Alertas", "settings.CallRoster.label": "Lista de llamadas", + "settings.Columns.label": "Columnas", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Reenvío mensajes Simplepush.io", "settings.OAMS.simplepush.apikey.label": "Llave de API Simplepush", @@ -504,7 +505,7 @@ "lookup.title": "Búsqueda de Indicativo", "lookup.callsign.label": "Indicativo", "lookup.callsign.button": "Buscar", - "lookup.noinfo": "No hay información de indicativo para mostrar
intente una búsqueda", + "lookup.noinfo": "No hay información de indicativo para mostrar, intente una búsqueda", "COMMENT_gt_popup.html": "", "popup.title": "Desglose de Datos", "COMMENT_gt_roster.html": "", @@ -560,7 +561,7 @@ "roster.secondary.wanted.marathon": "Maratón", "roster.secondary.wanted.county": "Condado", "roster.secondary.wanted.cont": "Continente", - "roster.secondary.exceptions.label": "Excepciones", + "roster.exceptions.label": "Excepciones", "roster.secondary.exceptions.cqOnly": "Solo CQ", "roster.secondary.exceptions.hasGrid": "Tiene Grid", "roster.secondary.exceptions.minDB": "dB Mínimo", @@ -583,8 +584,10 @@ "roster.secondary.exceptions.regex.label": "Regex", "roster.secondary.exceptions.regex.hover": "Expresión Regular de Indicativo", "roster.secondary.instances.label": "Instancias", - "roster.ignoresTable.title": "Ignorar Indicativos de Llamada, CQ y DXCC", - "roster.ignoresTable.close": "Cerrar", + "roster.ignores.label": "Ignorar", + "roster.close": "Cerrar", + "roster.watcher.label": "Observador", + "roster.add.watcher.label": "Agregar observador", "COMMENT_gt_stats.html": "", "stats.title": "Estadísticas", "stats.tabs.logbook": "Libro de Guardia", @@ -1007,7 +1010,8 @@ "roster.menu.AimRotator": "Apuntar Rotador", "roster.menu.IgnoreCall": "Ignorar Llamada", "roster.menu.Realtime": "En Vivo", - "roster.menu.MoveLeft": "Mover Columna a la Izquierda", + "roster.menu.MoveLeft": "Mover Columna a la izquierda", + "roster.menu.MoveRight": "Mover Columna a la derecha", "roster.menu.ClearCallIgnore": "Borrar Ignorar Llamada", "roster.menu.ClearIgnore": "Borrar Ignorar", "roster.menu.ClearCQFromDXCC": "Borrar CQ de DXCC", diff --git a/package.nw/i18n/fr.json b/package.nw/i18n/fr.json index 27635f4..145b45a 100644 --- a/package.nw/i18n/fr.json +++ b/package.nw/i18n/fr.json @@ -164,6 +164,7 @@ "settings.Logging.label": "Enregistrement", "settings.Alerts.label": "Alertes", "settings.CallRoster.label": "Liste des appels", + "settings.Columns.label": "Colonnes", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Transfert de messages Simplepush.io", "settings.OAMS.simplepush.apikey.label": "Clé API Simplepush", @@ -505,7 +506,7 @@ "lookup.title": "Recherche d'un indicatif", "lookup.callsign.label": "Indicatif", "lookup.callsign.button": "Consulter", - "lookup.noinfo": "Pas d'information sur l'indicatif à afficher
essayez une recherche !", + "lookup.noinfo": "Pas d'information sur l'indicatif à afficher, essayez une recherche !", "COMMENT_gt_popup.html": "", "popup.title": "Répartition des données", "COMMENT_gt_roster.html": "", @@ -561,7 +562,7 @@ "roster.secondary.wanted.marathon": "Marathon", "roster.secondary.wanted.county": "Pays", "roster.secondary.wanted.cont": "Continent", - "roster.secondary.exceptions.label": "Exceptions", + "roster.exceptions.label": "Exceptions", "roster.secondary.exceptions.cqOnly": "CQ uniquement", "roster.secondary.exceptions.hasGrid": "Dispose d'une grille", "roster.secondary.exceptions.minDB": "Min dB", @@ -584,8 +585,10 @@ "roster.secondary.exceptions.regex.label": "Filtre", "roster.secondary.exceptions.regex.hover": "Recherche indicatifs (même partielle)", "roster.secondary.instances.label": "Instances", - "roster.ignoresTable.title": "Ignorer les indicatifs, les CQ et les DXCC", - "roster.ignoresTable.close": "Fermer", + "roster.ignores.label": "Ignorer", + "roster.close": "Fermer", + "roster.watcher.label": "Observateur", + "roster.add.watcher.label": "Ajouter observateur", "COMMENT_gt_stats.html": "", "stats.title": "Statistiques", "stats.tabs.logbook": "Journal de bord", @@ -1013,6 +1016,7 @@ "roster.menu.IgnoreCall": "Ignorer l'appel", "roster.menu.Realtime": "Temps réel", "roster.menu.MoveLeft": "Déplacer la colonne vers la gauche", + "roster.menu.MoveRight": "Déplacer la colonne vers la droite", "roster.menu.ClearCallIgnore": "Effacer l'appel Ignorer", "roster.menu.ClearIgnore": "Effacer Ignorer", "roster.menu.ClearCQFromDXCC": "Effacer le CQ du DXCC", diff --git a/package.nw/i18n/it.json b/package.nw/i18n/it.json index 7ea5e99..2417cb1 100644 --- a/package.nw/i18n/it.json +++ b/package.nw/i18n/it.json @@ -164,6 +164,7 @@ "settings.Logging.label": "Registrazione", "settings.Alerts.label": "Allarmi", "settings.CallRoster.label": "Elenco delle chiamate", + "settings.Columns.label": "Colonne", "settings.OAMS.label": "OAMS", "settings.OAMS.simplepush.enable.label": "Trasferimento di messaggi con Simplepush.io", "settings.OAMS.simplepush.apikey.label": "Chiave API Simplepush", @@ -505,7 +506,7 @@ "lookup.title": "Cerca un nominativo", "lookup.callsign.label": "Nominativo", "lookup.callsign.button": "Consultare", - "lookup.noinfo": "Non ci sono informazioni sul nominativo da visualizzare
prova a fare una ricerca!", + "lookup.noinfo": "Non ci sono informazioni sul nominativo da visualizzare, prova a fare una ricerca!", "COMMENT_gt_popup.html": "", "popup.title": "Distribuzione dei dati", "COMMENT_gt_roster.html": "", @@ -561,7 +562,7 @@ "roster.secondary.wanted.marathon": "Marathon", "roster.secondary.wanted.county": "Paese", "roster.secondary.wanted.cont": "Continente", - "roster.secondary.exceptions.label": "Eccezioni", + "roster.exceptions.label": "Eccezioni", "roster.secondary.exceptions.cqOnly": "Solo CQ", "roster.secondary.exceptions.hasGrid": "Ha una griglia", "roster.secondary.exceptions.minDB": "Min dB", @@ -584,8 +585,10 @@ "roster.secondary.exceptions.regex.label": "Filtro", "roster.secondary.exceptions.regex.hover": "Ricerca nominativo (anche parziale)", "roster.secondary.instances.label": "Enti", - "roster.ignoresTable.title": "Ignorare i nominativi, i CQ e i DXCC", - "roster.ignoresTable.close": "Chiudere", + "roster.ignores.label": "Ignorare", + "roster.close": "Chiudere", + "roster.watcher.label": "Osservatore", + "roster.add.watcher.label": "Aggiungi Osservatore", "COMMENT_gt_stats.html": "", "stats.title": "Statistiche", "stats.tabs.logbook": "Diario di bordo", @@ -1013,6 +1016,7 @@ "roster.menu.IgnoreCall": "Ignorare la chiamata", "roster.menu.Realtime": "Tempo reale", "roster.menu.MoveLeft": "Spostare la colonna a sinistra", + "roster.menu.MoveRight": "Sposta la colonna a destra", "roster.menu.ClearCallIgnore": "Eliminare la chiamata Ignorare", "roster.menu.ClearIgnore": "Elimina Ignora", "roster.menu.ClearCQFromDXCC": "Cancellare CQ da DXCC", diff --git a/package.nw/img/pota_icon_active.png b/package.nw/img/pota_icon_active.png deleted file mode 100644 index a952f4d..0000000 Binary files a/package.nw/img/pota_icon_active.png and /dev/null differ diff --git a/package.nw/img/pota_icon_inactive.png b/package.nw/img/pota_icon_inactive.png deleted file mode 100644 index 6c228c7..0000000 Binary files a/package.nw/img/pota_icon_inactive.png and /dev/null differ diff --git a/package.nw/lib/defaults.js b/package.nw/lib/defaults.js index f2c25d9..3f15ed8 100644 --- a/package.nw/lib/defaults.js +++ b/package.nw/lib/defaults.js @@ -9,8 +9,11 @@ var validSettings = [ "awardTracker", "bandActivity", "blockedCQ", + "ignoredCQ", "blockedCalls", "blockedDxcc", + "blockedCQz", + "blockedITUz", "callsignLookups", "classicAlerts", "classicAlertsVersion", diff --git a/package.nw/lib/gt.js b/package.nw/lib/gt.js index 745ddc9..1f4196d 100644 --- a/package.nw/lib/gt.js +++ b/package.nw/lib/gt.js @@ -7,6 +7,7 @@ var gtVersionStr = pjson.version var gtVersion = parseInt(gtVersionStr.replace(/\./g, "")); var gtBeta = pjson.betaVersion; +GT.startingUp = true; // var GT is in screen.js GT.startVersion = 0; @@ -15,8 +16,14 @@ if (typeof localStorage.currentVersion != "undefined") GT.startVersion = parseInt(localStorage.currentVersion); } +GT.firstRun = false; + if (typeof localStorage.currentVersion == "undefined" || localStorage.currentVersion != String(gtVersion)) { + if (typeof localStorage.currentVersion == "undefined") + { + GT.firstRun = true; + } localStorage.currentVersion = String(gtVersion); } @@ -48,13 +55,18 @@ if (GT.platform.indexOf("darwin") > -1) const gui = require("nw.gui"); const win = gui.Window.get(); - +if (GT.firstRun) +{ + win.moveTo(2, 2); +} GT.developerMode = process.versions["nw-flavor"] == "sdk"; GT.popupWindowHandle = null; GT.callRosterWindowHandle = null; GT.conditionsWindowHandle = null; +GT.conditionsWindowInitialized = false; GT.chatWindowHandle = null; +GT.chatWindowInitialized = false; GT.statsWindowHandle = null; GT.lookupWindowHandle = null; GT.lookupWindowInitialized = false; @@ -455,6 +467,7 @@ GT.directCallToITUzone = {}; GT.prefixToCQzone = {}; GT.prefixToITUzone = {}; GT.dxccToAltName = {}; +GT.altNameToDXCC = {}; GT.dxccToADIFName = {}; GT.gridToDXCC = {}; @@ -552,17 +565,17 @@ GT.pskColors["2200m"] = "FF4500"; GT.pskColors["630m"] = "1E90FF"; GT.pskColors["160m"] = "7CFC00"; GT.pskColors["80m"] = "E550E5"; -GT.pskColors["60m"] = "0000FF"; -GT.pskColors["40m"] = "4949FF"; +GT.pskColors["60m"] = "99CCFF"; +GT.pskColors["40m"] = "00FFFF"; GT.pskColors["30m"] = "62FF62"; GT.pskColors["20m"] = "FFC40C"; GT.pskColors["17m"] = "F2F261"; GT.pskColors["15m"] = "CCA166"; -GT.pskColors["12m"] = "B22222"; +GT.pskColors["12m"] = "CB3D3D"; GT.pskColors["11m"] = "00FF00"; GT.pskColors["10m"] = "FF69B4"; GT.pskColors["8m"] = "8b00fb"; -GT.pskColors["6m"] = "FF0000"; +GT.pskColors["6m"] = "ff4d4d"; GT.pskColors["4m"] = "df0040"; GT.pskColors["2m"] = "FF1493"; GT.pskColors["1.25m"] = "beff00"; @@ -976,7 +989,7 @@ function getWpx(callsign) if (foundPrefix) prefix = callsign.substr(0, prefixEnd + 1); - return prefix; + return String(prefix); } function setState(details) @@ -1467,20 +1480,6 @@ function addDeDx( } } - // we don't need confirmations, worked is enough - /* if (finalPOTA) - { - GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA] = true; - GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + mode] = true; - GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + band] = true; - GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + band + mode] = true; - if (isDigi == true) - { - GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + "dg"] = true; - GT.tracker.confirmed.pota[dayAsString + finalDXcall + finalPOTA + band + "dg"] = true; - } - } */ - GT.tracker.confirmed.call[finalDXcall + band + mode] = true; GT.tracker.confirmed.call[finalDXcall] = true; GT.tracker.confirmed.call[finalDXcall + mode] = true; @@ -2014,6 +2013,10 @@ function createTooltTipTable(toolElement) "" + $.i18n("gt.newCallList.LastMsg") + "" + "" + $.i18n("gt.newCallList.DXCC") + "" + "" + $.i18n("gt.newCallList.Time") + ""; + + if (GT.callsignLookups.lotwUseEnable == true) worker += "" + $.i18n("gt.qsoPage.LoTW") + ""; + if (GT.callsignLookups.eqslUseEnable == true) worker += "" + $.i18n("gt.qsoPage.eQSL") + ""; + if (GT.callsignLookups.oqrsUseEnable == true) worker += "" + $.i18n("gt.qsoPage.OQRS") + ""; worker += ""; } for (var KeyIsHash in toolElement.hashes) @@ -2127,30 +2130,28 @@ function createTooltTipTable(toolElement) ageString + ""; - if (toolElement.qso == false) + if (GT.callsignLookups.lotwUseEnable == true) { - if (GT.callsignLookups.lotwUseEnable == true) - { - worker += - "" + - (callsign.DEcall in GT.lotwCallsigns ? "✔" : "") + - ""; - } - if (GT.callsignLookups.eqslUseEnable == true) - { - worker += - "" + - (callsign.DEcall in GT.eqslCallsigns ? "✔" : "") + - ""; - } - if (GT.callsignLookups.oqrsUseEnable == true) - { - worker += - "" + - (callsign.DEcall in GT.oqrsCallsigns ? "✔" : "") + - ""; - } + worker += + "" + + (callsign.DEcall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") + + ""; } + if (GT.callsignLookups.eqslUseEnable == true) + { + worker += + "" + + (callsign.DEcall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") + + ""; + } + if (GT.callsignLookups.oqrsUseEnable == true) + { + worker += + "" + + (callsign.DEcall in GT.oqrsCallsigns ? "🙋🏻‍♂️" : "") + + ""; + } + worker += ""; } worker += ""; @@ -2167,12 +2168,11 @@ function createTooltTipTableLogbook(toolElement) { colspan += 2; } - else - { - if (GT.callsignLookups.lotwUseEnable == true) colspan++; - if (GT.callsignLookups.eqslUseEnable == true) colspan++; - if (GT.callsignLookups.oqrsUseEnable == true) colspan++; - } + + if (GT.callsignLookups.lotwUseEnable == true) colspan++; + if (GT.callsignLookups.eqslUseEnable == true) colspan++; + if (GT.callsignLookups.oqrsUseEnable == true) colspan++; + var worker = ""; - if (toolElement.qso == false) - { - if (GT.callsignLookups.lotwUseEnable == true) worker += ""; - if (GT.callsignLookups.eqslUseEnable == true) worker += ""; - if (GT.callsignLookups.oqrsUseEnable == true) worker += ""; - } + if (GT.callsignLookups.lotwUseEnable == true) worker += ""; + if (GT.callsignLookups.eqslUseEnable == true) worker += ""; + if (GT.callsignLookups.oqrsUseEnable == true) worker += ""; + worker += ""; var newCallList = Array(); @@ -2261,39 +2259,37 @@ function createTooltTipTableLogbook(toolElement) ageString + ""; - if (toolElement.qso == false) + if (GT.callsignLookups.lotwUseEnable == true) { - if (GT.callsignLookups.lotwUseEnable == true) + worker += + ""; + } + if (GT.callsignLookups.eqslUseEnable == true) + { + worker += + ""; + } + if (GT.callsignLookups.oqrsUseEnable == true) + { + if (callsign.DEcall in GT.oqrsCallsigns) { worker += - ""; + ""; } - if (GT.callsignLookups.eqslUseEnable == true) + else { worker += - ""; - } - if (GT.callsignLookups.oqrsUseEnable == true) - { - if (callsign.DEcall in GT.oqrsCallsigns) - { - worker += - ""; - } - else - { - worker += - ""; - } + ""; } } + worker += ""; } worker += "
" + $.i18n("gt.newCallList.DXCC") + "" + "" + $.i18n("gt.newCallList.Time") + "" + $.i18n("gt.newCallList.LoTW") + "" + $.i18n("gt.newCallList.eQSL") + "" + $.i18n("gt.newCallList.OQRS") + "" + $.i18n("gt.newCallList.LoTW") + "" + $.i18n("gt.newCallList.eQSL") + "" + $.i18n("gt.newCallList.OQRS") + "
" + + (callsign.DEcall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") + + "" + + (callsign.DEcall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") + + "" + - (callsign.DEcall in GT.lotwCallsigns ? "✔" : "") + - "" + + "🙋🏻‍♂️ 📬" + - (callsign.DEcall in GT.eqslCallsigns ? "✔" : "") + - "" + - "✔📬
"; @@ -2380,7 +2376,12 @@ function openConditionsWindow() GT.conditionsWindowHandle = new_win; new_win.on("loaded", function () { - GT.conditionsWindowHandle.setMinimumSize(490, 290); + GT.conditionsWindowHandle.setMinimumSize(490, 280); + if (GT.firstRun) + { + GT.conditionsWindowHandle.resizeTo(490, 280); + GT.conditionsWindowHandle.moveTo(100, 100); + } }); new_win.on("close", function () { @@ -2482,6 +2483,11 @@ function openCallRosterWindow(show = true) { GT.callRosterWindowHandle.setMinimumSize(390, 250); GT.callRosterWindowHandle.setResizable(true); + if (GT.firstRun) + { + GT.callRosterWindowHandle.resizeTo(1000, 500); + GT.callRosterWindowHandle.moveTo(15, 15); + } }); new_win.on("close", function () { @@ -2583,6 +2589,11 @@ function openStatsWindow(show = true) { GT.statsWindowHandle.setMinimumSize(620, 200); GT.statsWindowHandle.setResizable(true); + if (GT.firstRun) + { + GT.statsWindowHandle.resizeTo(640, 480); + GT.statsWindowHandle.moveTo(50, 50); + } }); new_win.on("close", function () { @@ -2638,6 +2649,11 @@ function showMessaging(show = true, cid) { GT.chatWindowHandle.setMinimumSize(450, 140); GT.chatWindowHandle.setResizable(true); + if (GT.firstRun) + { + GT.chatWindowHandle.resizeTo(640, 300); + GT.chatWindowHandle.moveTo(50, 50); + } }); GT.chatWindowHandle.on("close", function () { @@ -2788,48 +2804,6 @@ GT.tempGrids = Array(); function onMyKeyDown(event) { - if (GT.MyGridIsUp == true && GT.MyCurrentGrid.length == 4) - { - var processedAlert = false; - var mediaClip = ""; - var failedToAdd = GT.dirSeperator + "Balloon-deflating-1.mp3"; - if (event.code == "KeyM") - { - mediaClip = GT.dirSeperator + "Clicky-1.mp3"; - var valid = addAlert(GT.MyCurrentGrid, 2, 3, 2, "", ""); - if (!valid) - { - mediaClip = failedToAdd; - } - processedAlert = true; - } - else if (event.code == "KeyT") - { - mediaClip = GT.dirSeperator + "Ping-coin.mp3"; - var valid = addAlert(GT.MyCurrentGrid, 2, 1, 2, "", ""); - if (!valid) - { - mediaClip = failedToAdd; - } - processedAlert = true; - } - else if (event.code == "KeyV") - { - mediaClip = GT.dirSeperator + "Slide-ping.mp3"; - var valid = addAlert(GT.MyCurrentGrid, 2, 2, 2, "", ""); - if (!valid) - { - mediaClip = failedToAdd; - } - processedAlert = true; - } - if (processedAlert == true) - { - playAlertMediaFile(mediaClip); - } - return; - } - if (event.keyCode == 27) { rootSettingsDiv.style.display = "none"; @@ -2940,9 +2914,7 @@ function registerHotKeys() registerHotKey("KeyE", toggleMoonTrack); registerHotKey("KeyF", toggleSpotPaths); registerHotKey("KeyG", toggleGtMap); - // registerHotKey("KeyH", cycleSpotView); registerHotKey("KeyI", showRootInfoBox); - // registerHotKey("KeyJ", setTrophyOverlay, 8); registerHotKey("KeyK", makeScreenshots); registerHotKey("KeyL", adifLoadDialog); registerHotKey("KeyM", toggleAlertMute); @@ -2956,7 +2928,6 @@ function registerHotKeys() registerHotKey("KeyU", toggleMergeOverlay); registerHotKey("KeyW", toggleGridMode); registerHotKey("KeyX", toggleMouseTrack); - // registerHotKey("KeyY", toggleGlobalStrikes); registerHotKey("KeyZ", setCenterQTH); registerHotKey("Minus", toggleCRScript); @@ -6153,7 +6124,7 @@ function handleWsjtxStatus(newMessage) } } if (GT.pskBandActivityTimerHandle == null) pskGetBandActivity(); - if (bandChange || modeChange) + if (bandChange || modeChange || GT.startingUp) { removePaths(); goProcessRoster(); @@ -6168,6 +6139,7 @@ function handleWsjtxStatus(newMessage) updateChatWindow(); oamsBandActivityCheck(); GT.gtLiveStatusUpdate = true; + GT.startingUp = false; } GT.appSettings.myRawFreq = newMessage.Frequency; @@ -6547,10 +6519,17 @@ function finalWsjtxDecode(newMessage, isFox = false, foxMessage) for (const i in decodeWords) { decodeWords[i] = decodeWords[i].replace("<", "").replace(">", ""); - if (decodeWords[i].indexOf("...") != 1) + if (decodeWords[i].indexOf("...") != -1) { - // simply ignore <...> , we don't know who they are and we aint talking to them. - return; + if (i != 0) + { + // simply ignore <...> , we don't know who they are and we aint talking to them. + return; + } + else + { + decodeWords[0] = "UNKNOWN"; + } } } } @@ -7455,21 +7434,21 @@ function showCallsignBox(redraw) { worker += "" + - (thisCall in GT.lotwCallsigns ? "✔" : "") + + (thisCall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") + ""; } if (GT.callsignLookups.eqslUseEnable == true) { worker += "" + - (thisCall in GT.eqslCallsigns ? "✔" : "") + + (thisCall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") + ""; } if (GT.callsignLookups.oqrsUseEnable == true) { worker += "" + - (thisCall in GT.oqrsCallsigns ? "✔" : "") + + (thisCall in GT.oqrsCallsigns ? "🙋🏻‍♂️" : "") + ""; } worker += ""; @@ -7969,7 +7948,16 @@ function showWorkedBox(sortIndex, nextPage, redraw) worker += "
"; worker += ""; worker += ""; - worker += "
"; + if (GT.filterDxcc != 0) + { + worker += "
"; + worker += ""; + } + else + { + worker += "
"; + } + worker += " "; worker += "" + $.i18n("gt.qsoPage.Station") + ""; worker += "" + $.i18n("gt.qsoPage.Grid") + ""; @@ -7981,6 +7969,9 @@ function showWorkedBox(sortIndex, nextPage, redraw) worker += "" + $.i18n("gt.qsoPage.DXCC") + ""; worker += "" + $.i18n("gt.qsoPage.Flag") + ""; worker += "" + $.i18n("gt.qsoPage.When") + ""; + if (GT.callsignLookups.lotwUseEnable == true) worker += "" + $.i18n("gt.qsoPage.LoTW") + ""; + if (GT.callsignLookups.eqslUseEnable == true) worker += "" + $.i18n("gt.qsoPage.eQSL") + ""; + if (GT.callsignLookups.oqrsUseEnable == true) worker += "" + $.i18n("gt.qsoPage.OQRS") + ""; worker += ""; var key = null; @@ -8024,6 +8015,27 @@ function showWorkedBox(sortIndex, nextPage, redraw) "" + userTimeString(key.time * 1000) + ""; + if (GT.callsignLookups.lotwUseEnable == true) + { + worker += + "" + + (key.DEcall in GT.lotwCallsigns ? "🙋🏻‍♂️" : "") + + ""; + } + if (GT.callsignLookups.eqslUseEnable == true) + { + worker += + "" + + (key.DEcall in GT.eqslCallsigns ? "🙋🏻‍♂️" : "") + + ""; + } + if (GT.callsignLookups.oqrsUseEnable == true) + { + worker += + "" + + (key.DEcall in GT.oqrsCallsigns ? "🙋🏻‍♂️" : "") + + ""; + } worker += ""; } @@ -8165,20 +8177,14 @@ function showWorkedBox(sortIndex, nextPage, redraw) function statsValidateCallByElement(elementString) { - if ( - GT.statsWindowHandle != null && - typeof GT.statsWindowHandle.window.validateCallByElement !== "undefined" - ) + if (GT.statsWindowHandle != null && typeof GT.statsWindowHandle.window.validateCallByElement !== "undefined") { GT.statsWindowHandle.window.validateCallByElement(elementString); } } function statsFocus(selection) { - if ( - GT.statsWindowHandle != null && - typeof GT.statsWindowHandle.window.statsFocus !== "undefined" - ) + if (GT.statsWindowHandle != null && typeof GT.statsWindowHandle.window.statsFocus !== "undefined") { GT.statsWindowHandle.window.statsFocus(selection); } @@ -8186,10 +8192,7 @@ function statsFocus(selection) function lookupValidateCallByElement(elementString) { - if ( - GT.lookupWindowHandle != null && GT.lookupWindowInitialized && - typeof GT.lookupWindowHandle.window.validateCallByElement !== "undefined" - ) + if (GT.lookupWindowHandle != null && GT.lookupWindowInitialized && typeof GT.lookupWindowHandle.window.validateCallByElement !== "undefined") { GT.lookupWindowHandle.window.validateCallByElement(elementString); } @@ -8197,10 +8200,7 @@ function lookupValidateCallByElement(elementString) function lookupFocus(selection) { - if ( - GT.lookupWindowHandle != null && GT.lookupWindowInitialized && - typeof GT.lookupWindowHandle.window.statsFocus !== "undefined" - ) + if (GT.lookupWindowHandle != null && GT.lookupWindowInitialized && typeof GT.lookupWindowHandle.window.statsFocus !== "undefined") { GT.lookupWindowHandle.window.statsFocus(selection); } @@ -8208,10 +8208,7 @@ function lookupFocus(selection) function statsAppendChild(elementString, object, onInputString, defaultValue) { - if ( - GT.statsWindowHandle != null && - typeof GT.statsWindowHandle.window.appendToChild !== "undefined" - ) + if (GT.statsWindowHandle != null && typeof GT.statsWindowHandle.window.appendToChild !== "undefined") { GT.statsWindowHandle.window.appendToChild( elementString, @@ -8682,6 +8679,11 @@ function openBaWindow(show = true) new_win.on("loaded", function () { GT.baWindowHandle.setMinimumSize(198, 52); + if (GT.firstRun) + { + GT.baWindowHandle.resizeTo(198, 52); + GT.baWindowHandle.moveTo(250, 250); + } }); new_win.on("close", function () { @@ -8794,6 +8796,11 @@ function openLookupWindow(show = false) { GT.lookupWindowHandle.setMinimumSize(680, 200); GT.lookupWindowHandle.setResizable(true); + if (GT.firstRun) + { + GT.lookupWindowHandle.resizeTo(680, 200); + GT.lookupWindowHandle.moveTo(75, 75); + } }); new_win.on("close", function () { @@ -9377,8 +9384,7 @@ function renderStatsBox() for (var band in stats[i][key].confirmed_bands) { - output[i].confirmed_bands[band] = - ~~output[i].confirmed_bands[band] + 1; + output[i].confirmed_bands[band] = ~~output[i].confirmed_bands[band] + 1; } for (var mode in stats[i][key].worked_modes) @@ -9388,8 +9394,7 @@ function renderStatsBox() for (var mode in stats[i][key].confirmed_modes) { - output[i].confirmed_modes[mode] = - ~~output[i].confirmed_modes[mode] + 1; + output[i].confirmed_modes[mode] = ~~output[i].confirmed_modes[mode] + 1; } for (var type in stats[i][key].worked_types) @@ -9399,8 +9404,7 @@ function renderStatsBox() for (var type in stats[i][key].confirmed_types) { - output[i].confirmed_types[type] = - ~~output[i].confirmed_types[type] + 1; + output[i].confirmed_types[type] = ~~output[i].confirmed_types[type] + 1; } } @@ -11505,16 +11509,6 @@ function workingDateChanged() var fields = workingDateValue.value.split("-"); var time = workingTimeValue.value.split(":"); - var date = new Date( - Date.UTC( - parseInt(fields[0]), - parseInt(fields[1]) - 1, - parseInt(fields[2]), - parseInt(time[0]), - parseInt(time[1]), - 0 - ) - ); GT.appSettings.workingDate = Date.UTC( parseInt(fields[0]), @@ -11748,7 +11742,8 @@ function loadMaidenHeadData() { GT.dxccToAltName[GT.dxccInfo[key].dxcc] = GT.dxccInfo[key].name; GT.dxccToADIFName[GT.dxccInfo[key].dxcc] = GT.dxccInfo[key].aname; - + GT.altNameToDXCC[GT.dxccInfo[key].name] = GT.dxccInfo[key].dxcc; + for (var x = 0; x < GT.dxccInfo[key].prefix.length; x++) { GT.prefixToMap[GT.dxccInfo[key].prefix[x]] = key; @@ -12777,7 +12772,7 @@ function initSpeech() { window.speechSynthesis.onvoiceschanged = function () { - nodeTimers.setTimeout(timedGetVoices, 500); + nodeTimers.setTimeout(timedGetVoices, 3000); }; var msg = new SpeechSynthesisUtterance("\n"); msg.lang = GT.localeString; @@ -14970,19 +14965,19 @@ function displayLookupObject(lookup, gridPass, fromCache = false) if (GT.callsignLookups.lotwUseEnable == true && thisCall in GT.lotwCallsigns) { lookup.ulotw = - "✔ (" + + "🙋🏻‍♂️ (" + userDayString(GT.lotwCallsigns[thisCall] * 86400 * 1000) + ")"; worker += makeRow("LoTW Member", lookup, "ulotw"); } if (GT.callsignLookups.eqslUseEnable == true && thisCall in GT.eqslCallsigns) { - lookup.ueqsl = "✔"; + lookup.ueqsl = "🙋🏻‍♂️"; worker += makeRow("eQSL Member", lookup, "ueqsl"); } if (GT.callsignLookups.oqrsUseEnable == true && thisCall in GT.oqrsCallsigns) { - lookup.uoqrs = "✔"; + lookup.uoqrs = "🙋🏻‍♂️"; worker += makeRow("ClubLog OQRS", lookup, "uoqrs"); } diff --git a/package.nw/lib/pota.js b/package.nw/lib/pota.js index 6ada095..8258693 100644 --- a/package.nw/lib/pota.js +++ b/package.nw/lib/pota.js @@ -47,20 +47,38 @@ GT.potaUnknownPark = { grid: "" }; -GT.gtParkIconActive = new ol.style.Icon({ - src: "./img/pota_icon_active.png", - anchorYUnits: "pixels", - anchorXUnits: "pixels", - anchor: [10, 19] +GT.gtParkOnInstance = new ol.style.Text({ + text: "🏕️", + font: "20px Verdana", + textAlign: "center", + justify: "center" }); -GT.gtParkIconInactive = new ol.style.Icon({ - src: "./img/pota_icon_inactive.png", - anchorYUnits: "pixels", - anchorXUnits: "pixels", - anchor: [10, 19] +GT.gtParkOffInstance = new ol.style.Text({ + text: "🌲", + font: "20px Verdana", + textAlign: "center", + justify: "center" }); +function iconText(center, iconObj, zIndex, propName) +{ + var feature = new ol.Feature({ + geometry: new ol.geom.Point(center), + textAlign: "center", + justify: "center", + prop: propName + }); + + var iconStyle = new ol.style.Style({ + zIndex: zIndex, + text: iconObj + }); + + feature.setStyle(iconStyle); + return feature; +} + function initPota() { potaEnabled.checked = (GT.appSettings.potaEnabled == 1); @@ -139,7 +157,18 @@ function makeParkFeatures() var report = GT.pota.parkSpots[park][call]; if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode) && Date.now() < report.expire) { - parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), GT.gtParkIconActive, 1, "parkFlag"); + let parkIcon = GT.gtParkOffInstance; + let zIndex = 1; + for (let instance in GT.instances) + { + if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode) + { + parkIcon = GT.gtParkOnInstance; + zIndex = 2; + break; + } + } + parkObj.feature = iconText(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), parkIcon, zIndex, "parkFlag"); parkObj.feature.key = park; parkObj.feature.size = 22; @@ -179,7 +208,6 @@ function potaSpotFromDecode(callObj) if (!(hash in GT.pota.rbnReportTimes) || Date.now() > GT.pota.rbnReportTimes[hash]) { GT.pota.rbnReportTimes[hash] = Date.now() + GT.pota.rbnFrequency; - // reportPotaRBN(GT.pota.parkSpots[park][callObj.DEcall]); } } else if (callObj.DEcall in GT.pota.callSchedule) @@ -205,7 +233,6 @@ function potaSpotFromDecode(callObj) if (!(hash in GT.pota.rbnReportTimes) || Date.now() > GT.pota.rbnReportTimes[hash]) { GT.pota.rbnReportTimes[hash] = Date.now() + GT.pota.rbnFrequency; - // reportPotaRBN(GT.pota.parkSpots[park][callObj.DEcall]); } } else @@ -245,39 +272,6 @@ function leftClickPota(parkId) } } -/* function reportPotaRBN(callSpot) -{ - if (Date.now() < callSpot.expire) - { - var report = { - activator: callSpot.activator, - spotter: GT.appSettings.myCall + "-#", - frequency: String(parseInt(callSpot.frequency * 1000)), - reference: callSpot.reference, - mode: callSpot.mode, - source: "RBN", - comments: callSpot.comments, - activatorGrid: callSpot.activatorGrid, - spotterGrid: callSpot.spotterGrid - }; - - if (Number(report.frequency) > 0) - { - getPostJSONBuffer( - "https://api.pota.app/spot", - rbnReportResult, - null, - "https", - 443, - report, - 10000, - null, - null - ); - } - } -} */ - function reportPotaQSO(record) { var report = { @@ -357,7 +351,18 @@ function addParkSpotFeature(park, report) if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode)) { - parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), GT.gtParkIconActive, 1, "parkFlag"); + let parkIcon = GT.gtParkOffInstance; + let zIndex = 1; + for (let instance in GT.instances) + { + if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode) + { + parkIcon = GT.gtParkOnInstance; + zIndex = 2; + break; + } + } + parkObj.feature = iconText(ol.proj.fromLonLat([Number(GT.pota.parks[park].longitude), Number(GT.pota.parks[park].latitude)]), parkIcon, zIndex, "parkFlag"); parkObj.feature.key = park; parkObj.feature.size = 22; GT.layerSources.pota.addFeature(parkObj.feature); diff --git a/package.nw/lib/roster.js b/package.nw/lib/roster.js index 5f99086..83e53ed 100644 --- a/package.nw/lib/roster.js +++ b/package.nw/lib/roster.js @@ -9,6 +9,7 @@ CR.developerMode = process.versions["nw-flavor"] == "sdk"; CR.callRoster = {}; CR.blockedCalls = {}; CR.blockedCQ = {}; +CR.ignoredCQ = {}; CR.blockedDxcc = {}; CR.blockedCQz = {}; CR.blockedITUz = {}; @@ -25,29 +26,22 @@ CR.rosterSettings = {}; CR.day = 0; CR.dayAsString = "0"; CR.menu = null; +CR.columnMenu = null; +CR.columnMembers = {}; CR.callMenu = null; CR.ageMenu = null; CR.callingMenu = null; CR.compactMenu = null; -CR.menuItemForCurrentColumn = null; +CR.menuItemForMoveLeftColumn = null; +CR.menuItemForMoveRightColumn = null; CR.currentColumnName = null; CR.targetHash = ""; -CR.clearIgnores = null; -CR.clearIgnoresCall = null; CR.dxccMenu = null; CR.targetDxcc = -1; -CR.clearDxccIgnore = null; -CR.clearDxccIgnoreMainMenu = null; CR.CQMenu = null; +CR.MsgMenu = null; CR.targetCQ = ""; -CR.clearCQIgnore = null; -CR.clearCQIgnoreMainMenu = null; -CR.clearCQzIgnore = null; -CR.clearCQzIgnoreMainMenu = null; -CR.clearITUzIgnore = null; -CR.clearITUzIgnoreMainMenu = null; CR.timerInterval = null; -CR.typingInRoster = false; CR.awards = {}; CR.awardTypes = {}; CR.awardTracker = {}; @@ -64,12 +58,14 @@ CR.modeColors.QRA64 = "FF00FF"; CR.modeColors.MSK144 = "4949FF"; CR.rosterTimeout = null; CR.rosterFocus = false; +CR.watchers = null; CR.defaultSettings = { callsign: "all", hunting: "dxcc", huntNeed: "confirmed", requireGrid: false, + animateCQGT: true, wantMaxDT: false, wantMinDB: false, wantMinFreq: false, @@ -81,21 +77,13 @@ CR.defaultSettings = { maxFreq: 3500, noMyDxcc: false, onlyMyDxcc: false, - noMsg: false, - noMsgValue: "CQ RU", - onlyMsg: false, - onlyMsgValue: "CQ FD", - cqOnly: true, + cqOnly: false, usesLoTW: false, maxLoTW: 27, useseQSL: false, usesOQRS: false, onlySpot: false, allOnlyNew: false, - useRegex: false, - noUnknownDXCC: true, - callsignRegex: "", - huntRegexValue: "", realtime: true, wanted: { huntCallsign: false, @@ -104,14 +92,15 @@ CR.defaultSettings = { huntCQz: false, huntITUz: false, huntMarathon: false, - huntState: false, + huntState: true, huntCounty: false, huntCont: false, huntPX: false, huntPOTA: false, huntQRZ: true, huntOAMS: false, - huntRegex: false + huntRegex: false, + huntWatcher: false }, columns: { Callsign: true, @@ -131,7 +120,7 @@ CR.defaultSettings = { Freq: false, DT: false, Dist: false, - Azim: true, + Azim: false, CQz: false, ITUz: false, PX: false, @@ -149,7 +138,6 @@ CR.defaultSettings = { contrast: 100, saturate: 100, invert: 0, - grayscale: 0, sepia: 0, huerotate: 0 }, @@ -165,7 +153,8 @@ CR.defaultSettings = { rosterDelayOnFocus: false, rosterDelayTime: 1500, rosterTime: 120, - compactEntity: "DXCC" + compactEntity: "DXCC", + watchers: {} }; CR.def_displayFilters = { @@ -202,11 +191,16 @@ document.addEventListener("drop", function (event) window.addEventListener("message", receiveMessage, false); -if (typeof localStorage.blockedCQ == "undefined") +if (typeof localStorage.awardTracker == "undefined") { - localStorage.blockedCQ = "{}"; + localStorage.awardTracker = "{}"; + CR.rosterSettings = {}; + writeRosterSettings(); } +CR.awardTracker = JSON.parse(localStorage.awardTracker); + +// These two need to stay here because of an old bug. if (typeof localStorage.blockedCQz == "undefined") { localStorage.blockedCQz = "{}"; @@ -217,15 +211,6 @@ if (typeof localStorage.blockedITUz == "undefined") localStorage.blockedITUz = "{}"; } -if (typeof localStorage.awardTracker == "undefined") -{ - localStorage.awardTracker = "{}"; - CR.rosterSettings = {}; - writeRosterSettings(); -} - -CR.awardTracker = JSON.parse(localStorage.awardTracker); - if (typeof localStorage.blockedCalls != "undefined") { CR.blockedCalls = JSON.parse(localStorage.blockedCalls); @@ -234,14 +219,56 @@ if (typeof localStorage.blockedCalls != "undefined") CR.blockedCQz = JSON.parse(localStorage.blockedCQz); CR.blockedITUz = JSON.parse(localStorage.blockedITUz); } +else +{ + localStorage.blockedCalls = "{}"; + localStorage.blockedDxcc = "{}"; + localStorage.blockedCQz = "{}"; + localStorage.blockedITUz = "{}"; + localStorage.ignoredCQ = "{}"; +} -function storeBlocks() +if (typeof localStorage.ignoredCQ == "undefined") +{ + // CR.blockedCQ is deprecated, we don't clear it, we copy it + // This is protection against them rolling back to a previous version + // where keys are "CQ POTA from CountryString" + let shouldStore = false; + for (let key in CR.blockedCQ) + { + let test = key.split(" from "); + if (test.length == 2) + { + if (test[1] == "All") + { + CR.ignoredCQ[test[0]] = true; + } + else + { + CR.ignoredCQ[test[0] + ":" + window.opener.GT.altNameToDXCC[test[1]]] = true; + } + + shouldStore = true; + } + } + if (shouldStore) storeBlocks(false); +} +else +{ + CR.ignoredCQ = JSON.parse(localStorage.ignoredCQ); +} + +function storeBlocks(render = true) { localStorage.blockedCalls = JSON.stringify(CR.blockedCalls); - localStorage.blockedCQ = JSON.stringify(CR.blockedCQ); + localStorage.ignoredCQ = JSON.stringify(CR.ignoredCQ); localStorage.blockedDxcc = JSON.stringify(CR.blockedDxcc); localStorage.blockedCQz = JSON.stringify(CR.blockedCQz); localStorage.blockedITUz = JSON.stringify(CR.blockedITUz); + if (render) + { + renderIgnoresTab(); + } } function storeAwardTracker() @@ -261,6 +288,9 @@ function loadSettings() fixLegacySettings(); writeRosterSettings(); + + // Code reducder + CR.watchers = CR.rosterSettings.watchers; } function fixLegacySettings() @@ -288,6 +318,11 @@ function fixLegacySettings() function writeRosterSettings() { + for (let key in CR.rosterSettings.watchers) + { + CR.rosterSettings.watchers[key].test = null; + } + localStorage.rosterSettings = JSON.stringify(CR.rosterSettings); } @@ -851,7 +886,7 @@ function closeAwardPopup() function toggleMoreControls() { CR.rosterSettings.controlsExtended = !CR.rosterSettings.controlsExtended; - localStorage.rosterSettings = JSON.stringify(CR.rosterSettings); + writeRosterSettings(); setVisual(); } @@ -860,7 +895,7 @@ function setVisual() { huntNeed.style.display = "none"; stateSelect.style.display = "none"; - DXCCsSelect.style.display = "none"; + DxccSingleSelect.style.display = "none"; if (CR.rosterSettings.controls) { @@ -929,92 +964,18 @@ function setVisual() } if (huntMode.value == "dxccs") { - DXCCsSelect.style.display = ""; + DxccSingleSelect.style.display = ""; } } } - if (huntRegex.checked == true) - { - huntRegexValue.style.display = ""; - } - else - { - huntRegexValue.style.display = "none"; - } - - if (wantMaxDT.checked == true) - { - maxDT.style.display = ""; - maxDTView.style.display = ""; - } - else - { - maxDT.style.display = "none"; - maxDTView.style.display = "none"; - } - - if (wantMinDB.checked == true) - { - minDb.style.display = ""; - minDbView.style.display = ""; - } - else - { - minDb.style.display = "none"; - minDbView.style.display = "none"; - } - - if (wantMinFreq.checked == true) - { - minFreq.style.display = ""; - minFreqView.style.display = ""; - } - else - { - minFreq.style.display = "none"; - minFreqView.style.display = "none"; - } - - if (wantMaxFreq.checked == true) - { - maxFreq.style.display = ""; - maxFreqView.style.display = ""; - } - else - { - maxFreq.style.display = "none"; - maxFreqView.style.display = "none"; - } - - if (useRegex.checked == true) - { - callsignRegex.style.display = ""; - } - else - { - callsignRegex.style.display = "none"; - } - if (window.opener.GT.callsignLookups.lotwUseEnable == true) { usesLoTWDiv.style.display = ""; - if (CR.rosterSettings.usesLoTW == true) - { - maxLoTW.style.display = ""; - maxLoTWView.style.display = ""; - } - else - { - maxLoTW.style.display = "none"; - maxLoTWView.style.display = "none"; - } } else { usesLoTWDiv.style.display = "none"; - maxLoTW.style.display = "none"; - maxLoTWView.style.display = "none"; } if (window.opener.GT.callsignLookups.eqslUseEnable == true) @@ -1069,14 +1030,9 @@ function wantedChanged(element) if (t in CR.rosterSettings.columns) { CR.rosterSettings.columns[t] = true; - - for (const i in CR.menu.items) + if (t in CR.columnMembers) { - if ( - typeof CR.menu.items[i].checked != "undefined" && - CR.menu.items[i].label == t - ) - { CR.menu.items[i].checked = true; } + CR.columnMembers[t].checked = true; } } } @@ -1116,31 +1072,12 @@ function valuesChanged() CR.rosterSettings.cqOnly = cqOnly.checked; CR.rosterSettings.noMyDxcc = noMyDxcc.checked; CR.rosterSettings.onlyMyDxcc = onlyMyDxcc.checked; - if (noMsg.checked && onlyMsg.checked && noMsgValue.value == onlyMsgValue.value) - { - if (CR.rosterSettings.noMsg) - { - noMsg.checked = false; - } - else - { - onlyMsg.checked = false; - } - } - CR.rosterSettings.noMsg = noMsg.checked; - CR.rosterSettings.onlyMsg = onlyMsg.checked; - CR.rosterSettings.noMsgValue = noMsgValue.value; - CR.rosterSettings.onlyMsgValue = onlyMsgValue.value; CR.rosterSettings.usesLoTW = usesLoTW.checked; CR.rosterSettings.useseQSL = useseQSL.checked; CR.rosterSettings.usesOQRS = usesOQRS.checked; CR.rosterSettings.onlySpot = onlySpot.checked; CR.rosterSettings.reference = referenceNeed.value; CR.rosterSettings.allOnlyNew = allOnlyNew.checked; - CR.rosterSettings.useRegex = useRegex.checked; - CR.rosterSettings.callsignRegex = callsignRegex.value; - CR.rosterSettings.huntRegexValue = huntRegexValue.value; - CR.rosterSettings.noUnknownDXCC = noUnknownDXCC.checked; writeRosterSettings(); @@ -1306,41 +1243,131 @@ function stateChangedValue(what) function DXCCsChangedValue(what) { - CR.currentDXCCs = DXCCsSelect.value; + CR.currentDXCCs = DxccSingleSelect.value; viewRoster(); } -function initDXCCSelector() +function initSelectors() { + for (const column in ROSTER_COLUMNS) + { + if (column != "Callsign") + { + let option = newOption(column, column); + if (column == CR.rosterSettings.compactEntity) + { + option.selected = true; + } + compactEntitySelect.appendChild(option); + } + } + let items = Object.keys(window.opener.GT.dxccToAltName).sort(function (a, b) { return window.opener.GT.dxccToAltName[a].localeCompare( window.opener.GT.dxccToAltName[b] ); }); - let newSelect = document.getElementById("DXCCsSelect"); for (const i in items) { let key = items[i]; - - if ( - window.opener.GT.dxccInfo[key].geo != - "deleted" - ) + if (window.opener.GT.dxccInfo[key].geo != "deleted") { let option = document.createElement("option"); option.value = key; - option.text = - window.opener.GT.dxccToAltName[key] + - " (" + - window.opener.GT.dxccInfo[key].pp + - ")"; - - newSelect.appendChild(option); + option.text = window.opener.GT.dxccToAltName[key] + " (" + window.opener.GT.dxccInfo[key].pp + ")"; + DxccSingleSelect.appendChild(option); + // Note: do not use cloneNode on elements/nodes that have ids + ignoreCqDxccSelect.appendChild(option.cloneNode(true)); + ignoreDxccSelect.appendChild(option.cloneNode(true)); } } - newSelect.oninput = DXCCsChangedValue; + DxccSingleSelect.oninput = DXCCsChangedValue; + + items = Object.keys(window.opener.GT.cqZones).sort(); + for (const i in items) + { + let key = items[i]; + let option = document.createElement("option"); + option.value = key; + option.text = key + " - " + window.opener.GT.cqZones[key].name; + ignoreCqzSelect.appendChild(option); + } + + items = Object.keys(window.opener.GT.ituZones).sort(); + for (const i in items) + { + let key = items[i]; + let option = document.createElement("option"); + option.value = key; + option.text = key; + ignoreItuzSelect.appendChild(option); + } + + CR.ignoreTypeInputs = {}; + CR.ignoreTypeInputs.Callsign = ignoreCallsignValue; + CR.ignoreTypeInputs.CQ = ignoreCqDiv; + CR.ignoreTypeInputs.DXCC = ignoreDxccSelect; + CR.ignoreTypeInputs.CQz = ignoreCqzSelect; + CR.ignoreTypeInputs.ITUz = ignoreItuzSelect; + + ignoreTypeChanged("Callsign"); + watcherTypeChanged("Callsign"); +} + +function hideIgnoreElements() +{ + ignoreCallsignValue.style.display = "none"; + ignoreCqDiv.style.display = "none"; + ignoreDxccSelect.style.display = "none"; + ignoreCqzSelect.style.display = "none"; + ignoreItuzSelect.style.display = "none"; +} + +CR.ignoreType = "Callsign"; + +function ignoreTypeChanged(ignoreTypeValue) +{ + hideIgnoreElements(); + CR.ignoreTypeInputs[ignoreTypeValue].style.display = ""; + if (CR.ignoreType != ignoreTypeValue) + { + ingnoreAddResultLabel.innerHTML = ""; + CR.ignoreType = ignoreTypeValue; + } + ValidateTextInput(ignoreCallsignValue); + ValidateTextInput(ignoreCqCallsignValue); +} + +function addNewIgnore() +{ + if (CR.ignoreType == "Callsign") + { + if (ValidateTextInput(ignoreCallsignValue, ingnoreAddResultLabel)) + { + ignoreCallsign(ignoreCallsignValue.value); + } + } + else if (CR.ignoreType == "CQ") + { + if (ValidateTextInput(ignoreCqCallsignValue, ingnoreAddResultLabel)) + { + ignoreCQ("CQ " + ignoreCqCallsignValue.value, ignoreCqDxccSelect.value); + } + } + else if (CR.ignoreType == "DXCC") + { + ignoreDxcc(ignoreDxccSelect.value); + } + else if (CR.ignoreType == "CQz") + { + ignoreCQz(ignoreCqzSelect.value) + } + else if (CR.ignoreType == "ITUz") + { + ignoreITUz(ignoreItuzSelect.value); + } } function manifestResult(buffer, flag) @@ -1385,7 +1412,49 @@ function deleteCallsignIgnore(key) { delete CR.blockedCalls[key]; storeBlocks(); - openIgnoreEdit(); + viewRoster(); +} + +function ignoreCallsign(callsign) +{ + CR.blockedCalls[callsign] = true; + storeBlocks(); + viewRoster(); +} + +function ignoreDxcc(dxcc) +{ + CR.blockedDxcc[dxcc] = true; + storeBlocks(); + viewRoster(); +} + +function ignoreCQ(cq, dxcc) +{ + if (dxcc > 0) + { + CR.ignoredCQ[cq + ":" + dxcc] = true; + } + else + { + CR.ignoredCQ[cq] = true; + } + + storeBlocks(); + viewRoster(); +} + +function ignoreCQz(cqz) +{ + CR.blockedCQz[cqz] = true; + storeBlocks(); + viewRoster(); +} + +function ignoreITUz(ituz) +{ + CR.blockedITUz[ituz] = true; + storeBlocks(); viewRoster(); } @@ -1393,15 +1462,13 @@ function deleteDxccIgnore(key) { delete CR.blockedDxcc[key]; storeBlocks(); - openIgnoreEdit(); viewRoster(); } function deleteCQIgnore(key) { - delete CR.blockedCQ[key]; + delete CR.ignoredCQ[key]; storeBlocks(); - openIgnoreEdit(); viewRoster(); } @@ -1409,7 +1476,6 @@ function deleteCQzIgnore(key) { delete CR.blockedCQz[key]; storeBlocks(); - openIgnoreEdit(); viewRoster(); } @@ -1417,7 +1483,6 @@ function deleteITUzIgnore(key) { delete CR.blockedITUz[key]; storeBlocks(); - openIgnoreEdit(); viewRoster(); } @@ -1425,7 +1490,6 @@ function clearAllCallsignIgnores() { CR.blockedCalls = Object(); storeBlocks(); - openIgnoreEdit(); viewRoster(); } @@ -1433,15 +1497,13 @@ function clearAllDxccIgnores() { CR.blockedDxcc = Object(); storeBlocks(); - openIgnoreEdit(); viewRoster(); } function clearAllCQIgnores() { - CR.blockedCQ = Object(); + CR.ignoredCQ = Object(); storeBlocks(); - openIgnoreEdit(); viewRoster(); } @@ -1449,7 +1511,6 @@ function clearAllCQzIgnores() { CR.blockedCQz = Object(); storeBlocks(); - openIgnoreEdit(); viewRoster(); } @@ -1457,181 +1518,227 @@ function clearAllITUzIgnores() { CR.blockedITUz = Object(); storeBlocks(); - openIgnoreEdit(); viewRoster(); } function openSettings() { - MainCallRoster.style.display = "block"; - settingsDiv.style.display = "block"; - editView.style.display = "none"; + openInfoTab("generalbox", "generalSettingsDiv"); + settingsDiv.style.display = "inline-block"; +} + +function openWatcher() +{ + openInfoTab("watcherbox", "watcherBoxDiv", openWathcherTab); + settingsDiv.style.display = "inline-block"; +} + +function openExceptions() +{ + openInfoTab("exceptionsbox", "exceptionsBoxDiv"); + settingsDiv.style.display = "inline-block"; +} + +function openIgnores() +{ + openInfoTab("ingoresbox", "ignoresBoxDiv", renderIgnoresTab); + settingsDiv.style.display = "inline-block"; +} + +function openColumns() +{ + openInfoTab("columnsbox", "columnsBoxDiv", renderColumnsTab); + settingsDiv.style.display = "inline-block"; } function closeSettings() { - MainCallRoster.style.display = "block"; settingsDiv.style.display = "none"; - editView.style.display = "none"; } -function closeEditIgnores() +function renderIgnoresTab() { - MainCallRoster.style.display = "block"; - editView.style.display = "none"; -} - -function openIgnoreEdit() -{ - MainCallRoster.style.display = "none"; - editView.style.display = "inline-block"; let worker = ""; let clearString = "none"; - if (Object.keys(CR.blockedCalls).length > 0) { - clearString = - "Clear All"; + clearString = "Clear All"; + worker += "
" + clearString + ""; + Object.keys(CR.blockedCalls) + .sort() + .forEach(function (key, i) + { + worker += ""; + }); + worker += "
Callsigns
" + key + "
"; } - worker += - "
" + - clearString + - ""; - Object.keys(CR.blockedCalls) - .sort() - .forEach(function (key, i) - { - worker += - ""; - }); - worker += "
Callsigns
" + - key + - "
"; - clearString = "none"; - if (Object.keys(CR.blockedCQ).length > 0) + if (Object.keys(CR.ignoredCQ).length > 0) { - clearString = - "Clear All"; + clearString = "Clear All"; + worker += "
" + clearString + ""; + Object.keys(CR.ignoredCQ) + .sort() + .forEach(function (rawKey, i) + { + let split = rawKey.split(":"); + let key = split[0]; + let dxcc = -1; + if (split.length == 2) dxcc = parseInt(split[1]); + worker += ""; + }); + worker += "
CQ
" + key + " from " + (dxcc == -1 ? "All" : window.opener.GT.dxccToAltName[dxcc]) + "
"; } - worker += - "
" + - clearString + - ""; - Object.keys(CR.blockedCQ) - .sort() - .forEach(function (key, i) - { - worker += - ""; - }); - worker += "
CQ
" + - key + - "
"; - clearString = "none"; if (Object.keys(CR.blockedDxcc).length > 0) { - clearString = - "Clear All"; + clearString = "Clear All"; + worker += "
" + clearString + ""; + Object.keys(CR.blockedDxcc) + .sort() + .forEach(function (key, i) + { + worker += ""; + }); + worker += "
DXCC
" + window.opener.GT.dxccToAltName[key] + " (" + window.opener.GT.dxccInfo[key].pp + ")
"; } - worker += - "
" + - clearString + - ""; - Object.keys(CR.blockedDxcc) - .sort() - .forEach(function (key, i) - { - worker += - ""; - }); - worker += "
DXCCs
" + - window.opener.GT.dxccToAltName[key] + - " (" + - window.opener.GT.dxccInfo[key].pp + - ")
"; if (Object.keys(CR.blockedCQz).length > 0) { - clearString = - "Clear All"; + clearString = "Clear All"; + worker += "
" + clearString + ""; + Object.keys(CR.blockedCQz) + .sort() + .forEach(function (key, i) + { + worker += ""; + }); + worker += "
CQ Zones
" + key + "
"; } - worker += - "
" + - clearString + - ""; - Object.keys(CR.blockedCQz) - .sort() - .forEach(function (key, i) - { - worker += - ""; - }); - worker += "
CQ Zones
" + - key + - "
"; if (Object.keys(CR.blockedITUz).length > 0) { - clearString = - "Clear All"; + clearString = "Clear All"; + worker += "
" + clearString + ""; + Object.keys(CR.blockedITUz) + .sort() + .forEach(function (key, i) + { + worker += ""; + }); + worker += "
ITU Zones
" + key + "
"; } - worker += - "
" + - clearString + - ""; - Object.keys(CR.blockedITUz) - .sort() - .forEach(function (key, i) - { - worker += - ""; - }); - worker += "
ITU Zones
" + - key + - "
"; - editTables.innerHTML = worker; - editView.style.height = (window.innerHeight - 45) + "px"; + ignoresEditView.innerHTML = worker; + ignoresBoxDiv.style.height = (window.innerHeight - 50) + "px"; + + let elems = document.getElementsByClassName("ignoresTables"); + for (let x = 0; x < elems.length; x++) + { + let height = 110; + if (elems[x].offsetHeight > window.innerHeight - height) + { + elems[x].style.height = (window.innerHeight - height) + "px"; + } + } +} + +function renderColumnsTab() +{ + let worker = ""; + let renderHeight = 230; + worker += "
"; + worker += "
Enabled
"; + const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: false }); + let enabled = {}; + for (let x = 0; x != columns.length; x++) + { + let column = columns[x]; + enabled[column] = true; + worker += "
"; + if (x > 0) + { + worker += `
`; + } + else + { + worker += "
 
" + } + + worker += `
` + worker += "
" + column + "
"; + if (x + 1 != columns.length) + { + worker += `
`; + } + else + { + worker += "
 
"; + } + worker += "
"; + } + worker += "
"; + worker += "
"; + + let available = [...CR.rosterSettings.columnOrder]; + available.sort((a, b) => a.toLowerCase() < b.toLowerCase() ? -1 : 1); + for (let x = 0; x != available.length; x++) + { + let column = available[x]; + if (column == "Callsign") continue; + if (column == "eQSL" && window.opener.GT.callsignLookups.eqslUseEnable == false) continue; + if (column == "LoTW" && window.opener.GT.callsignLookups.lotwUseEnable == false) continue; + if (column == "OQRS" && window.opener.GT.callsignLookups.oqrsUseEnable == false) continue; + + if (!(column in enabled)) + { + worker += "
"; + worker += `
`; + worker += "
" + column + "
"; + worker += "
"; + } + } + worker += "
"; + + columnsEditView.innerHTML = worker; + renderHeight = Math.max(window.innerHeight - 200, 150); + columnEnabledView.style.height = renderHeight + "px"; + columnAvailableView.style.height = renderHeight + "px"; } function onMyKeyDown(event) { - if (!CR.typingInRoster) + if (event.keyCode == 27) { - if (event.code == "KeyS" && event.ctrlKey == true) + closeSettings(); + } + + if (event.ctrlKey == true) + { + if (event.code == "KeyS") { openSettings(); } - else if (event.code == "KeyR" && event.ctrlKey == true) + else if (event.code == "KeyW" || event.code == "KeyO") + { + openWatcher(); + } + else if (event.code == "KeyE") + { + openExceptions(); + } + else if (event.code == "KeyI") + { + openIgnores(); + } + else if (event.code == "KeyC") + { + openColumns(); + } + else if (event.code == "KeyR") { resetFilters(); } - else - { - window.opener.onMyKeyDown(event); - } } } @@ -1645,7 +1752,16 @@ function blurOnEnter(ele) function resize() { - if (editView.style.display == "inline-block") openIgnoreEdit(); + if (ignoresBoxDiv.style.display != "none") + { + renderIgnoresTab(); + } + if (columnsBoxDiv.style.display != "none") + { + renderColumnsTab(); + } + + wantRenderWatchersTab(); window.opener.goProcessRoster(); } @@ -1685,6 +1801,16 @@ function init() setRosterTop(); } +function toggleShowControls() +{ + CR.rosterSettings.controls = !CR.rosterSettings.controls; + let newLabel = CR.rosterSettings.controls ? $.i18n("roster.menu.HideControls") : $.i18n("roster.menu.ShowControls"); + CR.compactMenu.items[0].label = newLabel; + CR.menu.items[0].label = newLabel; + writeRosterSettings(); + setVisual(); +} + // From i18n.js function addControls() { @@ -1700,7 +1826,7 @@ function addControls() cnty: $.i18n("rosterColumns.Wanted.cnty"), wpx: $.i18n("rosterColumns.Wanted.wpx"), call: $.i18n("rosterColumns.Wanted.call"), - regex: $.i18n("rosterColumns.Wanted.regex"), + watcher: $.i18n("roster.watcher.label"), oams: $.i18n("rosterColumns.Wanted.oams"), pota: $.i18n("rosterColumns.Wanted.pota") } @@ -1722,19 +1848,7 @@ function addControls() label: CR.rosterSettings.controls ? hideControlsText : showControlsText, click: function () { - if (this.label == "Hide Controls") - { - this.label = showControlsText; - CR.rosterSettings.controls = false; - } - else - { - this.label = hideControlsText; - CR.rosterSettings.controls = true; - } - CR.compactMenu.items[0].label = CR.rosterSettings.controls ? hideControlsText : showControlsText; - localStorage.rosterSettings = JSON.stringify(CR.rosterSettings); - setVisual(); + toggleShowControls(); } }); CR.menu.append(item); @@ -1744,63 +1858,7 @@ function addControls() label: CR.rosterSettings.controls ? hideControlsText : showControlsText, click: function () { - if (this.label == hideControlsText) - { - this.label = showControlsText; - CR.rosterSettings.controls = false; - } - else - { - this.label = hideControlsText; - CR.rosterSettings.controls = true; - } - CR.menu.items[0].label = CR.rosterSettings.controls ? hideControlsText : showControlsText; - localStorage.rosterSettings = JSON.stringify(CR.rosterSettings); - setVisual(); - } - }); - CR.compactMenu.append(item); - - item = new nw.MenuItem({ - type: "normal", - label: $.i18n("roster.menu.Settings"), - click: function () - { - openSettings(); - } - }); - CR.menu.append(item); - - item = new nw.MenuItem({ - type: "normal", - label: $.i18n("roster.menu.Settings"), - click: function () - { - openSettings(); - } - }); - CR.compactMenu.append(item); - - item = new nw.MenuItem({ - type: "normal", - label: $.i18n("roster.menu.CompactMode"), - click: function () - { - CR.rosterSettings.compact = true; - localStorage.rosterSettings = JSON.stringify(CR.rosterSettings); - resize(); - } - }); - CR.menu.append(item); - - item = new nw.MenuItem({ - type: "normal", - label: $.i18n("roster.menu.RosterMode"), - click: function () - { - CR.rosterSettings.compact = false; - localStorage.rosterSettings = JSON.stringify(CR.rosterSettings); - resize(); + toggleShowControls(); } }); CR.compactMenu.append(item); @@ -1828,6 +1886,17 @@ function addControls() }); CR.callMenu.append(item); + item = new nw.MenuItem({ + type: "normal", + label: $.i18n("roster.add.watcher.label"), + click: function () + { + addWatcher(CR.callRoster[CR.targetHash].DEcall, "Callsign"); + } + }); + + CR.callMenu.append(item); + item = new nw.MenuItem({ type: "separator" }); CR.callMenu.append(item); @@ -1853,10 +1922,19 @@ function addControls() label: $.i18n("roster.menu.IgnoreCall"), click: function () { - let thisCall = CR.callRoster[CR.targetHash].DEcall; - CR.blockedCalls[thisCall] = true; - storeBlocks(); - viewRoster(); + ignoreCallsign(CR.callRoster[CR.targetHash].DEcall); + } + }); + + CR.callMenu.append(item); + + item = new nw.MenuItem({ + type: "normal", + label: $.i18n("roster.menu.EditIgnores"), + enabled: true, + click: function () + { + openIgnores(); } }); @@ -1885,9 +1963,23 @@ function addControls() CR.callingMenu.append(item); + item = new nw.MenuItem({ + type: "normal", + label: $.i18n("roster.add.watcher.label"), + click: function () + { + addWatcher(CR.callRoster[CR.targetHash].DXcall, "Callsign"); + } + }); + + CR.callingMenu.append(item); + item = new nw.MenuItem({ type: "separator" }); CR.menu.append(item); + item = new nw.MenuItem({ type: "separator" }); + CR.callingMenu.append(item); + if (window.opener.GT.pstrotatorSettings.enable) { item = new nw.MenuItem({ @@ -1900,9 +1992,6 @@ function addControls() } }); CR.callingMenu.append(item); - - item = new nw.MenuItem({ type: "separator" }); - CR.callingMenu.append(item); } item = new nw.MenuItem({ @@ -1918,10 +2007,9 @@ function addControls() }); CR.menu.append(item); - item = new nw.MenuItem({ type: "separator" }); - CR.menu.append(item); + CR.columnMenu = new nw.Menu(); - CR.menuItemForCurrentColumn = new nw.MenuItem({ + CR.menuItemForMoveLeftColumn = new nw.MenuItem({ type: "normal", label: $.i18n("roster.menu.MoveLeft"), click: function () @@ -1929,10 +2017,20 @@ function addControls() moveColumnLeft(CR.currentColumnName); } }) - CR.menu.append(CR.menuItemForCurrentColumn) + CR.columnMenu.append(CR.menuItemForMoveLeftColumn) + + CR.menuItemForMoveRightColumn = new nw.MenuItem({ + type: "normal", + label: $.i18n("roster.menu.MoveRight"), + click: function () + { + moveColumnRight(CR.currentColumnName); + } + }) + CR.columnMenu.append(CR.menuItemForMoveRightColumn) item = new nw.MenuItem({ type: "separator" }); - CR.menu.append(item); + CR.columnMenu.append(item); for (const columnIndex in CR.rosterSettings.columnOrder) { @@ -1945,62 +2043,47 @@ function addControls() checked: CR.rosterSettings.columns[key], click: function () { - CR.rosterSettings.columns[this.label] = this.checked; - if (this.label == "Spot") - { window.opener.setRosterSpot(CR.rosterSettings.columns.Spot); } - writeRosterSettings(); - viewRoster(); - resize(); + toggleColumn(this); } }); - CR.menu.append(itemx); + CR.columnMenu.append(itemx); + CR.columnMembers[key] = itemx; } } - item = new nw.MenuItem({ type: "separator" }); - CR.menu.append(item); + CR.MsgMenu = new nw.Menu(); - CR.clearIgnores = new nw.MenuItem({ + item = new nw.MenuItem({ type: "normal", - label: "Clear Call Ignore", - enabled: false, + label: $.i18n("roster.add.watcher.label"), click: function () { - CR.blockedCalls = Object(); - storeBlocks(); - viewRoster(); + addWatcher(CR.callRoster[CR.targetHash].callObj.msg, "Message"); } }); - CR.menu.append(CR.clearIgnores); - CR.clearIgnoresCall = new nw.MenuItem({ - type: "normal", - label: "Clear Ignore", - enabled: false, - click: function () - { - CR.blockedCalls = Object(); - storeBlocks(); - viewRoster(); - } - }); - CR.callMenu.append(CR.clearIgnoresCall); + CR.MsgMenu.append(item); CR.CQMenu = new nw.Menu(); + item = new nw.MenuItem({ + type: "normal", + label: $.i18n("roster.add.watcher.label"), + click: function () + { + addWatcher(CR.callRoster[CR.targetCQ].DXcall, "Calling"); + } + }); + + CR.CQMenu.append(item); + item = new nw.MenuItem({ type: "normal", label: "Ignore CQ from DXCC", click: function () { - CR.blockedCQ[ - CR.callRoster[CR.targetCQ].DXcall + - " from " + - window.opener.GT.dxccToAltName[CR.callRoster[CR.targetCQ].callObj.dxcc] - ] = true; - storeBlocks(); - viewRoster(); + ignoreCQ(CR.callRoster[CR.targetCQ].DXcall, CR.callRoster[CR.targetCQ].callObj.dxcc); } }); @@ -2011,100 +2094,32 @@ function addControls() label: "Ignore CQ from All", click: function () { - CR.blockedCQ[CR.callRoster[CR.targetCQ].DXcall + " from All"] = true; - storeBlocks(); - viewRoster(); + ignoreCQ(CR.callRoster[CR.targetCQ].DXcall, -1); } }); CR.CQMenu.append(item); - CR.clearCQIgnoreMainMenu = new nw.MenuItem({ - type: "normal", - label: "Clear CQ Ignore", - enabled: false, - click: function () - { - CR.blockedCQ = Object(); - storeBlocks(); - viewRoster(); - } - }); - CR.menu.append(CR.clearCQIgnoreMainMenu); - - CR.clearCQIgnore = new nw.MenuItem({ - type: "normal", - label: "Clear Ignore", - enabled: false, - click: function () - { - CR.blockedCQ = Object(); - storeBlocks(); - viewRoster(); - } - }); - CR.CQMenu.append(CR.clearCQIgnore); - - item = new nw.MenuItem({ - type: "normal", - label: "Edit Ignores", - enabled: true, - click: function () - { - openIgnoreEdit(); - } - }); - CR.CQMenu.append(item); - CR.CQzMenu = new nw.Menu(); item = new nw.MenuItem({ type: "normal", - label: "Ignore CQ Zone", + label: $.i18n("roster.menu.IgnoreCQZone"), click: function () { - CR.blockedCQz[CR.callRoster[CR.targetCQz].callObj.cqz] = true; - storeBlocks(); - viewRoster(); + ignoreCQz(CR.callRoster[CR.targetCQz].callObj.cqz); } }); CR.CQzMenu.append(item); - CR.clearCQzIgnoreMainMenu = new nw.MenuItem({ - type: "normal", - label: "Clear CQ Zone Ignore", - enabled: false, - click: function () - { - CR.blockedCQz = Object(); - storeBlocks(); - viewRoster(); - } - }); - - CR.clearCQzIgnore = new nw.MenuItem({ - type: "normal", - label: "Clear Ignore", - enabled: false, - click: function () - { - CR.blockedCQz = Object(); - storeBlocks(); - viewRoster(); - } - }); - CR.CQzMenu.append(CR.clearCQzIgnore); - - CR.CQzMenu.append(CR.clearCQzIgnoreMainMenu); - item = new nw.MenuItem({ type: "normal", - label: "Edit Ignores", + label: $.i18n("roster.menu.EditIgnores"), enabled: true, click: function () { - openIgnoreEdit(); + openIgnores(); } }); @@ -2114,52 +2129,22 @@ function addControls() item = new nw.MenuItem({ type: "normal", - label: "Ignore ITU Zone", + label: $.i18n("roster.menu.IgnoreITUZone"), click: function () { - CR.blockedITUz[CR.callRoster[CR.targetITUz].callObj.ituz] = true; - storeBlocks(); - viewRoster(); + ignoreITUz(CR.callRoster[CR.targetITUz].callObj.itu); } }); CR.ITUzMenu.append(item); - CR.clearITUzIgnoreMainMenu = new nw.MenuItem({ - type: "normal", - label: "Clear ITU Zone Ignore", - enabled: false, - click: function () - { - CR.blockedITUz = Object(); - storeBlocks(); - viewRoster(); - } - }); - - CR.ITUzMenu.append(CR.clearITUzIgnoreMainMenu); - - CR.clearITUzIgnore = new nw.MenuItem({ - type: "normal", - label: "Clear Ignore", - enabled: false, - click: function () - { - CR.blockedITUz = Object(); - storeBlocks(); - viewRoster(); - } - }); - - CR.ITUzMenu.append(CR.clearITUzIgnore); - item = new nw.MenuItem({ type: "normal", - label: "Edit Ignores", + label: $.i18n("roster.menu.EditIgnores"), enabled: true, click: function () { - openIgnoreEdit(); + openIgnores(); } }); @@ -2169,74 +2154,25 @@ function addControls() item = new nw.MenuItem({ type: "normal", - label: "Ignore DXCC", + label: $.i18n("roster.menu.IgnoreDXCC"), click: function () { - CR.blockedDxcc[CR.targetDxcc] = true; - storeBlocks(); - viewRoster(); + ignoreDxcc(CR.targetDxcc); } }); CR.dxccMenu.append(item); - CR.clearDxccIgnoreMainMenu = new nw.MenuItem({ - type: "normal", - label: "Clear DXCC Ignore", - enabled: false, - click: function () - { - CR.blockedDxcc = Object(); - storeBlocks(); - viewRoster(); - } - }); - CR.menu.append(CR.clearDxccIgnoreMainMenu); - - CR.clearDxccIgnore = new nw.MenuItem({ - type: "normal", - label: "Clear Ignore", - enabled: false, - click: function () - { - CR.blockedDxcc = Object(); - storeBlocks(); - viewRoster(); - } - }); - CR.dxccMenu.append(CR.clearDxccIgnore); - item = new nw.MenuItem({ type: "normal", - label: "Edit Ignores", + label: $.i18n("roster.menu.EditIgnores"), enabled: true, click: function () { - openIgnoreEdit(); + openIgnores(); } }); - CR.menu.append(item); - item = new nw.MenuItem({ - type: "normal", - label: "Edit Ignores", - enabled: true, - click: function () - { - openIgnoreEdit(); - } - }); - CR.callMenu.append(item); - - item = new nw.MenuItem({ - type: "normal", - label: "Edit Ignores", - enabled: true, - click: function () - { - openIgnoreEdit(); - } - }); CR.dxccMenu.append(item); callsignNeed.value = CR.rosterSettings.callsign; @@ -2262,11 +2198,6 @@ function addControls() noMyDxcc.checked = CR.rosterSettings.noMyDxcc; onlyMyDxcc.checked = CR.rosterSettings.onlyMyDxcc; - noMsg.checked = CR.rosterSettings.noMsg; - onlyMsg.checked = CR.rosterSettings.onlyMsg; - noMsgValue.value = CR.rosterSettings.noMsgValue; - onlyMsgValue.value = CR.rosterSettings.onlyMsgValue; - usesLoTW.checked = CR.rosterSettings.usesLoTW; useseQSL.checked = CR.rosterSettings.useseQSL; onlySpot.checked = CR.rosterSettings.onlySpot; @@ -2274,45 +2205,41 @@ function addControls() referenceNeed.value = CR.rosterSettings.reference; allOnlyNew.checked = CR.rosterSettings.allOnlyNew; - useRegex.checked = CR.rosterSettings.useRegex; - callsignRegex.value = CR.rosterSettings.callsignRegex; - huntRegexValue.value = CR.rosterSettings.huntRegexValue; - - noUnknownDXCC.checked = CR.rosterSettings.noUnknownDXCC; clearRosterOnBandChange.checked = CR.rosterSettings.clearRosterOnBandChange; rosterAlwaysOnTop.checked = CR.rosterSettings.rosterAlwaysOnTop; + animateCQGT.checked = CR.rosterSettings.animateCQGT; rosterDelayOnFocus.checked = CR.rosterSettings.rosterDelayOnFocus; displayDelayOnFocus(); rosterDelayTime.value = CR.rosterSettings.rosterDelayTime; rosterDelayTimeTd.innerHTML = rosterDelayTime.value + "ms"; setRosterTimeView(); - - for (const column in ROSTER_COLUMNS) - { - if (column != "Callsign") - { - let option = newOption(column, column); - if (column == CR.rosterSettings.compactEntity) - { - option.selected = true; - } - compactEntitySelect.appendChild(option); - } - } - + setCompactView(); + initSelectors(); setVisual(); document.addEventListener("keydown", onMyKeyDown, false); - - initDXCCSelector(); CR.timerInterval = nodeTimers.setInterval(realtimeRoster, 1000); - updateInstances(); } +function setCompactView() +{ + compactModeDiv.innerHTML = CR.rosterSettings.compact ? $.i18n("roster.menu.RosterMode") : $.i18n("roster.menu.CompactMode"); + compactEnityDiv.style.display = CR.rosterSettings.compact ? "" : "none"; + columnsBoxDiv.style.display = columnsbox.style.display = CR.rosterSettings.compact ? "none" : ""; +} +function compactModeChanged() +{ + CR.rosterSettings.compact = !CR.rosterSettings.compact; + writeRosterSettings(); + setCompactView(); + viewRoster(); +} + function compactEntityChanged() { CR.rosterSettings.compactEntity = compactEntitySelect.value; + writeRosterSettings(); viewRoster(); } @@ -2358,6 +2285,12 @@ function changeRosterTime() viewRoster(); } +function changeAnimateCQGT(butt) +{ + CR.rosterSettings.animateCQGT = butt.checked; + viewRoster(); +} + function changeRosterTop(butt) { CR.rosterSettings.rosterAlwaysOnTop = butt.checked; @@ -2377,100 +2310,12 @@ function setRosterTimeView() function handleContextMenu(ev) { - if (editView.style.display == "inline-block") return false; - let mouseX = Math.round(ev.x); let mouseY = Math.round(ev.y); - let len = Object.keys(CR.blockedCalls).length; - if (len > 0) - { - CR.clearIgnores.enabled = true; - CR.clearIgnores.label = - "Clear Call Ignore" + (len > 1 ? "s (" + len + ")" : ""); - CR.clearIgnoresCall.enabled = true; - CR.clearIgnoresCall.label = - "Clear Ignore" + (len > 1 ? "s (" + len + ")" : ""); - } - else - { - CR.clearIgnores.label = "Clear Call Ignore"; - CR.clearIgnores.enabled = false; - CR.clearIgnoresCall.label = "Clear Ignore"; - CR.clearIgnoresCall.enabled = false; - } - - len = Object.keys(CR.blockedDxcc).length; - if (len > 0) - { - CR.clearDxccIgnoreMainMenu.enabled = true; - CR.clearDxccIgnoreMainMenu.label = - "Clear DXCC Ignore" + (len > 1 ? "s (" + len + ")" : ""); - CR.clearDxccIgnore.enabled = true; - CR.clearDxccIgnore.label = - "Clear Ignore" + (len > 1 ? "s (" + len + ")" : ""); - } - else - { - CR.clearDxccIgnoreMainMenu.label = "Clear DXCC Ignore"; - CR.clearDxccIgnoreMainMenu.enabled = false; - CR.clearDxccIgnore.label = "Clear Ignore"; - CR.clearDxccIgnore.enabled = false; - } - - len = Object.keys(CR.blockedCQ).length; - if (len > 0) - { - CR.clearCQIgnoreMainMenu.enabled = true; - CR.clearCQIgnoreMainMenu.label = - "Clear CQ Ignore" + (len > 1 ? "s (" + len + ")" : ""); - CR.clearCQIgnore.enabled = true; - CR.clearCQIgnore.label = "Clear Ignore" + (len > 1 ? "s (" + len + ")" : ""); - } - else - { - CR.clearCQIgnoreMainMenu.label = "Clear CQ Ignore"; - CR.clearCQIgnoreMainMenu.enabled = false; - CR.clearCQIgnore.label = "Clear Ignore"; - CR.clearCQIgnore.enabled = false; - } - - len = Object.keys(CR.blockedCQz).length; - if (len > 0) - { - CR.clearCQzIgnoreMainMenu.enabled = true; - CR.clearCQzIgnoreMainMenu.label = - "Clear CQ Zone Ignore" + (len > 1 ? "s (" + len + ")" : ""); - CR.clearCQzIgnore.enabled = true; - CR.clearCQzIgnore.label = "Clear Ignore" + (len > 1 ? "s (" + len + ")" : ""); - } - else - { - CR.clearCQzIgnoreMainMenu.label = "Clear CQ Zone Ignore"; - CR.clearCQzIgnoreMainMenu.enabled = false; - CR.clearCQzIgnore.label = "Clear Ignore"; - CR.clearCQzIgnore.enabled = false; - } - - len = Object.keys(CR.blockedITUz).length; - if (len > 0) - { - CR.clearITUzIgnoreMainMenu.enabled = true; - CR.clearITUzIgnoreMainMenu.label = - "Clear ITU Zone Ignore" + (len > 1 ? "s (" + len + ")" : ""); - CR.clearITUzIgnore.enabled = true; - CR.clearITUzIgnore.label = "Clear Ignore" + (len > 1 ? "s (" + len + ")" : ""); - } - else - { - CR.clearITUzIgnoreMainMenu.label = "Clear ITU Zone Ignore"; - CR.clearITUzIgnoreMainMenu.enabled = false; - CR.clearITUzIgnore.label = "Clear Ignore"; - CR.clearITUzIgnore.enabled = false; - } - if (typeof ev.target != "undefined") { + if (ev.target.className == "inputTextValue") return true; if (CR.developerMode) { if ((ev.target.id == "ShowMoreControlsLink") || @@ -2483,37 +2328,52 @@ function handleContextMenu(ev) } let name = ""; - if (ev.target.tagName == "TD" || (CR.rosterSettings.compact && ev.target.tagName == "DIV")) + let target = ev.target; + let parent = ev.target.parentNode; + if (target.tagName == "SPAN") { - name = ev.target.getAttribute("name"); + target = ev.target.parentNode; + parent = target.parentNode; + } + if (target.tagName == "TD" || (CR.rosterSettings.compact && target.tagName == "DIV")) + { + name = target.getAttribute("name"); + } + if (CR.rosterSettings.compact && name != "Callsign") + { + parent = parent.parentNode; } - if (name == "Callsign") { - CR.targetHash = ev.target.parentNode.id; + CR.targetHash = parent.id; CR.callMenu.popup(mouseX, mouseY); } else if (name == "Calling") { - CR.targetHash = ev.target.parentNode.id; + CR.targetHash = parent.id; CR.callingMenu.popup(mouseX, mouseY); } + else if (name == "Msg") + { + CR.targetHash = parent.id; + CR.MsgMenu.popup(mouseX, mouseY); + } else if (name == "CQ") { - if (CR.callRoster[ev.target.parentNode.id].DXcall != "CQ") + if (CR.callRoster[parent.id].DXcall != "CQ") { - CR.targetCQ = ev.target.parentNode.id; + CR.targetCQ = parent.id; CR.CQMenu.popup(mouseX, mouseY); } } else if (name == "CQz") { - CR.targetCQz = ev.target.parentNode.id; + CR.targetCQz = parent.id; CR.CQzMenu.popup(mouseX, mouseY); } else if (name == "ITUz") { - CR.targetITUz = ev.target.parentNode.id; + CR.targetITUz = parent.id; CR.ITUzMenu.popup(mouseX, mouseY); } else if (name && name.startsWith("DXCC")) @@ -2531,18 +2391,35 @@ function handleContextMenu(ev) } else { - if (ev.target.tagName == "TH" && ev.target.getAttribute("name")) + if (target.tagName == "TH" && target.getAttribute("name")) { - CR.menuItemForCurrentColumn.enabled = true; - CR.currentColumnName = ev.target.getAttribute("name"); + CR.menuItemForMoveLeftColumn.enabled = true; + CR.menuItemForMoveRightColumn.enabled = true; + + CR.currentColumnName = target.getAttribute("name"); + + const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true }); + const pos = columns.indexOf(CR.currentColumnName); + if (pos == 0) + { + CR.menuItemForMoveLeftColumn.enabled = false; + CR.menuItemForMoveRightColumn.enabled = false; + } + else if (pos == 1) + { + CR.menuItemForMoveLeftColumn.enabled = false; + } + if (pos + 1 == Object.keys(columns).length) + { + CR.menuItemForMoveRightColumn.enabled = false; + } + + CR.columnMenu.popup(mouseX, mouseY); } else { - CR.menuItemForCurrentColumn.enabled = false; - CR.currentColumnName = null; + CR.menu.popup(mouseX, mouseY); } - - CR.menu.popup(mouseX, mouseY); } } } @@ -3763,3 +3640,404 @@ function listShortInstances() } return shortInstances; } + +function openInfoTab(evt, tabName, callFunc, callObj) +{ + // Declare all variables + var i, infoTabcontent, infoTablinks; + // Get all elements with class="infoTabcontent" and hide them + infoTabcontent = document.getElementsByClassName("infoTabcontent"); + for (i = 0; i < infoTabcontent.length; i++) + { + infoTabcontent[i].style.display = "none"; + } + // Get all elements with class="infoTablinks" and remove the class "active" + infoTablinks = document.getElementsByClassName("infoTablinks"); + for (i = 0; i < infoTablinks.length; i++) + { + infoTablinks[i].className = infoTablinks[i].className.replace( + " active", + "" + ); + } + // Show the current tab, and add an "active" class to the button that opened the tab + + document.getElementById(tabName).style.display = "block"; + if (typeof evt == "string") + { + for (i = 0; i < infoTablinks.length; i++) + { + if (infoTablinks[i].id == evt) + { + infoTablinks[i].className += " active"; + } + } + } + else if (typeof evt.currentTarget != "undefined") + { + evt.currentTarget.className += " active"; + } + else + { + evt.className += " active"; + } + + if (callFunc) + { + if (typeof callFunc == "function") + { + if (callObj) callFunc(callObj); + else callFunc(); + } + } +} + +function ValidateTextInput(inputText, validDiv = null) +{ + if (inputText.value.length > 0) + { + var passed = false; + inputText.value = inputText.value.toUpperCase(); + if (/\d/.test(inputText.value) || /[A-Z]/.test(inputText.value)) + { + passed = true; + } + if (passed) + { + inputText.style.color = "#FF0"; + inputText.style.backgroundColor = "green"; + if (validDiv) validDiv.innerHTML = ""; + return true; + } + else + { + inputText.style.color = "#000"; + inputText.style.backgroundColor = "yellow"; + if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Invalid"); + return false; + } + } + else + { + inputText.style.color = "#000"; + inputText.style.backgroundColor = "yellow"; + if (validDiv) validDiv.innerHTML = $.i18n("stats.Validate.Invalid"); + return false; + } +} + +function watcherOnName() +{ + watcherName.value = watcherName.value.replace(/[$%.'",<>]/g, ""); + watcherNameValidate(); +} + +function watcherNameValidate() +{ + if (watcherName.value.length == 0 || (watcherName.value in CR.watchers && watcherName.value != CR.watcherEditKey)) + { + watcherName.style.color = "#000"; + watcherName.style.backgroundColor = "red"; + return false; + } + else + { + watcherName.style.color = ""; + watcherName.style.backgroundColor = ""; + return true; + } +} + +function watcherTypeChanged(value) +{ + watcherType.value = value; + if (value == "Callsign") + { + // fix i18n + watcherTextTh.innerHTML = "Callsign"; + } + if (value == "Calling") + { + // fix i18n + watcherTextTh.innerHTML = "Calling"; + } + if (value == "Message") + { + watcherTextTh.innerHTML = $.i18n("gt.WSJTMessage.Message"); + } + + watcherStartDateEnable(watcherStartDateCheckbox.checked); + watcherEndDateEnable(watcherEndDateCheckbox.checked); +} + +function watcherRegexChanged(checked) +{ + watcherOnText(); +} + +function watcherOnText() +{ + var testCallsign = false; + if (watcherRegexCheckbox.checked == false) + { + if (watcherType.value == "Message") + { + watcherText.value = watcherText.value.toUpperCase().replace(/[^A-Z0-9/<>\s]+/g, ""); + } + else if (watcherType.value == "Calling") + { + testCallsign = true; + watcherText.value = watcherText.value.toUpperCase().replace(/[^A-Z0-9/\s]+/g, ""); + } + else + { + testCallsign = true; + watcherText.value = watcherText.value.toUpperCase().replace(/[^A-Z0-9/]+/g, ""); + } + } + watcherTextValidate(testCallsign); +} + +function watcherTextValidate(testCallsign = false) +{ + if (watcherText.value.length == 0) + { + watcherText.style.color = "#000"; + watcherText.style.backgroundColor = "red"; + return false; + } + else + { + if (testCallsign && !watcherText.value.match(CALLSIGN_REGEXP)) + { + watcherText.style.color = "#000"; + watcherText.style.backgroundColor = "yellow"; + } + else + { + watcherText.style.color = ""; + watcherText.style.backgroundColor = ""; + } + return true; + } +} + +function watcherStartDateEnable(checked) +{ + watcherStartDateTh.style.display = watcherStartDateTd.style.display = (checked ? "" : "none"); +} + +function watcherEndDateEnable(checked) +{ + watcherAutoDeleteTd.style.display = watcherAutoDeleteTh.style.display = watcherEndDateTh.style.display = watcherEndDateTd.style.display = (checked ? "" : "none"); +} + +function newWatcherEntry() +{ + let entry = Object(); + + entry.watch = true; + entry.type = "Callsign"; + entry.regex = false; + entry.text = ""; + entry.test = null; + entry.start = false; + entry.end = false; + entry.startTime = Date.now(); + entry.startTime -= (entry.startTime % 86400000); + entry.endTime = Date.now(); + entry.endTime -= (entry.endTime % 86400000); + entry.autoDelete = false; + + return entry; +} + +function saveWatcher() +{ + watcherName.value = watcherName.value.trim(); + watcherText.value = watcherText.value.trim(); + if (watcherNameValidate() == false || watcherTextValidate() == false) return; + + if (CR.watcherEditKey.length > 0 && CR.watcherEditKey in CR.watchers) + { + delete CR.watchers[CR.watcherEditKey]; + } + + let entry = newWatcherEntry(); + entry.watch = true; + entry.type = watcherType.value; + entry.regex = watcherRegexCheckbox.checked; + entry.text = watcherText.value; + entry.test = null; + entry.start = watcherStartDateCheckbox.checked; + entry.end = watcherEndDateCheckbox.checked; + entry.autoDelete = entry.end ? watcherAutoDeleteCheckbox.checked : false; + + if (entry.start) + { + if (watcherStartDate.value.length == 0) + { + entry.startTime = Date.now(); + } + else + { + entry.startTime = Date.parse(watcherStartDate.value + "Z"); + } + } + + if (entry.end) + { + if (watcherEndDate.value.length == 0) + { + entry.endTime = Date.now(); + } + else + { + entry.endTime = Date.parse(watcherEndDate.value + "Z"); + } + if (entry.start && entry.endTime <= entry.startTime) + { + // Good for a minute, least we can do :) + entry.endTime = entry.startTime + 60000; + } + } + CR.watchers[watcherName.value] = entry; + writeRosterSettings(); + openWathcherTab(); + window.opener.goProcessRoster(); +} + +function addWatcher(value, type) +{ + if (!(value in CR.watchers)) + { + let entry = newWatcherEntry(); + entry.watch = true; + entry.type = type; + entry.regex = false; + entry.text = value; + entry.test = null; + entry.autoDelete = false; + CR.watchers[value] = entry; + CR.rosterSettings.wanted.huntWatcher = huntWatcher.checked = true; + writeRosterSettings(); + window.opener.goProcessRoster(); + wantRenderWatchersTab(); + } +} + +function clearWatcher() +{ + CR.watcherEditKey = ""; + + watcherName.style.color = ""; + watcherName.style.backgroundColor = ""; + watcherText.style.color = ""; + watcherText.style.backgroundColor = ""; + + loadWatcherValues("", newWatcherEntry()); +} + +function toggleWatcher(key) +{ + CR.watchers[key].watch = !CR.watchers[key].watch; + writeRosterSettings(); + wantRenderWatchersTab(); + window.opener.goProcessRoster(); +} + +function deleteWatcher(key) +{ + delete CR.watchers[key]; + writeRosterSettings(); + wantRenderWatchersTab(); + window.opener.goProcessRoster(); +} + +CR.watcherEditKey = ""; + +function editWatcher(key) +{ + CR.watcherEditKey = key; + + loadWatcherValues(key, CR.watchers[key]); +} + +function loadWatcherValues(key, entry) +{ + watcherName.value = key; + watcherType.vale = entry.type; + watcherRegexCheckbox.checked = entry.regex; + watcherText.value = entry.text; + watcherStartDateCheckbox.checked = entry.start; + watcherEndDateCheckbox.checked = entry.end; + let date = new Date(entry.startTime); + watcherStartDate.value = date.toISOString().slice(0, 16); + date = new Date(entry.endTime); + watcherEndDate.value = date.toISOString().slice(0, 16); + watcherAutoDeleteCheckbox.checked = entry.autoDelete; + watcherTypeChanged(entry.type); +} + +function htmlEntities(str) +{ + return String(str) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); +} + +function openWathcherTab() +{ + clearWatcher(); + wantRenderWatchersTab(); +} + +function wantRenderWatchersTab() +{ + if (watcherBoxDiv.style.display != "none") + { + renderWatchersTab(); + } +} + +function renderWatchersTab() +{ + if (Object.keys(CR.watchers).length > 0) + { + let worker = "
"; + Object.keys(CR.watchers) + .sort((a, b) => a.toLowerCase() < b.toLowerCase() ? -1 : 1) + .forEach(function (key) + { + worker += ""; + worker += ""; + let text = htmlEntities(CR.watchers[key].text); + worker += ""; + worker += ""; + worker += ""; + worker += ""; + worker += ""; + }); + worker += "
👁️NameTypeRegexTextStart DateEnd DateEditDelete
" + (CR.watchers[key].watch ? "👀" : "🙈") + "" + key + "" + CR.watchers[key].type + "" + (CR.watchers[key].regex ? "☑️" : "") + "" + (CR.watchers[key].regex ? text : formatCallsign(text)) + "" + (CR.watchers[key].start ? window.opener.userTimeString(CR.watchers[key].startTime) : "") + "" + (CR.watchers[key].end ? window.opener.userTimeString(CR.watchers[key].endTime) : "") + "📝"; + worker += CR.watchers[key].autoDelete ? "🤖" : "🚮"; + worker += "
"; + + watcherEditView.innerHTML = worker; + let height = 40; + if (watcherBoxDiv.offsetHeight >= window.innerHeight - height) + { + watcherBoxDiv.style.height = (window.innerHeight - height) + "px"; + } + else + { + watcherBoxDiv.style.height = ""; + } + } + else + { + watcherBoxDiv.style.height = ""; + watcherEditView.innerHTML = ""; + } +} diff --git a/package.nw/lib/roster/prepareRosterSettings.js b/package.nw/lib/roster/prepareRosterSettings.js index 893078e..b48eb83 100644 --- a/package.nw/lib/roster/prepareRosterSettings.js +++ b/package.nw/lib/roster/prepareRosterSettings.js @@ -29,31 +29,6 @@ function prepareRosterSettings() window.opener.GT.appSettings.gtShareEnable == true && window.opener.GT.appSettings.gtMsgEnable == true; - // The following 3 sections deal with QSLing, do we break them out - // individually or lump them into a qslUser function that sets - // all three at the same time? - // this section is for LoTW users, can be a function - if (window.opener.GT.callsignLookups.lotwUseEnable == true) - { - usesLoTWDiv.style.display = ""; - if (CR.rosterSettings.usesLoTW == true) - { - maxLoTW.style.display = ""; - maxLoTWView.style.display = ""; - } - else - { - maxLoTW.style.display = "none"; - maxLoTWView.style.display = "none"; - } - } - else - { - usesLoTWDiv.style.display = "none"; - maxLoTW.style.display = "none"; - maxLoTWView.style.display = "none"; - } - if (CR.rosterSettings.huntNeed == "mixed") { rosterSettings.huntIndex = CR.confirmed; diff --git a/package.nw/lib/roster/processRosterFiltering.js b/package.nw/lib/roster/processRosterFiltering.js index b394fff..969a0e2 100644 --- a/package.nw/lib/roster/processRosterFiltering.js +++ b/package.nw/lib/roster/processRosterFiltering.js @@ -53,11 +53,6 @@ function processRosterFiltering(callRoster, rosterSettings) entry.tx = false; continue; } - if (CR.rosterSettings.noUnknownDXCC && callObj.dxcc == -1) - { - entry.tx = false; - continue; - } if (window.opener.GT.instances[callObj.instance].crEnable == false) { entry.tx = false; @@ -68,7 +63,7 @@ function processRosterFiltering(callRoster, rosterSettings) entry.tx = false; continue; } - if (entry.DXcall + " from All" in CR.blockedCQ || entry.DXcall + " from " + window.opener.GT.dxccToAltName[callObj.dxcc] in CR.blockedCQ) + if (entry.DXcall in CR.ignoredCQ || entry.DXcall + ":" + callObj.dxcc in CR.ignoredCQ) { entry.tx = false; continue; @@ -104,19 +99,6 @@ function processRosterFiltering(callRoster, rosterSettings) continue; } } - if (CR.rosterSettings.useRegex && CR.rosterSettings.callsignRegex.length > 0) - { - var regexObj = regexObj || new RegExp(CR.rosterSettings.callsignRegex, "i") - try - { - if (!call.match(regexObj)) - { - entry.tx = false; - continue; - } - } - catch (e) {} - } if (CR.rosterSettings.requireGrid == true && callObj.grid.length != 4) { entry.tx = false; @@ -143,31 +125,6 @@ function processRosterFiltering(callRoster, rosterSettings) continue; } - if (CR.rosterSettings.noMsg == true) - { - try - { - if (callObj.msg.match(CR.rosterSettings.noMsgValue)) - { - entry.tx = false; - continue; - } - } - catch (e) {} - } - if (CR.rosterSettings.onlyMsg == true) - { - try - { - if (!callObj.msg.match(CR.rosterSettings.onlyMsgValue)) - { - entry.tx = false; - continue; - } - } - catch (e) {} - } - if (callObj.dxcc == window.opener.GT.myDXCC) { if (CR.rosterSettings.noMyDxcc == true) diff --git a/package.nw/lib/roster/processRosterHunting.js b/package.nw/lib/roster/processRosterHunting.js index 10e783f..233e8c2 100644 --- a/package.nw/lib/roster/processRosterHunting.js +++ b/package.nw/lib/roster/processRosterHunting.js @@ -3,7 +3,6 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) // these lets, do they rely on anything between the top and here? // if not could they be put in the let list at the beginning? let hasGtPin = false; - let inversionAlpha = "DD"; let row = "#000000"; let bold = "#000000;font-weight: bold;"; @@ -18,6 +17,29 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) const potaEnabled = (window.opener.GT.appSettings.potaEnabled == 1); // TODO: Hunting results might be used to filter, based on the "Callsigns: Only Wanted" option, // so maybe we can move this loop first, and add a check to the filtering loop? + + // award tracker overrides + let awardTrackerOverrides = { + call: false, + grids: false, + dxcc: false, + states: false, + cnty: false, + cqz: false, + px: false, + cont: false + }; + + if (CR.rosterSettings.reference == LOGBOOK_AWARD_TRACKER) + { + for (let key in awardTracker) + { + if (awardTracker[key].enable) + { + awardTrackerOverrides[awardTracker[key].rule.type] = true; + } + } + } // Second loop, hunting and highlighting for (const callHash in callRoster) @@ -63,10 +85,12 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) let callsign = entry.DEcall; - callObj.hunting = {} - callObj.callFlags = {} - callObj.style = callObj.style || {} - callObj.DEcallHTML = callObj.DEcall + callObj.hunting = {}; + callObj.callFlags = {}; + callObj.style = callObj.style || {}; + callObj.DEcallHTML = null; + callObj.DXcallHTML = null; + callObj.msgHTML = null; let colorObject = Object(); @@ -95,11 +119,8 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) ""; let cntyPointer = (callObj.cnty && callObj.qual == false) ? "cursor: pointer;" : ""; - let didWork = false; - let hash = callsign + workHashSuffix; - let layeredHash = layeredHashSuffix && (callsign + layeredHashSuffix) // Call worked in current logbook settings, regardless of hunting mode if (hash in CR.worked.call) @@ -170,28 +191,6 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) } } - // award tracker overrides - let awardTrackerOverrides = { - call: false, - grids: false, - dxcc: false, - states: false, - cnty: false, - cqz: false, - px: false, - cont: false - }; - if (CR.rosterSettings.reference == LOGBOOK_AWARD_TRACKER) - { - for (let key in awardTracker) - { - if (awardTracker[key].enable) - { - awardTrackerOverrides[awardTracker[key].rule.type] = true; - } - } - } - // Hunting for callsigns if (huntCallsign.checked || awardTrackerOverrides.call) { @@ -251,25 +250,9 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) } } - if (huntRegex.checked == true && CR.rosterSettings.huntRegexValue.length > 0) + if (huntWatcher.checked) { - var huntRegexObj = huntRegexObj || new RegExp(CR.rosterSettings.huntRegexValue, "gi") - try - { - if (callsign.match(huntRegexObj)) - { - shouldAlert = true; - callObj.reason.push("regex"); - callObj.hunting.regex = "hunted"; - callObj.DEcallHTML = callsign.replace(huntRegexObj, (x, y) => `${x}`) - if (!callObj.hunting.call && !callObj.callFlags.worked) - { - callBg = `${call}${inversionAlpha};`; - call = bold; - } - } - } - catch (e) {} + shouldAlert = processWatchers(callObj); } // Hunting for "stations calling you" @@ -339,7 +322,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) } // Hunting for DXCC - if (huntDXCC.checked || awardTrackerOverrides.dxcc) + if (huntDXCC.checked || awardTrackerOverrides.dxcc || awardTrackerOverrides.dxcc2band) { let hash = String(callObj.dxcc) + "|" + workHashSuffix; let layeredHash = rosterSettings.layeredMode && (String(callObj.dxcc) + "|" + layeredHashSuffix) @@ -469,11 +452,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) if ((huntCounty.checked || awardTrackerOverrides.cnty) && window.opener.GT.callsignLookups.ulsUseEnable == true) { let finalDxcc = callObj.dxcc; - if ( - callObj.cnty && - (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) && - callObj.cnty.length > 0 - ) + if (callObj.cnty && (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6 || finalDxcc == 202) && callObj.cnty.length > 0) { let hash = callObj.cnty + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix); @@ -790,11 +769,25 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) } } + let huzzah = ""; + // Uncomment to test + // callObj.DXcall = "CQ GT"; + if (CR.rosterSettings.animateCQGT == true && callObj.CQ == true && (callObj.DXcall == "CQ GT" || callObj.DXcall == "GridTracker")) + { + huzzah = "class='huzzah' "; + callObj.DXcall = "GridTracker"; + calling = "white"; + } + else if (CR.rosterSettings.animateCQGT == false && callObj.DXcall == "GridTracker") + { + callObj.DXcall = "CQ GT"; + } + // Assemble all styles colorObject.call = "style='" + callConf + "background-color:" + callBg + ";color:" + call + ";" + callPointer + "'"; colorObject.grid = "style='" + gridConf + "background-color:" + gridBg + ";color:" + grid + ";cursor:pointer'"; - colorObject.calling = "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'"; + colorObject.calling = huzzah + "style='" + callingConf + "background-color:" + callingBg + ";color:" + calling + "'"; colorObject.dxcc = "style='" + dxccConf + "background-color:" + dxccBg + ";color:" + dxcc + "'"; colorObject.state = "style='" + stateConf + "background-color:" + stateBg + ";color:" + state + "'"; colorObject.cnty = "style='" + cntyConf + "background-color:" + cntyBg + ";color:" + cnty + ";" + cntyPointer + "'"; @@ -818,3 +811,76 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) } } } + +function buildWatcher(watcher) +{ + if (watcher.regex) + { + watcher.test = new RegExp(watcher.text, "gi"); + } + else + { + watcher.test = new RegExp("^" + watcher.text + "$", "gi"); + } + + if (watcher.type == "Callsign") + { + watcher.source = "DEcall"; + watcher.html = "DEcallHTML"; + } + else if (watcher.type == "Calling") + { + watcher.source = "DXcall"; + watcher.html = "DXcallHTML"; + } + else + { + watcher.source = "msg"; + watcher.html = "msgHTML"; + } + return watcher.test; +} + +function processWatchers(callObj) +{ + let now = Date.now(); + for (let key in CR.watchers) + { + let watcher = CR.watchers[key]; + if (watcher.watch) + { + if (watcher.start && now < watcher.startTime) continue; + if (watcher.end && now > watcher.endTime) + { + if (watcher.autoDelete) + { + // Don't call deleteWatcher() as it calls the roster renderer + delete CR.watchers[key]; + writeRosterSettings(); + wantRenderWatchersTab(); + } + else + { + watcher.watch = false; + wantRenderWatchersTab(); + } + continue; + } + watcher.test = watcher.test || buildWatcher(watcher); + try + { + if (callObj[watcher.source].match(watcher.test)) + { + callObj.reason.push("watcher"); + callObj.hunting.watcher = "hunted"; + callObj.watcherKey = key; + let htmlPrevent = htmlEntities(callObj[watcher.source]); + callObj[watcher.html] = htmlPrevent.replace(watcher.test, (x, y) => `${x}`); + return true; + } + } + catch (e) {} + } + } + return false; +} diff --git a/package.nw/lib/roster/renderCompactRoster.js b/package.nw/lib/roster/renderCompactRoster.js index ad75258..8ad4024 100644 --- a/package.nw/lib/roster/renderCompactRoster.js +++ b/package.nw/lib/roster/renderCompactRoster.js @@ -19,7 +19,7 @@ function renderCompactRosterRow(callObj, showBand) let wholeClick = (CR.isCompactCounty ? "" : onClick); let callsignClick = (CR.isCompactCounty ? onClick : ""); let worker = "
"; - worker += "
" + formatCallsign(callObj.DEcall) + bandView + "
"; + worker += "
" + formatCallsign(callObj.DEcallHTML || callObj.DEcall) + bandView + "
"; worker += "
"; worker += renderEntryForColumn(CR.rosterSettings.compactEntity, callObj, "div"); worker += "
"; diff --git a/package.nw/lib/roster/renderRoster.js b/package.nw/lib/roster/renderRoster.js index 7223dc9..446ea04 100644 --- a/package.nw/lib/roster/renderRoster.js +++ b/package.nw/lib/roster/renderRoster.js @@ -26,11 +26,12 @@ function renderRoster(callRoster, rosterSettings) if (window.opener.GT.callsignLookups.lotwUseEnable == true) { - // Do nothing + usesLoTWDiv.style.display = ""; } else { columnOverrides.LoTW = false; + usesLoTWDiv.style.display = "none"; } if (rosterSettings.canMsg == true) @@ -53,10 +54,6 @@ function renderRoster(callRoster, rosterSettings) columnOverrides.POTA = false; } - if (rosterSettings.isAwardTracker) - { - columnOverrides.Wanted = true; - } // dealing with spots if (CR.rosterSettings.columns.Spot == true) onlySpotDiv.style.display = ""; else onlySpotDiv.style.display = "none"; diff --git a/package.nw/lib/roster/rosterColumnFunctions.js b/package.nw/lib/roster/rosterColumnFunctions.js index f75be35..d7ae35e 100644 --- a/package.nw/lib/roster/rosterColumnFunctions.js +++ b/package.nw/lib/roster/rosterColumnFunctions.js @@ -131,7 +131,7 @@ function changeRosterColumnOrder(columns) function moveColumnLeft(column) { - const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true, Grid: true }); + const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true }); const pos = columns.indexOf(column); if (pos > 1) { @@ -140,3 +140,29 @@ function moveColumnLeft(column) } changeRosterColumnOrder(columns); } + +function moveColumnRight(column) +{ + const columns = rosterColumnList(CR.rosterSettings.columns, { Callsign: true }); + const pos = columns.indexOf(column); + if (pos > 0 && pos + 1 < Object.keys(columns).length) + { + columns[pos] = columns[pos + 1]; + columns[pos + 1] = column; + } + changeRosterColumnOrder(columns); +} + +function toggleColumn(target, column = null) +{ + let label = column || target.label; + CR.rosterSettings.columns[label] = target.checked; + CR.columnMembers[label].checked = target.checked; + if (label == "Spot") + { + window.opener.setRosterSpot(CR.rosterSettings.columns.Spot); + } + writeRosterSettings(); + viewRoster(); + resize(); +} diff --git a/package.nw/lib/roster/rosterColumns.js b/package.nw/lib/roster/rosterColumns.js index d667ae2..7e17d50 100644 --- a/package.nw/lib/roster/rosterColumns.js +++ b/package.nw/lib/roster/rosterColumns.js @@ -111,13 +111,16 @@ const ROSTER_COLUMNS = { tableData: (callObj) => ({ rawAttrs: callObj.style.calling, name: callObj.CQ ? "CQ" : "Calling", - html: (CR.rosterSettings.wantRRCQ && callObj.RR73) ? "RR73" : formatCallsign(callObj.DXcall) + html: (CR.rosterSettings.wantRRCQ && callObj.RR73) ? "RR73" : formatCallsign(callObj.DXcallHTML || callObj.DXcall) }) }, Msg: { compare: callObjLocaleComparer("DXcall"), - tableData: (callObj) => ({ html: callObj.msg }) + tableData: (callObj) => ({ + name: "Msg", + html: callObj.msgHTML || htmlEntities(callObj.msg) + }) }, DXCC: { @@ -272,7 +275,7 @@ const ROSTER_COLUMNS = { title: `${$.i18n("rosterColumns.LoTW.LastUpdate")}${ window.opener.userDayString(window.opener.GT.lotwCallsigns[callObj.DEcall] * 86400000) }`, - html: "✔" + html: "🙋🏻‍♂️" } } } @@ -284,7 +287,7 @@ const ROSTER_COLUMNS = { title: `${$.i18n("rosterColumns.LoTW.LastUpdate")}${ window.opener.userDayString(window.opener.GT.lotwCallsigns[callObj.DEcall] * 86400000) }`, - html: "✔" + html: "🙋🏻‍♂️" } } } @@ -302,7 +305,7 @@ const ROSTER_COLUMNS = { tableData: (callObj) => ({ style: "color: #0F0;", align: "center", - html: (callObj.DEcall in window.opener.GT.eqslCallsigns ? "✔" : " ") + html: (callObj.DEcall in window.opener.GT.eqslCallsigns ? "🙋🏻‍♂️" : " ") }) }, @@ -311,7 +314,7 @@ const ROSTER_COLUMNS = { tableData: (callObj) => ({ style: "color: #0F0;", align: "center", - html: (callObj.DEcall in window.opener.GT.oqrsCallsigns ? "✔" : " ") + html: (callObj.DEcall in window.opener.GT.oqrsCallsigns ? "🙋🏻‍♂️" : " ") }) }, @@ -449,7 +452,7 @@ function potaColumnHover(callObj) return value; } -WANTED_ORDER = ["call", "qrz", "regex", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "pota", "grid", "cnty", "wpx", "oams"]; +WANTED_ORDER = ["call", "qrz", "watcher", "cont", "dxcc", "cqz", "ituz", "dxccMarathon", "cqzMarathon", "state", "pota", "grid", "cnty", "wpx", "oams"]; WANTED_LABELS = {}; function wantedColumnParts(callObj, options) @@ -472,7 +475,7 @@ function wantedColumnParts(callObj, options) // else if (wanted == "caller") { parts.push("Called"); } else if (wanted == "hunted" && field == "qrz") { parts.push("Caller"); } else if (wanted == "hunted" && field == "oams") { parts.push("OAMS User"); } - else if (wanted == "hunted" && field == "regex") { parts.push("Regex match"); } + else if (wanted == "hunted" && field == "watcher") { parts.push(callObj.watcherKey); } else if (wanted == "hunted") { parts.push(`${options.html ? "" : ""}New ${WANTED_LABELS[field]}${options.html ? "" : ""}`); } else if (wanted == "worked") { parts.push(`Worked ${WANTED_LABELS[field]}`); } else if (wanted == "mixed") { parts.push(`${callObj.band} ${WANTED_LABELS[field]}`); } diff --git a/package.nw/lib/style.css b/package.nw/lib/style.css index 8ac20cc..225b87e 100644 --- a/package.nw/lib/style.css +++ b/package.nw/lib/style.css @@ -683,12 +683,8 @@ a { text-align: center; width: auto; border-top: 1px solid green; - vertical-align: top; - white-space: normal; - - /* animation: fadeEffect .3s; Fading effect takes 1 second */ } /* Style the tab content */ diff --git a/package.nw/lib/style_roster.css b/package.nw/lib/style_roster.css index 5c63c73..b406826 100644 --- a/package.nw/lib/style_roster.css +++ b/package.nw/lib/style_roster.css @@ -6,11 +6,16 @@ td { white-space: nowrap; font-family: Sans-Serif; text-align: auto; + vertical-align: baseline; padding: 0px; margin: 0px; top: 0; } +th { + vertical-align: bottom; +} + table, th, td, @@ -21,24 +26,20 @@ select, th, td { - padding-bottom: 2px; + padding-bottom: 1px; padding-right: 1px; - margin-right: 2px; - padding-left: 2px; + } input[type="checkbox"] { appearance: checkbox !important; margin: 0; + margin-top: -1px; margin-right: 1px; - vertical-align: middle; + vertical-align: top; position: relative; - top: 0px; -} -/* input[type="checkbox"]:checked { - appearance: checkbox !important; -} */ +} select { appearance: none; @@ -136,36 +137,42 @@ body.roster { min-height: 28px; margin-top: 4px; display: flex; - flex-direction: column; + flex-direction: row; align-items: stretch; justify-content: flex-start; } #RosterControls.normal #MainRosterControls { - margin-left: 180px; - margin-right: 100px; + margin-left: 1px; + margin-top: 3px; display: flex; - flex-direction: row; - align-items: center; - justify-content: space-evenly; } #TransmitControls { position: absolute; top: 3px; - left: 6px; - width: 180px; + left: 3px; + width: 246px; display: flex; flex-direction: row; + justify-content: center; } -#MoreLessControls { +#LessControls { position: absolute; top: 7px; + left: 50%; + text-align: center; +} + +#MoreControls { + position: absolute; + top: 5px; right: 6px; text-align: right; } + #RosterControls.normal #ShowFewerControlsLink { display: none; } @@ -174,10 +181,11 @@ body.roster { } #RosterControls.normal #MainRosterControls { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-evenly; + position: absolute; + top: 3px; + left: 250px; + text-align: left; + justify-content: left; } #RosterControls.extended { @@ -190,7 +198,7 @@ body.roster { #RosterControls.extended #MainRosterControls { margin-top: 30px; - min-width: 210px; + min-width: 250px; flex: 0; } @@ -232,13 +240,13 @@ body.roster { max-height: 142px; } -@media (max-width: 1050px) { +@media (max-width: 1000px) { #RosterControls.normal #HuntModeControls { display: none !important; } } -@media (max-width: 735px) { +@media (max-width: 800px) { #RosterControls.normal #CallsignsControls { display: none; } @@ -274,7 +282,7 @@ body.roster { flex-direction: row; align-items: flex-start; justify-content: flex-start; - margin-right: 8px; + margin-right: 1px; margin-bottom: 4px; } @@ -305,16 +313,16 @@ body.roster { .secondaryControlGroup { flex: 1; - margin-left: 8px; + margin-left: 4px; padding: 0px; } #huntingMatrixDiv { - flex: 0.75; + flex: .9; } #exceptionDiv { - flex: 1.25; + flex: .25; } .secondaryControlGroup h3 { @@ -328,51 +336,57 @@ body.roster { #huntingMatrixDiv h3 { color: #099; border-bottom: 2px solid #066; - margin-bottom: 2px; + margin-bottom: 3px; } #exceptionDiv h3 { - color: #944; - border-bottom: 2px solid #622; - margin-bottom: 2px; + color: rgb(206, 89, 89); + border-bottom: 2px solid rgba(253, 113, 113, 0.644); + margin-bottom: 3px; } .secondaryControlGroup .columns { /* column-count: 2; */ - max-height: 135px; + max-height: 100px; display: flex; flex-direction: column; flex-wrap: wrap; justify-content: flex-start; - align-items: stretch; + align-items: normal; } -@media (min-width: 1100px) { - .secondaryControlGroup .columns { - max-height: 80px; - } -} - -.secondaryControlGroup .columns > div { +.secondaryControlGroup .columns div { text-align: left; - margin-bottom: 2px; + vertical-align: bottom; + margin-top: 3px; + margin-right: 0px; } -.secondaryControlGroup input.slider { +input.slider { display: inline-block; - width: 75px; + width: max-content; } -.secondaryControlGroup input.inputTextValue { +.inputTextValue { + border-radius: 6px; + border: 1px solid #999; background-color: green; color: yellow; + outline: none; + margin: 0px; padding: 2px; + border-style: inset; } -.secondaryControlGroup .roundBorderValue { - padding: 2px; +.inputTextValue:hover { + border-color: #fff; + border-style: outset; } +.roundBorderValue { + padding: 3px; + font-size: larger; +} #instancesWrapper .button { display: inline-block; @@ -390,11 +404,12 @@ body.roster { #txrxdec { padding-left: 5px; padding-right: 5px; + width: 68px; } .link { cursor: hand; - color: #ffffaa; + color: #ffffaaa1; } .link:hover { @@ -419,13 +434,13 @@ table.awardTableCSS th { border-left: none; border-right: none; font-size: 12px; + vertical-align: baseline; } table.awardTableCSS tr { padding: 0px; margin: 0px; max-height: 16px; - bottom: 0; } table.awardTableCSS thead { @@ -487,7 +502,8 @@ table.rosterTable thead th:first-child { } .regexMatch { - text-decoration: underline; + background-color: #ffffff; + color: #000; } .dxCaller { @@ -569,3 +585,235 @@ table.rosterTable thead th:first-child { text-overflow: ellipsis; white-space: nowrap; } + +/* Style the tab */ +.infotab { + overflow: hidden; + background-color: black; +} + +/* Style the buttons that are used to open the tab content */ +.infotab button { + border: 1px solid lightblue; + padding: 3px; + font-weight: bold; + border-top-right-radius: 6px; + border-top-left-radius: 6px; + margin-left: 5px; + margin-right: 0px; + color: #eee; + background: black; + text-align: center; + cursor: pointer; + white-space: nowrap; + border-bottom-style: none; + transition: 0.1s; +} + +/* Create an active/current tablink class */ +.infotab button.active { + background-color: cyan; + color: black; +} +/* Style the tab content */ +.infoTabcontent { + margin: auto; + display: none; + background-color: black; + padding: 0; + padding-top: 4px; + text-align: center; + width: auto; + left:0; + right:0; + border-top: 1px solid lightblue; + vertical-align: top; + white-space: normal; + overflow:auto; + min-width: 480px; +} + +.exceptionTab { + display: grid; + grid-template-columns: repeat(auto-fill,minmax(150px, 1fr)); + justify-content:center; + align-items:center; +} + +.exceptionTab > div { + margin: 6px; + padding: 5px; + height: 35px; + width: 140px; + border-width: 1px; + border-color: #aaa; + border-style: inset; + vertical-align:baseline; + border-radius: 4px; + transition: border-color; +} + +p { + margin-top: 4px; + margin-bottom: 1px; + margin-left: 1px; + margin-right: 1px; +} + +.exceptionTab > div:hover { + border-color: #fff; +} + +.break { + flex-basis: 100%; +} + +:root { + accent-color: #4ab9f8; + color-scheme: dark; +} + +.columnEditView { + margin:5px; + padding:5px; + vertical-align:top; + display:inline-block; + overflow:auto; + overflow-x:hidden; + height: fit-content; +} + +.columnEditRow { + display:grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + margin-top:2px; + margin-bottom: 5px; +} + +.columnEditRowHeader { + border: 1px solid #cecccc; + grid-row: 1 / span 4; + font-weight: bold; + margin-bottom: 5px; +} + +.columnEditRow:hover { + box-shadow: inset 0px 11px 6px -8px #888, inset 0px -11px 6px -8px #888; +} + +.columnAvailableRow { + display:grid; + grid-template-columns: 1fr 3fr; + margin-top:2px; + margin-bottom: 5px; +} + +.columnAvailableRow:hover { + box-shadow: inset 0px 11px 6px -8px #888, inset 0px -11px 6px -8px #888; +} + +.huzzah { + background: linear-gradient(135deg, #360000, #00580f, rgb(11, 0, 80)); + background-size: 500% 500%; + animation: AnimationHuzzah 5s alternate infinite; + text-shadow: black 0 0 6px; +} + +@keyframes AnimationHuzzah { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +.rowBuilder { + border-width: 1px; + border-color: #aaa; + border-style: outset; + vertical-align: top; + border-radius: 4px; + display: flex; + flex-direction: row; + transition: border-color; + text-align: center; + vertical-align:middle; + justify-content:center; + align-items:center; + width: fit-content; + left:0; + right:0; + margin: auto; + padding: 4px; +} + +.rowBuilder:hover { + border-color: #fff; +} + +.rowBuilder > * { + margin-right: 4px; + padding: 2px; +} + +.flexButton { + border-radius: 4px; + cursor: pointer; + border-width: 1px; + border-color: #999; + border-style: outset; + color: #eee; + transition: border-style; + vertical-align: middle; + padding: 2px; + padding-bottom: 1px; + text-align: center; + width: fit-content; +} + +.flexButton:hover { + border-color: #fff; +} +.ignoresTables { + margin:10px; + padding:0px; + vertical-align:top; + display:inline-block; + margin-right:2px; + overflow:auto; + overflow-x:hidden; +} + +#watcherTable { + margin: auto; + left:0; + right:0; + width:fit-content; + padding:0px; + vertical-align:top; + display:inline-block; + margin-top:2px; + overflow:auto; + overflow-x:hidden; +} + +#settingsDiv { + padding: 3px; + overflow: hidden; + margin: auto; + top: 3px; + left:0; + right:0; + width: fit-content; + display:none; + padding: 1px; + text-align: center; + vertical-align: middle; + position: absolute; + z-index: 600; + border: 1px solid lightblue; +} \ No newline at end of file diff --git a/package.nw/package.json b/package.nw/package.json index 075a3cd..247dcf9 100644 --- a/package.nw/package.json +++ b/package.nw/package.json @@ -1,7 +1,7 @@ { "name": "GridTracker", "product_string_do_not_use": "gridtracker", - "version": "1.23.1112", + "version": "1.23.1202", "betaVersion": "", "description": "GridTracker: An Amateur Radio Companion", "author": "GridTracker.org", @@ -12,7 +12,7 @@ "icon": "gridview.png", "toolbar": false, "show": false, - "width": 800, + "width": 860, "height": 652 }, "webkit": {