From 3fc7a9dea522de19e3cb81654868dde38d72fbc3 Mon Sep 17 00:00:00 2001 From: Tommaso Patrizi Date: Wed, 2 Apr 2025 17:51:08 +0200 Subject: [PATCH 1/2] add chance to send base errors from after save actions --- lib/backpex/live_components/form_component.ex | 20 +++++++++++++++---- lib/backpex/resource.ex | 2 +- mix.lock | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/backpex/live_components/form_component.ex b/lib/backpex/live_components/form_component.ex index a0bbe9c9..e0194c48 100644 --- a/lib/backpex/live_components/form_component.ex +++ b/lib/backpex/live_components/form_component.ex @@ -262,14 +262,13 @@ defmodule Backpex.FormComponent do after_save_fun: fn item -> handle_uploads(socket, item) live_resource.on_item_updated(socket, item) - - {:ok, item} end ] + return_to = return_to_path(save_type, live_resource, socket, socket.assigns, live_action, item) + case Resource.update(item, params, fields, socket.assigns, live_resource, opts) do - {:ok, item} -> - return_to = return_to_path(save_type, live_resource, socket, socket.assigns, live_action, item) + {:ok, _item} -> info_msg = Backpex.__({"%{resource} has been edited successfully.", %{resource: singular_name}}, live_resource) socket @@ -279,6 +278,19 @@ defmodule Backpex.FormComponent do |> push_navigate(to: return_to) |> noreply() + {:error, %Ecto.Changeset{errors: [base: {error_msg, _}]} = changeset} -> + form = Phoenix.Component.to_form(changeset, as: :change) + + send(self(), {:update_changeset, changeset}) + + socket + |> assign(:show_form_errors, true) + |> assign(:form, form) + |> clear_flash() + |> put_flash(:error, error_msg) + |> push_navigate(to: return_to) + |> noreply() + {:error, %Ecto.Changeset{} = changeset} -> form = Phoenix.Component.to_form(changeset, as: :change) diff --git a/lib/backpex/resource.ex b/lib/backpex/resource.ex index 9bc35556..18ed55b2 100644 --- a/lib/backpex/resource.ex +++ b/lib/backpex/resource.ex @@ -189,7 +189,7 @@ defmodule Backpex.Resource do end defp after_save({:ok, item}, func) do - {:ok, _item} = func.(item) + func.(item) end defp after_save(error, _func), do: error diff --git a/mix.lock b/mix.lock index 2fafb803..df22dad0 100644 --- a/mix.lock +++ b/mix.lock @@ -45,7 +45,7 @@ "sobelow": {:hex, :sobelow, "0.13.0", "218afe9075904793f5c64b8837cc356e493d88fddde126a463839351870b8d1e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cd6e9026b85fc35d7529da14f95e85a078d9dd1907a9097b3ba6ac7ebbe34a0d"}, "spark": {:hex, :spark, "2.2.48", "dd1005c26c7f98ea686a951f7ae58fffb54eff19c47830e6ff68b93f87433baa", [:mix], [{:igniter, ">= 0.3.64 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}, {:sourceror, "~> 1.2", [hex: :sourceror, repo: "hexpm", optional: true]}], "hexpm", "379912647b9ddcc5265e91a82a235a264a727123d1f9e90052d91ad8cebbb2d0"}, "splode": {:hex, :splode, "0.2.9", "3a2776e187c82f42f5226b33b1220ccbff74f4bcc523dd4039c804caaa3ffdc7", [:mix], [], "hexpm", "8002b00c6e24f8bd1bcced3fbaa5c33346048047bb7e13d2f3ad428babbd95c3"}, - "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, + "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [:mix], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, "tailwind_formatter": {:hex, :tailwind_formatter, "0.4.2", "9d1a17ab0ba8780cd662abd32b04a6fe37c22fb52522a11b326fede6f2e79edb", [:mix], [], "hexpm", "c42238f70cd9c5d90fde8162623dc19f3939eb633490f2a6ae108a1ceeb4f59c"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, From a8d7b099cb27ca9df571fdec5f96c4bc762c213a Mon Sep 17 00:00:00 2001 From: Tommaso Patrizi Date: Thu, 5 Jun 2025 07:35:53 +0200 Subject: [PATCH 2/2] [chore] added redirect url --- .tool-versions | 2 +- lib/backpex/live_components/form_component.ex | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.tool-versions b/.tool-versions index 7d317dc9..273a7f17 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -erlang 27.3.1 +erlang 27.3.3 elixir 1.18.3 diff --git a/lib/backpex/live_components/form_component.ex b/lib/backpex/live_components/form_component.ex index e0194c48..cf9d01db 100644 --- a/lib/backpex/live_components/form_component.ex +++ b/lib/backpex/live_components/form_component.ex @@ -9,6 +9,7 @@ defmodule Backpex.FormComponent do alias Backpex.ResourceAction require Backpex + require Logger def update(assigns, socket) do socket @@ -271,12 +272,23 @@ defmodule Backpex.FormComponent do {:ok, _item} -> info_msg = Backpex.__({"%{resource} has been edited successfully.", %{resource: singular_name}}, live_resource) - socket - |> assign(:show_form_errors, false) - |> clear_flash() - |> put_flash(:info, info_msg) - |> push_navigate(to: return_to) - |> noreply() + socket = + socket + |> assign(:show_form_errors, false) + |> clear_flash() + |> put_flash(:info, info_msg) + + if String.starts_with?(return_to, "https://") do + Logger.debug("EXTERNAL URL: redirecting to #{return_to} ...") + + socket + |> redirect(external: return_to) + |> noreply() + else + socket + |> push_navigate(to: return_to) + |> noreply() + end {:error, %Ecto.Changeset{errors: [base: {error_msg, _}]} = changeset} -> form = Phoenix.Component.to_form(changeset, as: :change) @@ -438,8 +450,12 @@ defmodule Backpex.FormComponent do |> Kernel.<>("/#{primary_value}/edit") end - defp return_to_path("continue", _live_resource, _socket, %{current_url: url}, :edit, _item) do - URI.parse(url).path + defp return_to_path("continue", _live_resource, _socket, %{current_url: url, redirect_url: r_url}, :edit, _item) do + if r_url do + r_url + else + URI.parse(url).path + end end defp return_to_path("save", live_resource, socket, assigns, live_action, item) do