diff --git a/.github/workflows/prettier.yaml b/.github/workflows/prettier.yaml index 2cfea21b..a42c1f8a 100644 --- a/.github/workflows/prettier.yaml +++ b/.github/workflows/prettier.yaml @@ -4,7 +4,7 @@ name: Prettier on: push: branches: - - master + - main jobs: prettier: diff --git a/gui/main.js b/gui/main.js index 4c13ca96..de5dd6fc 100644 --- a/gui/main.js +++ b/gui/main.js @@ -101,7 +101,7 @@ const configDefaultSettings = "enable_auto_retry" : "False", \ "tx_delay" : 0, \ "auto_start": 0, \ - "notification": 1 \ + "enable_sys_notification": 1 \ }'; if (!fs.existsSync(configPath)) { @@ -486,21 +486,24 @@ ipcMain.on("request-update-transmission-status", (event, arg) => { ipcMain.on("request-update-reception-status", (event, arg) => { win.webContents.send("action-update-reception-status", arg); chat.webContents.send("action-update-reception-status", arg); - }); //Called by main to query chat if there are new messages -ipcMain.on("request-update-unread-messages",() => { +ipcMain.on("request-update-unread-messages", () => { //mainLog.info("Got request to check if chat has new messages") chat.webContents.send("action-update-unread-messages"); - }); //Called by chat to notify main if there are new messages -ipcMain.on("request-update-unread-messages-main", (event,arg) => { - win.webContents.send("action-update-unread-messages-main",arg); +ipcMain.on("request-update-unread-messages-main", (event, arg) => { + win.webContents.send("action-update-unread-messages-main", arg); //mainLog.info("Received reply from chat and ?new messages = " +arg); }); +//Called by main to notify chat we should clean the DB +ipcMain.on("request-clean-db", () => { + chat.webContents.send("action-clean-db"); +}); + ipcMain.on("request-open-tnc-log", () => { logViewer.show(); }); diff --git a/gui/package.json b/gui/package.json index b21f3ace..5843aadd 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,6 +1,6 @@ { "name": "FreeDATA", - "version": "0.9.3-alpha.1", + "version": "0.9.4-alpha.1", "description": "FreeDATA ", "main": "main.js", "scripts": { @@ -32,8 +32,8 @@ "@electron/osx-sign": "^1.0.4", "@popperjs/core": "^2.11.6", "blob-util": "^2.0.2", - "bootstrap": "^5.3.0-alpha.3", - "bootstrap-icons": "^1.10.3", + "bootstrap": "^5.3.0", + "bootstrap-icons": "^1.10.5", "bootswatch": "^5.2.3", "browser-image-compression": "^2.0.0", "chart.js": "^4.2.1", diff --git a/gui/preload-chat.js b/gui/preload-chat.js index 121f4faa..f437f5cd 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -165,7 +165,6 @@ window.addEventListener("DOMContentLoaded", () => { "user_info_website", "user_info_comments", ]; - users .find({ selector: { @@ -216,9 +215,11 @@ window.addEventListener("DOMContentLoaded", () => { //Add event listener for filter apply button document.getElementById("btnFilter").addEventListener("click", () => { - chatFilter = [{ type: "newchat" }]; - if (document.getElementById("chkMessage").checked == true) + chatFilter.length = 0; + if (document.getElementById("chkMessage").checked == true) { + chatFilter = [{ type: "newchat" }]; chatFilter.push({ type: "received" }, { type: "transmit" }); + } if (document.getElementById("chkPing").checked == true) chatFilter.push({ type: "ping" }); if (document.getElementById("chkPingAck").checked == true) @@ -229,6 +230,8 @@ window.addEventListener("DOMContentLoaded", () => { chatFilter.push({ type: "request" }); if (document.getElementById("chkResponse").checked == true) chatFilter.push({ type: "response" }); + if (document.getElementById("chkNewMessage").checked == true) + chatFilter.push({ new: 1 }); updateAllChat(true); }); @@ -664,21 +667,21 @@ ipcRenderer.on("return-select-user-image", (event, arg) => { ipcRenderer.on("action-update-reception-status", (event, arg) => { var data = arg["data"][0]; - document.getElementById("txtConnectedWithChat").textContent = data.dxcallsign; + document.getElementById("txtConnectedWithChat").textContent = data.dxcallsign; }); ipcRenderer.on("action-clear-reception-status", (event) => { - //Clear connected with textbox - let cwc = document.getElementById("txtConnectedWithChat"); - if (cwc.textContent != "------") { - cwc.textContent = "------"; - //console.log("Reseting connected with"); - } + //Clear connected with textbox + let cwc = document.getElementById("txtConnectedWithChat"); + if (cwc.textContent != "------") { + cwc.textContent = "------"; + //console.log("Reseting connected with"); + } }); ipcRenderer.on("action-update-transmission-status", (event, arg) => { var data = arg["data"][0]; - document.getElementById("txtConnectedWithChat").textContent = data.dxcallsign; + document.getElementById("txtConnectedWithChat").textContent = data.dxcallsign; console.log(data.status); if (data.uuid !== "no-uuid") { @@ -814,12 +817,12 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new = 1; + obj.new = 0; add_obj_to_database(obj); update_chat_obj_by_uuid(obj.uuid); - // handle beacon + // handle ping-ack } else if (item.ping == "acknowledge") { obj.timestamp = parseInt(item.timestamp); obj.dxcallsign = item.dxcallsign; @@ -834,7 +837,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new = 1; + obj.new = 0; add_obj_to_database(obj); update_chat_obj_by_uuid(obj.uuid); @@ -853,7 +856,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new = 1; + obj.new = 0; add_obj_to_database(obj); update_chat_obj_by_uuid(obj.uuid); @@ -881,7 +884,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filetype = splitted_data[7]; //obj.file = btoa(splitted_data[8]); obj.file = FD.btoa_FD(splitted_data[8]); - obj.new=1; + obj.new = 1; } else if (splitted_data[1] == "req" && splitted_data[2] == "0") { obj.uuid = uuidv4().toString(); obj.timestamp = Math.floor(Date.now() / 1000); @@ -894,7 +897,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new=1; + obj.new = 0; if (config.enable_request_profile == "True") { sendUserData(item.dxcallsign); } @@ -910,7 +913,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new=1; + obj.new = 0; if (config.enable_request_shared_folder == "True") { sendSharedFolderList(item.dxcallsign); } @@ -931,7 +934,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new=1; + obj.new = 0; if (config.enable_request_shared_folder == "True") { sendSharedFolderFile(item.dxcallsign, name); } @@ -947,7 +950,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new=1; + obj.new = 0; console.log(splitted_data); let userData = new Object(); userData.user_info_image = splitted_data[2]; @@ -976,7 +979,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = "null"; obj.filetype = "null"; obj.file = "null"; - obj.new=1; + obj.new = 0; console.log(splitted_data); let userData = new Object(); @@ -1004,7 +1007,7 @@ ipcRenderer.on("action-new-msg-received", (event, arg) => { obj.filename = sharedFileInfo[0]; obj.filetype = "application/octet-stream"; obj.file = FD.btoa_FD(sharedFileInfo[1]); - obj.new=1; + obj.new = 0; } else { console.log("no rule matched for handling received data!"); } @@ -1043,31 +1046,30 @@ update_chat = function (obj) { var attempt = obj.attempt; } -// add percent and bytes per minute if not existing -//console.log(obj.percent) -if (typeof obj.percent == "undefined") { - obj.percent = 0; - obj.bytesperminute = 0; - } + // add percent and bytes per minute if not existing + //console.log(obj.percent) + if (typeof obj.percent == "undefined") { + obj.percent = 0; + obj.bytesperminute = 0; + } // check if wrong status message -if (obj.status == "transmit" && obj.percent == 0) { -var TimeDifference = (new Date().getTime()/1000) - obj.timestamp - if (TimeDifference > 3600){ - db.upsert(obj._id, function (doc) { - if (!doc.status) { - doc.status = "failed"; - } - return doc; - }); - obj.status = "failed"; - + if (obj.status == "transmit" && obj.percent == 0) { + var TimeDifference = new Date().getTime() / 1000 - obj.timestamp; + if (TimeDifference > 3600) { + db.upsert(obj._id, function (doc) { + if (!doc.status) { + doc.status = "failed"; + } + return doc; + }); + obj.status = "failed"; } -} - if (typeof obj.new == "undefined"){ - obj.new=0; } - + if (typeof obj.new == "undefined") { + obj.new = 0; + } + if (typeof config.max_retry_attempts == "undefined") { var max_retry_attempts = 3; } else { @@ -1241,8 +1243,12 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp //Reset unread messages and new message indicator let clear = selected_callsign; clearUnreadMessages(clear); - document.getElementById(`chat-${selected_callsign}-list-displaydxcall`).textContent=selected_callsign; - + document.getElementById( + `chat-${selected_callsign}-list-displaydxcall` + ).textContent = selected_callsign; + document + .getElementById(`chat-${selected_callsign}-list`) + .classList.remove("list-group-item-warning"); setTimeout(scrollMessagesToBottom, 200); //get user information @@ -1263,7 +1269,14 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp // short message document.getElementById("chat-" + dxcallsign + "-list-shortmsg").innerHTML = shortmsg; - if (obj.new==1) document.getElementById(`chat-${obj.dxcallsign}-list-displaydxcall`).textContent="*" +obj.dxcallsign; + if (obj.new == 1) { + document.getElementById( + `chat-${obj.dxcallsign}-list-displaydxcall` + ).textContent = "*" + obj.dxcallsign; + document + .getElementById(`chat-${dxcallsign}-list`) + .classList.add("list-group-item-warning"); + } } // APPEND MESSAGES TO CALLSIGN @@ -1273,10 +1286,10 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp if (config.enable_auto_retry.toUpperCase() == "TRUE") { checkForWaitingMessages(obj.dxcallsign); } - if (obj.new == 1) - { - showOsPopUp("Ping from " + obj.dxcallsign,"You've been ping'd!"); - } + //if (obj.new == 1) + //{ + // showOsPopUp("Ping from " + obj.dxcallsign,"You've been ping'd!"); + //} var new_message = `

snr: ${obj.snr} - ${timestamp}

@@ -1327,11 +1340,10 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp var message_html = obj.msg.replaceAll(/\n/g, "
"); if (obj.type == "received") { - if (obj.new == 1) - { - showOsPopUp("Message received from " + obj.dxcallsign,obj.msg); + if (obj.new == 1) { + showOsPopUp("Message received from " + obj.dxcallsign, obj.msg); } - + var new_message = `
@@ -1442,8 +1454,6 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp //console.log("Low graphics enabled for chat module"); } - - var new_message = `
${controlarea_transmit} @@ -1478,10 +1488,8 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp obj.percent }" aria-valuemin="0" aria-valuemax="100">

${percent_value} % - ${ - obj.bytesperminute - } Bpm

+ obj._id + }-progress-information">${percent_value} % - ${obj.bytesperminute} Bpm

@@ -1498,11 +1506,8 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp //console.log("element already exists......"); //console.log(obj); - // console.log(obj.status) - // console.log(obj.attempt) - - - + // console.log(obj.status) + // console.log(obj.attempt) if ( !obj.status == "broadcast_transmit" || @@ -1525,40 +1530,33 @@ var TimeDifference = (new Date().getTime()/1000) - obj.timestamp obj.attempt + "/" + max_retry_attempts; } - if (obj.status == "transmit") { - - document.getElementById("msg-" + obj._id + "-status").innerHTML = + document.getElementById("msg-" + obj._id + "-status").innerHTML = get_icon_for_state(obj.status); -if (typeof obj.percent !== "undefined") { - document - .getElementById("msg-" + obj._id + "-progress") - .setAttribute("aria-valuenow", obj.percent); - document - .getElementById("msg-" + obj._id + "-progress") - .setAttribute("style", "width:" + obj.percent + "%;"); - document.getElementById( - "msg-" + obj._id + "-progress-information" - ).innerHTML = obj.percent + "% - " + obj.bytesperminute + " Bpm"; + if (typeof obj.percent !== "undefined") { + document + .getElementById("msg-" + obj._id + "-progress") + .setAttribute("aria-valuenow", obj.percent); + document + .getElementById("msg-" + obj._id + "-progress") + .setAttribute("style", "width:" + obj.percent + "%;"); + document.getElementById( + "msg-" + obj._id + "-progress-information" + ).innerHTML = obj.percent + "% - " + obj.bytesperminute + " Bpm"; + } else { + document + .getElementById("msg-" + obj._id + "-progress") + .setAttribute("aria-valuenow", 0); + document + .getElementById("msg-" + obj._id + "-progress") + .setAttribute("style", "width:0%;"); + document.getElementById( + "msg-" + obj._id + "-progress-information" + ).innerHTML = "0% - 0 Bpm"; + } - } else { - document - .getElementById("msg-" + obj._id + "-progress") - .setAttribute("aria-valuenow", 0); - document - .getElementById("msg-" + obj._id + "-progress") - .setAttribute("style", "width:0%;"); - document.getElementById( - "msg-" + obj._id + "-progress-information" - ).innerHTML = "0% - 0 Bpm"; - - } - - - - - document.getElementById("msg-" + obj._id + "-attempts").innerHTML = + document.getElementById("msg-" + obj._id + "-attempts").innerHTML = obj.attempt + "/" + max_retry_attempts; } @@ -1602,15 +1600,13 @@ if (typeof obj.percent !== "undefined") { .getElementById("msg-" + obj._id + "-progress") .classList.add("bg-danger"); - console.log(document - .getElementById("msg-" + obj._id + "-progress") - .classList) + console.log( + document.getElementById("msg-" + obj._id + "-progress").classList + ); document.getElementById( "msg-" + obj._id + "-progress-information" ).innerHTML = "TRANSMISSION FAILED - " + obj.bytesperminute + " Bpm"; - - } //document.getElementById(id).className = message_class; @@ -2194,7 +2190,7 @@ async function updateAllChat(clear) { await db .createIndex({ index: { - fields: [{ timestamp: "asc" }], + fields: [{ dxcallsign: "asc" }, { timestamp: "asc" }], }, }) .then(async function (result) { @@ -2202,14 +2198,14 @@ async function updateAllChat(clear) { await db .find({ selector: { - $and: [{ timestamp: { $exists: true } }, { $or: chatFilter }], + $and: [ + { dxcallsign: { $exists: true } }, + { timestamp: { $exists: true } }, + { $or: chatFilter }, + ], //$or: chatFilter }, - sort: [ - { - timestamp: "asc", - }, - ], + sort: [{ dxcallsign: "asc" }, { timestamp: "asc" }], }) .then(async function (result) { console.log(result); @@ -2272,7 +2268,6 @@ function getSetUserSharedFolder(selected_callsign) { .then(function (data) { console.log(data); - if (typeof data.user_shared_folder !== "undefined") { console.log(data.user_shared_folder); // shared folder table @@ -2661,11 +2656,15 @@ ipcRenderer.on("update-config", (event, data) => { }); ipcRenderer.on("action-update-unread-messages", (event) => { - checkForNewMessages().then(function(count) { - ipcRenderer.send("request-update-unread-messages-main",count); + checkForNewMessages().then(function (count) { + ipcRenderer.send("request-update-unread-messages-main", count); }); }); +ipcRenderer.on("action-clean-db", (event) => { + dbClean(); +}); + // https://stackoverflow.com/a/18650828 function formatBytes(bytes, decimals = 2) { if (!+bytes) return "0 Bytes"; @@ -2796,44 +2795,49 @@ function checkForWaitingMessages(dxcall) { }); } -async function checkForNewMessages() -{ +async function checkForNewMessages() { var newmsgs; - await db.find({ - selector: { - new: {$eq: 1}, - }, limit:1, - }) + await db + .find({ + selector: { + new: { $eq: 1 }, + }, + limit: 1, + }) .then(function (result) { - if (result.docs.length >0) - newmsgs=true; - else - newmsgs=false; + if (result.docs.length > 0) newmsgs = true; + else newmsgs = false; }) .catch(function (err) { console.log(err); }); - return newmsgs; + return newmsgs; } function clearUnreadMessages(dxcall) { //console.log(dxcall); + //Selector of dxcall and new $eq: 1 isn't working, don't know why + //For now parse all messages of callsign to clear new flag db.find({ - selector: { - dxcallsign: dxcall, - new: {$eq: 1}, - } + //{ + selector: + //$and:[ + { dxcallsign: dxcall }, //, {new: { $gte: 1}} + //] + // } }) .then(function (result) { //console.log(result); //console.log ("New messages count to clear for " + dxcall + ": " + result.docs.length) - result.docs.forEach(function (item) { + result.docs.forEach(function (item) { + if (item.new == 1) { db.upsert(item._id, function (doc) { - doc.new=0; + doc.new = 0; //console.log("Clearing new on _id " + item._id); return doc; - }); - }); + }); + } + }); }) .catch(function (err) { console.log(err); @@ -2841,10 +2845,68 @@ function clearUnreadMessages(dxcall) { } //Have the operating system show a notification popup -function showOsPopUp(title, message) -{ - if (config.notification == 0) return; +function showOsPopUp(title, message) { + if (config.enable_sys_notification == 0) return; const NOTIFICATION_TITLE = title; const NOTIFICATION_BODY = message; new Notification(NOTIFICATION_TITLE, { body: NOTIFICATION_BODY }); -} \ No newline at end of file +} + +//Function to clean old beacons and optimize database +async function dbClean() { + //Only keep the most x latest days of beacons + let beaconKeep = 7; + let itemCount = 0; + let timestampPurge = Math.floor( + (Date.now() - beaconKeep * 24 * 60 * 60 * 1000) / 1000 + ); + if ( + confirm( + "Delete beacons and pings older than " + + beaconKeep + + " days and compact database?" + ) + ) { + } else { + return; + } + + //Items to purge from database + var purgeFilter = [ + { type: "beacon" }, + { type: "ping-ack" }, + { type: "ping" }, + ]; + + await db + .find({ + selector: { + $and: [{ timestamp: { $lt: timestampPurge } }, { $or: purgeFilter }], + }, + }) + .then(async function (result) { + //console.log("Purging " + result.docs.length + " beacons received before " + timestampPurge); + itemCount = result.docs.length; + result.docs.forEach(async function (item) { + await db + .get(item._id) + .then(async function (doc) { + await db.remove(doc); + }) + .catch(function (err) { + console.log(err); + }); + }); + }) + .catch(function (err) { + console.log(err); + }); + + //Compact database + await db.compact(); + window.alert( + "Database maintenance is complete. " + + itemCount + + " items removed from database. It's recommended you now restart the GUI." + ); +} diff --git a/gui/preload-main.js b/gui/preload-main.js index 5fe94d3a..7f511d81 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -71,10 +71,10 @@ var noise_level_raw = 0; //Global version variable var appVer = null; - //Track the number of times TNC has been started - //So that warning is shown when using auto start and 2nd start - //if hamlib is not running - var tncStartCount = 0; +//Track the number of times TNC has been started +//So that warning is shown when using auto start and 2nd start +//if hamlib is not running +var tncStartCount = 0; // START INTERVALL COMMAND EXECUTION FOR STATES //setInterval(sock.getRxBuffer, 1000); @@ -390,7 +390,7 @@ window.addEventListener("DOMContentLoaded", () => { document.getElementById("AutoStartSwitch").checked = false; } - if (config.notification == 1) { + if (config.enable_sys_notification == 1) { document.getElementById("NotificationSwitch").checked = true; } else { document.getElementById("NotificationSwitch").checked = false; @@ -1219,12 +1219,14 @@ window.addEventListener("DOMContentLoaded", () => { FD.saveConfig(config, configPath); }); - //Handle change of Notification settings - document.getElementById("NotificationSwitch").addEventListener("click", () => { + //Handle change of Notification settings + document + .getElementById("NotificationSwitch") + .addEventListener("click", () => { if (document.getElementById("NotificationSwitch").checked == true) { - config.notification = 1; + config.enable_sys_notification = 1; } else { - config.notification = 0; + config.enable_sys_notification = 0; } //fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); FD.saveConfig(config, configPath); @@ -1610,6 +1612,11 @@ window.addEventListener("DOMContentLoaded", () => { daemon.stopTNC(); }); + // btnCleanDB button clicked + document.getElementById("btnCleanDB").addEventListener("click", () => { + ipcRenderer.send("request-clean-db"); + }); + // TEST HAMLIB document.getElementById("testHamlib").addEventListener("click", () => { var data_bits = document.getElementById("hamlib_data_bits").value; @@ -1955,14 +1962,14 @@ function signal_quality_perc_quad(rssi, perfect_rssi = 10, worst_rssi = -150) { } var lastHeard = ""; -var checkForNewMessageWait=85; +var checkForNewMessageWait = 85; ipcRenderer.on("action-update-tnc-state", (event, arg) => { //check for new messages - if (checkForNewMessageWait >= 100){ + if (checkForNewMessageWait >= 100) { //This is very expensive ipcRenderer.send("request-update-unread-messages"); - checkForNewMessageWait=-1; + checkForNewMessageWait = -1; } checkForNewMessageWait++; // update FFT @@ -2436,15 +2443,16 @@ function updateHeardStations(arg) { timestampRaw = arg.stations[i]["timestamp"]; var datetime = new Date(timestampRaw * 1000).toLocaleString( - navigator.language,{ - hourCycle: 'h23', + navigator.language, + { + hourCycle: "h23", year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", - second: "2-digit" - } + second: "2-digit", + } ); //var hours = date.getHours(); //var minutes = "0" + date.getMinutes(); @@ -2767,7 +2775,7 @@ ipcRenderer.on("action-update-tnc-connection", (event, arg) => { set_CPU_mode(); //GUI will auto connect to TNC if already running, if that is the case increment start count if 0 - if (tncStartCount==0) tncStartCount++; + if (tncStartCount == 0) tncStartCount++; } else { /* document.getElementById('hamlib_deviceid').disabled = false; @@ -2922,21 +2930,17 @@ ipcRenderer.on("run-tnc-command-fec-iswriting", (event) => { }); //Change background color of RF Chat button if new messages are available -ipcRenderer.on("action-update-unread-messages-main", (event,data) => { +ipcRenderer.on("action-update-unread-messages-main", (event, data) => { //Do something - if (data == true) - { - document.getElementById("openRFChat").classList.add("btn-warning") - document.getElementById("openRFChat").classList.remove("btn-secondary") - } - else - { - document.getElementById("openRFChat").classList.remove("btn-warning") - document.getElementById("openRFChat").classList.add("btn-secondary") + if (data == true) { + document.getElementById("openRFChat").classList.add("btn-warning"); + document.getElementById("openRFChat").classList.remove("btn-secondary"); + } else { + document.getElementById("openRFChat").classList.remove("btn-warning"); + document.getElementById("openRFChat").classList.add("btn-secondary"); } }); - ipcRenderer.on("run-tnc-command", (event, arg) => { if (arg.command == "enable_mesh") { @@ -3133,7 +3137,7 @@ ipcRenderer.on("action-show-cq-toast-received", (event, data) => { let dxcallsign = data["data"][0]["dxcallsign"]; let dxgrid = data["data"][0]["dxgrid"]; let content = `cq from ${dxcallsign} (${dxgrid})`; - showOsPopUp("CQ from " + dxcallsign,"Say hello!"); + showOsPopUp("CQ from " + dxcallsign, "Say hello!"); displayToast( (type = "success"), (icon = "bi-broadcast"), @@ -3819,14 +3823,13 @@ function autostart_tnc() { if (config.auto_start == 1) { //Now start TNC document.getElementById("startTNC").click(); -} + } } //Have the operating system show a notification popup -function showOsPopUp(title, message) -{ - if (config.notification == 0) return; +function showOsPopUp(title, message) { + if (config.enable_sys_notification == 0) return; const NOTIFICATION_TITLE = title; const NOTIFICATION_BODY = message; new Notification(NOTIFICATION_TITLE, { body: NOTIFICATION_BODY }); -} \ No newline at end of file +} diff --git a/gui/src/chat-module.html b/gui/src/chat-module.html index 3447b6e6..54eee4d6 100644 --- a/gui/src/chat-module.html +++ b/gui/src/chat-module.html @@ -161,7 +161,21 @@ id="chkMessage" /> + + +
+
+ + +
@@ -247,9 +261,11 @@ class="dropdown-item bg-danger text-white" id="delete_selected_chat" href="#" - >Delete chat + Delete chat +
  • - - - ------ + class="input-group-text ms-2" + id="txtConnectedWithChat" + data-bs-toggle="tooltip" + data-bs-trigger="hover" + title="Connected with" + >------ diff --git a/gui/src/index.html b/gui/src/index.html index 685683f0..1298b172 100644 --- a/gui/src/index.html +++ b/gui/src/index.html @@ -3800,6 +3800,20 @@ +
    + + +
    These options may