From 544d8648a06b3cc87632ac8d53e49788872344df Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Sun, 22 Mar 2026 13:02:09 -0500 Subject: [PATCH] Fix object/item packets showing sender callsign instead of object name Objects and items now display with their own names on the map instead of the originating station's callsign. This prevents confusion where stations creating objects (like repeaters) appear at multiple locations. For example, CALGRY creates repeater objects (147.06-WC, 146.85-NH) which were appearing on the map labeled as "CALGRY" at the repeater locations instead of showing the actual object names. Changes: - Updated map_label() to return object_name for object packets - Updated map_label() to return item_name for item packets - Position packets continue to show the sender callsign - Updated tests to expect object/item names instead of sender This matches APRS.fi behavior where objects are displayed separately from their originating station. --- lib/aprsme_web/live/shared/packet_utils.ex | 26 +++++++++---- .../live/map_live/data_builder_test.exs | 38 +++++++++---------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/lib/aprsme_web/live/shared/packet_utils.ex b/lib/aprsme_web/live/shared/packet_utils.ex index 768708a..35f2839 100644 --- a/lib/aprsme_web/live/shared/packet_utils.ex +++ b/lib/aprsme_web/live/shared/packet_utils.ex @@ -235,18 +235,28 @@ defmodule AprsmeWeb.Live.Shared.PacketUtils do @doc """ Get the map label for a packet. - For map display, always show the sender callsign regardless of whether - it's an object or item packet. This avoids confusion where the map label - shows something different from what the user expects (like a balloon ID - instead of the station callsign). + For objects and items, show the object/item name to distinguish them from + the station that created them. For example, a repeater object should show + the repeater name, not the station that's reporting it. - If the packet is an object or item, you can append the object/item name - in the popup or detail view. + For position packets, show the sender callsign. """ @spec map_label(map()) :: String.t() def map_label(packet) do - # Always return the sender for map labels - get_packet_field(packet, :sender, "") + data_type = get_packet_field(packet, :data_type, "") + + cond do + data_type == "object" -> + object_name = get_packet_field(packet, :object_name, "") + if object_name == "", do: get_packet_field(packet, :sender, ""), else: object_name + + data_type == "item" -> + item_name = get_packet_field(packet, :item_name, "") + if item_name == "", do: get_packet_field(packet, :sender, ""), else: item_name + + true -> + get_packet_field(packet, :sender, "") + end end defp non_empty_string?(value) when is_binary(value), do: String.trim(value) != "" diff --git a/test/aprsme_web/live/map_live/data_builder_test.exs b/test/aprsme_web/live/map_live/data_builder_test.exs index 375a0ae..5eb1b0f 100644 --- a/test/aprsme_web/live/map_live/data_builder_test.exs +++ b/test/aprsme_web/live/map_live/data_builder_test.exs @@ -27,9 +27,9 @@ defmodule AprsmeWeb.MapLive.DataBuilderTest do result = DataBuilder.build_packet_data(packet, true) assert result - # Map label shows sender for clarity - assert result["callsign"] == "DB0SDA" - # But grouping uses object name + # Map label shows object name for objects + assert result["callsign"] == "P-K5SGD" + # Grouping also uses object name assert result["callsign_group"] == "P-K5SGD" end @@ -56,9 +56,9 @@ defmodule AprsmeWeb.MapLive.DataBuilderTest do result = DataBuilder.build_packet_data(packet, true) assert result - # Map label shows sender for clarity - assert result["callsign"] == "N0CALL" - # But grouping uses item name + # Map label shows item name for items + assert result["callsign"] == "REPEATER1" + # Grouping also uses item name assert result["callsign_group"] == "REPEATER1" end @@ -111,9 +111,9 @@ defmodule AprsmeWeb.MapLive.DataBuilderTest do result = DataBuilder.build_packet_data(packet, true) - # Popup now shows sender for consistency with map label - assert result["popup"] =~ "DB0SDA" - refute result["popup"] =~ "P-K5SGD" + # Popup now shows object name for objects + assert result["popup"] =~ "P-K5SGD" + refute result["popup"] =~ "DB0SDA" end test "build_minimal_packet_data uses sender for map label but object_name for grouping" do @@ -139,13 +139,13 @@ defmodule AprsmeWeb.MapLive.DataBuilderTest do result = DataBuilder.build_minimal_packet_data(packet, true, false) assert result - # Map label shows sender for clarity - assert result["callsign"] == "DB0SDA" - # But grouping uses object name + # Map label shows object name for objects + assert result["callsign"] == "P-K5SGD" + # Grouping also uses object name assert result["callsign_group"] == "P-K5SGD" - # Symbol HTML should show sender, not object name - assert result["symbol_html"] =~ "DB0SDA" - refute result["symbol_html"] =~ "P-K5SGD" + # Symbol HTML should show object name + assert result["symbol_html"] =~ "P-K5SGD" + refute result["symbol_html"] =~ "DB0SDA" end test "build_minimal_packet_data uses red dot HTML for historical (non-most-recent) packets" do @@ -338,9 +338,9 @@ defmodule AprsmeWeb.MapLive.DataBuilderTest do results = DataBuilder.build_packet_data_list([object_packet_1, object_packet_2]) - # Map labels should show sender + # Map labels should show object name callsigns = Enum.map(results, & &1["callsign"]) - assert Enum.all?(callsigns, &(&1 == "DB0SDA")) + assert Enum.all?(callsigns, &(&1 == "P-K5SGD")) # But grouping should be by object name groups = Enum.map(results, & &1["callsign_group"]) @@ -369,8 +369,8 @@ defmodule AprsmeWeb.MapLive.DataBuilderTest do popup = DataBuilder.build_simple_popup(packet, false) - assert popup =~ "WA0YMH-2" - refute popup =~ "X3234025" + assert popup =~ "X3234025" + refute popup =~ "WA0YMH-2" end end end