diff --git a/.github/workflows/build_nsis_bundle.yml b/.github/workflows/build_nsis_bundle.yml index 205ad5806..408a13a3b 100644 --- a/.github/workflows/build_nsis_bundle.yml +++ b/.github/workflows/build_nsis_bundle.yml @@ -98,4 +98,3 @@ jobs: draft: true files: ./FreeDATA-Installer.exe tag_name: ${{ github.ref_name }} - name: 'FreeDATA-${{ github.ref_name }}' \ No newline at end of file diff --git a/.github/workflows/modem_tests.yml b/.github/workflows/modem_tests.yml index 23e9b2f01..01dc78dbd 100644 --- a/.github/workflows/modem_tests.yml +++ b/.github/workflows/modem_tests.yml @@ -21,7 +21,7 @@ jobs: - python-version: "3.9" - python-version: "3.10" - python-version: "3.11" - #- python-version: "3.12" NOT YET SUPPORTED BY NUITKA! + - python-version: "3.12" steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/pip_package.yml b/.github/workflows/pip_package.yml index 184b9197a..9f19bc181 100644 --- a/.github/workflows/pip_package.yml +++ b/.github/workflows/pip_package.yml @@ -39,6 +39,7 @@ jobs: - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@v1.10.1 + if: startsWith(github.ref, 'refs/tags/v') with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/freedata_gui/package.json b/freedata_gui/package.json index 911231b75..58db4e385 100644 --- a/freedata_gui/package.json +++ b/freedata_gui/package.json @@ -1,6 +1,6 @@ { "name": "FreeDATA", - "version": "0.16.6-alpha", + "version": "0.16.7-alpha", "description": "FreeDATA Client application for connecting to FreeDATA server", "private": true, "scripts": { diff --git a/freedata_gui/src/App.vue b/freedata_gui/src/App.vue index 1e17a4821..c39b85fec 100644 --- a/freedata_gui/src/App.vue +++ b/freedata_gui/src/App.vue @@ -1,13 +1,32 @@ \ No newline at end of file + diff --git a/freedata_gui/src/components/chat_conversations.vue b/freedata_gui/src/components/chat_conversations.vue index 5bc95f3b8..83731eaa2 100644 --- a/freedata_gui/src/components/chat_conversations.vue +++ b/freedata_gui/src/components/chat_conversations.vue @@ -35,7 +35,7 @@ {{ details.unread_messages }} new
- {{ details.body ? details.body : '' }} + {{ sanitizeBody(details.body) || '' }}
{{ getDateTime(details.timestamp) }} @@ -48,6 +48,7 @@ diff --git a/freedata_gui/src/components/grid/grid_stations_map.vue b/freedata_gui/src/components/grid/grid_stations_map.vue index 043446c4c..4dd2a1d15 100644 --- a/freedata_gui/src/components/grid/grid_stations_map.vue +++ b/freedata_gui/src/components/grid/grid_stations_map.vue @@ -82,7 +82,9 @@ const drawMap = () => { // Adjust pin size and line width with zoom actualPinRadius = basePinRadius / event.transform.k; - svg.selectAll('.pin').attr('r', actualPinRadius); + svg.selectAll('.my-pin').attr('r', actualPinRadius); + svg.selectAll('.heard-pin').attr('r', actualPinRadius); + svg.selectAll('.connection-line').attr('stroke-width', 1 / event.transform.k); svg.selectAll('.country-path').attr('stroke-width', 0.5 / event.transform.k); @@ -123,7 +125,7 @@ const drawMap = () => { // Draw the pin for your station g.append('circle') - .attr('class', 'pin my-pin') + .attr('class', 'my-pin') .attr('r', actualPinRadius + 2) .attr('fill', 'blue') .attr('cx', myX) @@ -185,10 +187,12 @@ const drawMap = () => { }); }; +// Function to update pins and draw lines // Function to update pins and draw lines const updatePinsAndLines = (g) => { // Remove existing pins and lines - g.selectAll('.pin').remove(); + g.selectAll('.my-pin').remove(); + g.selectAll('.heard-pin').remove(); g.selectAll('.connection-line').remove(); const heardStations = toRaw(state.heard_stations); // Ensure it's the raw data @@ -210,7 +214,7 @@ const updatePinsAndLines = (g) => { // Draw the pin for your station g.append('circle') - .attr('class', 'pin my-pin') + .attr('class', 'my-pin') .attr('r', actualPinRadius + 2) .attr('fill', 'blue') .attr('cx', myX) @@ -238,11 +242,11 @@ const updatePinsAndLines = (g) => { } // Add pins for heard stations - g.selectAll('.pin') + g.selectAll('.heard-pin') .data(points) .enter() .append('circle') - .attr('class', 'pin') + .attr('class', 'heard-pin') .attr('r', actualPinRadius) .attr('fill', 'red') .attr('cx', d => projection([d.lon, d.lat])[0]) @@ -255,16 +259,6 @@ const updatePinsAndLines = (g) => { }); }; -// Zoom in function -const zoomIn = () => { - svg.transition().call(zoom.scaleBy, 1.2); -}; - -// Zoom out function -const zoomOut = () => { - svg.transition().call(zoom.scaleBy, 0.8); -}; - // Center the map const centerMap = () => { let mygrid = settings.remote.STATION.mygrid; @@ -288,6 +282,15 @@ const centerMap = () => { ); }; +// Zoom in function +const zoomIn = () => { + svg.transition().call(zoom.scaleBy, 1.2); +}; + +// Zoom out function +const zoomOut = () => { + svg.transition().call(zoom.scaleBy, 0.8); +}; // Lifecycle hooks onMounted(async () => { @@ -308,7 +311,13 @@ onBeforeUnmount(() => { height: 400px; } -.pin { +.my-pin { + fill: blue; + stroke: black; + stroke-width: 1px; +} + +.heard-pin { fill: red; stroke: black; stroke-width: 1px; @@ -320,7 +329,7 @@ onBeforeUnmount(() => { } .connection-line { - stroke: blue; + stroke: red; stroke-width: 1; stroke-opacity: 0.5; } diff --git a/freedata_gui/src/components/main_left_navbar.vue b/freedata_gui/src/components/main_left_navbar.vue index 0f7d47391..48920c4cf 100644 --- a/freedata_gui/src/components/main_left_navbar.vue +++ b/freedata_gui/src/components/main_left_navbar.vue @@ -22,102 +22,117 @@ import { useStateStore } from '../store/stateStore.js'; const state = useStateStore(pinia); const isNetworkDisconnected = computed(() => state.modem_connection !== "connected"); +// Accessing the network traffic state +const isNetworkTraffic = computed(() => state.is_network_traffic); - diff --git a/freedata_gui/src/components/main_loading_screen.vue b/freedata_gui/src/components/main_loading_screen.vue new file mode 100644 index 000000000..5c3ffef4d --- /dev/null +++ b/freedata_gui/src/components/main_loading_screen.vue @@ -0,0 +1,45 @@ + + + + + + diff --git a/freedata_gui/src/js/api.js b/freedata_gui/src/js/api.js index 68ba934af..69560c8f7 100644 --- a/freedata_gui/src/js/api.js +++ b/freedata_gui/src/js/api.js @@ -30,11 +30,17 @@ function checkNetworkConnectivity() { } return true; } +// Set network traffic state +function setNetworkTrafficBusy(isBusy) { + state.is_network_traffic = isBusy; +} // Fetch GET request async function apiGet(endpoint) { if (!checkNetworkConnectivity()) return; + setNetworkTrafficBusy(true); // Set the network busy state to true + try { const response = await fetch(buildURL(endpoint)); if (!response.ok) { @@ -43,6 +49,8 @@ async function apiGet(endpoint) { return await response.json(); } catch (error) { console.error("Error getting from REST:", error); + } finally { + setNetworkTrafficBusy(false); // Set the network busy state back to false } } @@ -50,6 +58,8 @@ async function apiGet(endpoint) { export async function apiPost(endpoint, payload = {}) { if (!checkNetworkConnectivity()) return; + setNetworkTrafficBusy(true); // Set the network busy state to true + try { const response = await fetch(buildURL(endpoint), { method: "POST", @@ -66,6 +76,8 @@ export async function apiPost(endpoint, payload = {}) { return await response.json(); } catch (error) { console.error("Error posting to REST:", error); + } finally { + setNetworkTrafficBusy(false); // Set the network busy state back to false } } @@ -73,6 +85,8 @@ export async function apiPost(endpoint, payload = {}) { export async function apiPatch(endpoint, payload = {}) { if (!checkNetworkConnectivity()) return; + setNetworkTrafficBusy(true); // Set the network busy state to true + try { const response = await fetch(buildURL(endpoint), { method: "PATCH", @@ -89,6 +103,8 @@ export async function apiPatch(endpoint, payload = {}) { return await response.json(); } catch (error) { console.error("Error patching to REST:", error); + } finally { + setNetworkTrafficBusy(false); // Set the network busy state back to false } } @@ -96,6 +112,8 @@ export async function apiPatch(endpoint, payload = {}) { export async function apiDelete(endpoint, payload = {}) { if (!checkNetworkConnectivity()) return; + setNetworkTrafficBusy(true); // Set the network busy state to true + try { const response = await fetch(buildURL(endpoint), { method: "DELETE", @@ -112,6 +130,8 @@ export async function apiDelete(endpoint, payload = {}) { return await response.json(); } catch (error) { console.error("Error deleting from REST:", error); + } finally { + setNetworkTrafficBusy(false); // Set the network busy state back to false } } diff --git a/freedata_gui/src/store/stateStore.js b/freedata_gui/src/store/stateStore.js index 5c365d190..18bb39ffc 100644 --- a/freedata_gui/src/store/stateStore.js +++ b/freedata_gui/src/store/stateStore.js @@ -1,6 +1,5 @@ import { defineStore } from "pinia"; import { ref } from "vue"; -//import * as bootstrap from "bootstrap"; export const useStateStore = defineStore("stateStore", () => { var busy_state = ref(); @@ -93,6 +92,9 @@ export const useStateStore = defineStore("stateStore", () => { var rx_buffer_length = ref(); + // New state for network traffic + var is_network_traffic = ref(false); + return { dxcallsign, busy_state, @@ -148,5 +150,6 @@ export const useStateStore = defineStore("stateStore", () => { os_info, rx_buffer_length, radio_status, + is_network_traffic, }; }); diff --git a/freedata_server/server.py b/freedata_server/server.py index 17d98e8d3..18174ac03 100644 --- a/freedata_server/server.py +++ b/freedata_server/server.py @@ -46,7 +46,7 @@ CONFIG_ENV_VAR = 'FREEDATA_CONFIG' DEFAULT_CONFIG_FILE = 'config.ini' -MODEM_VERSION = "0.16.6-alpha" +MODEM_VERSION = "0.16.7-alpha" API_VERSION = 3 LICENSE = 'GPL3.0' diff --git a/freedata_server/stats.py b/freedata_server/stats.py index 68d64cdf6..0ad1ed08e 100644 --- a/freedata_server/stats.py +++ b/freedata_server/stats.py @@ -12,8 +12,8 @@ log = structlog.get_logger("stats") -# we have to move the modem version, its a duplicate -MODEM_VERSION = "0.16.5-alpha" +# we have to move the modem version, its a duplicate +MODEM_VERSION = "0.16.7-alpha" class stats(): diff --git a/setup.py b/setup.py index 6ee8587be..bd08789fd 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( name='freedata', - version='0.16.6a1', + version='0.16.7', packages=find_packages(where='.'), package_dir={'': '.'}, install_requires=required,