From 9de7cd99eeee83ec00aaef52fc1f75d5820513ee Mon Sep 17 00:00:00 2001 From: Dmitry Popov Date: Thu, 2 Jan 2025 20:56:14 +0100 Subject: [PATCH] fix(Map): Fix 'Character Activity' modal --- .../components/character_activity.ex | 47 +++++++++++++++++++ .../map_activity_event_handler.ex | 13 ++--- .../live/maps/map_live.html.heex | 23 +++++++++ 3 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 lib/wanderer_app_web/components/character_activity.ex diff --git a/lib/wanderer_app_web/components/character_activity.ex b/lib/wanderer_app_web/components/character_activity.ex new file mode 100644 index 00000000..dbbaa31f --- /dev/null +++ b/lib/wanderer_app_web/components/character_activity.ex @@ -0,0 +1,47 @@ +defmodule WandererAppWeb.CharacterActivity do + use WandererAppWeb, :live_component + use LiveViewEvents + + @impl true + def mount(socket) do + {:ok, socket} + end + + @impl true + def update( + assigns, + socket + ) do + {:ok, + socket + |> handle_info_or_assign(assigns)} + end + + def render(assigns) do + ~H""" +
+ <.table class="!max-h-[80vh] !overflow-y-auto" id="activity-tbl" rows={@activity}> + <:col :let={row} label="Character"> + <.character_item character={row.character} /> + + <:col :let={row} label="Passages"> + <%= row.count %> + + +
+ """ + end + + def character_item(assigns) do + ~H""" +
+
+
+ {@character.name} +
+
+ <%= @character.name %> +
+ """ + end +end diff --git a/lib/wanderer_app_web/live/maps/event_handlers/map_activity_event_handler.ex b/lib/wanderer_app_web/live/maps/event_handlers/map_activity_event_handler.ex index 8283beb4..3a3cf48f 100644 --- a/lib/wanderer_app_web/live/maps/event_handlers/map_activity_event_handler.ex +++ b/lib/wanderer_app_web/live/maps/event_handlers/map_activity_event_handler.ex @@ -18,15 +18,12 @@ defmodule WandererAppWeb.MapActivityEventHandler do do: MapCoreEventHandler.handle_server_event(event, socket) def handle_ui_event("show_activity", _, %{assigns: %{map_id: map_id}} = socket) do - Task.async(fn -> - {:ok, character_activity} = map_id |> get_character_activity() - - {:character_activity, character_activity} - end) - {:noreply, socket - |> assign(:show_activity?, true)} + |> assign(:show_activity?, true) + |> assign_async(:character_activity, fn -> + map_id |> get_character_activity() + end)} end def handle_ui_event("hide_activity", _, socket), @@ -44,6 +41,6 @@ defmodule WandererAppWeb.MapActivityEventHandler do %{p | character: p.character |> MapEventHandler.map_ui_character_stat()} end) - {:ok, %{jumps: jumps}} + {:ok, %{character_activity: jumps}} end end diff --git a/lib/wanderer_app_web/live/maps/map_live.html.heex b/lib/wanderer_app_web/live/maps/map_live.html.heex index dc6f83c0..ff74cfb7 100644 --- a/lib/wanderer_app_web/live/maps/map_live.html.heex +++ b/lib/wanderer_app_web/live/maps/map_live.html.heex @@ -31,6 +31,29 @@ +<.modal + :if={assigns |> Map.get(:show_activity?, false)} + id="map-activity-modal" + title="Activity of Characters" + class="!w-[500px]" + show + on_cancel={JS.push("hide_activity")} +> + <.async_result :let={character_activity} assign={@character_activity}> + <:loading>Loading... + <:failed :let={reason}><%= reason %> + + + <.live_component + module={WandererAppWeb.CharacterActivity} + id="character-activity" + activity={character_activity} + notify_to={self()} + /> + + + + <.modal :if={assigns |> Map.get(:show_tracking?, false)} id="map-tracking-modal"