From 0b86cd66ce89ce1fb6cf20fd5276f90e693461d4 Mon Sep 17 00:00:00 2001 From: jamey Date: Fri, 27 Mar 2026 10:36:05 +0000 Subject: [PATCH] improve backup button responsiveness and disable handling Use async message passing for create_backup to update UI immediately. Add phx-throttle and pointer-events:none to fully prevent double-clicks. Co-Authored-By: Claude Opus 4.5 --- assets/css/admin/components.css | 2 +- lib/berrypod_web/live/admin/backup.ex | 35 +++++++++++++++------------ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/assets/css/admin/components.css b/assets/css/admin/components.css index 6bfec2e..c2a6ec1 100644 --- a/assets/css/admin/components.css +++ b/assets/css/admin/components.css @@ -187,7 +187,7 @@ color: var(--t-text-inverse); &:hover { opacity: 0.85; } - &:disabled { opacity: 0.5; cursor: not-allowed; } + &:disabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; } } .admin-btn-primary { diff --git a/lib/berrypod_web/live/admin/backup.ex b/lib/berrypod_web/live/admin/backup.ex index 55b97f4..ce9e3cb 100644 --- a/lib/berrypod_web/live/admin/backup.ex +++ b/lib/berrypod_web/live/admin/backup.ex @@ -40,25 +40,11 @@ defmodule BerrypodWeb.Admin.Backup do end def handle_event("create_backup", _params, socket) do - # Ignore if already creating if socket.assigns.create_backup_status == :saving do {:noreply, socket} else - socket = assign(socket, :create_backup_status, :saving) - - case Backup.create_backup() do - {:ok, _path} -> - {:noreply, - socket - |> assign(:backups, Backup.list_backups()) - |> assign(:create_backup_status, :saved)} - - {:error, error} -> - {:noreply, - socket - |> assign(:create_backup_status, :error) - |> put_flash(:error, "Failed to create backup: #{inspect(error)}")} - end + send(self(), :do_create_backup) + {:noreply, assign(socket, :create_backup_status, :saving)} end end @@ -186,6 +172,22 @@ defmodule BerrypodWeb.Admin.Backup do end @impl true + def handle_info(:do_create_backup, socket) do + case Backup.create_backup() do + {:ok, _path} -> + {:noreply, + socket + |> assign(:backups, Backup.list_backups()) + |> assign(:create_backup_status, :saved)} + + {:error, error} -> + {:noreply, + socket + |> assign(:create_backup_status, :error) + |> put_flash(:error, "Failed to create backup: #{inspect(error)}")} + end + end + def handle_info(:do_restore, socket) do backup_path = socket.assigns.uploaded_backup.path @@ -329,6 +331,7 @@ defmodule BerrypodWeb.Admin.Backup do