ML-168: broadcast index_changed event after background import

Import workers now broadcast :records_index_changed on
"records:index_changed" after successful import via
Records.broadcast_index_changed/0.

CollectionLive.Index and WishlistLive.Index subscribe to the
topic in mount/3 and reload their record streams on receipt,
with a live_action guard to skip reloads when the grid is
hidden behind a modal (:import, :barcode_scan).

IndexActions.handle_index_changed/1 refreshes total_entries
before reloading to keep the pagination bar accurate.
This commit is contained in:
Claudio Ortolina
2026-05-14 16:53:28 +01:00
parent d878364423
commit a59dd22a18
13 changed files with 252 additions and 16 deletions
@@ -8,6 +8,7 @@ defmodule MusicLibraryWeb.CollectionLive.Index do
alias MusicLibrary.Chats
alias MusicLibrary.Collection
alias MusicLibrary.Records
alias MusicLibraryWeb.Components.AddRecord
alias MusicLibraryWeb.LiveHelpers.IndexActions
@@ -242,6 +243,10 @@ defmodule MusicLibraryWeb.CollectionLive.Index do
@impl true
def mount(_params, _session, socket) do
if connected?(socket) do
Records.subscribe_to_index()
end
{:ok,
socket
|> assign(:current_section, :collection)
@@ -300,6 +305,15 @@ defmodule MusicLibraryWeb.CollectionLive.Index do
{:noreply, assign(socket, :chat_count, chat_count)}
end
def handle_info(:records_index_changed, socket)
when socket.assigns.live_action in [:index, :edit] do
{:noreply, IndexActions.handle_index_changed(socket)}
end
def handle_info(:records_index_changed, socket) do
{:noreply, socket}
end
@impl true
def handle_async(:collection_summary, {:ok, summary}, socket) do
{:noreply, assign(socket, :collection_summary, summary)}
@@ -176,6 +176,10 @@ defmodule MusicLibraryWeb.WishlistLive.Index do
@impl true
def mount(_params, _session, socket) do
if connected?(socket) do
Records.subscribe_to_index()
end
current_date = Date.utc_today()
{:ok,
@@ -217,6 +221,15 @@ defmodule MusicLibraryWeb.WishlistLive.Index do
IndexActions.handle_cart_imported_async(socket, count)
end
def handle_info(:records_index_changed, socket)
when socket.assigns.live_action in [:index, :edit] do
{:noreply, IndexActions.handle_index_changed(socket)}
end
def handle_info(:records_index_changed, socket) do
{:noreply, socket}
end
@impl true
def handle_event("delete", %{"id" => id}, socket) do
IndexActions.handle_delete(socket, id)
@@ -146,6 +146,18 @@ defmodule MusicLibraryWeb.LiveHelpers.IndexActions do
{:noreply, load_and_assign_records(socket, socket.assigns.record_list_params)}
end
@doc """
Handles a PubSub notification that records have changed.
Refreshes total_entries and reloads the record stream using the current parameters.
"""
def handle_index_changed(socket) do
config = socket.assigns.index_config
params = socket.assigns.record_list_params
total_records = config.context_module.search_records_count(params.query)
updated_params = %{params | total_entries: total_records}
load_and_assign_records(socket, updated_params)
end
defp record_page_title(record, config) do
Enum.join(
[