fix: pass actor to CustomFieldLive.FormComponent for save

IndexComponent now passes actor to FormComponent; FormComponent uses
assigns[:actor] instead of current_actor(socket). Add test that submits
new custom field form on settings page.
This commit is contained in:
Moritz 2026-01-29 13:59:24 +01:00 committed by moritz
parent 1d17c4f2dd
commit 9a7622ebed
3 changed files with 44 additions and 1 deletions

View file

@ -91,7 +91,8 @@ defmodule MvWeb.CustomFieldLive.FormComponent do
@impl true @impl true
def handle_event("save", %{"custom_field" => custom_field_params}, socket) do def handle_event("save", %{"custom_field" => custom_field_params}, socket) do
actor = MvWeb.LiveHelpers.current_actor(socket) # Actor must be passed from parent (IndexComponent); component socket has no current_user
actor = socket.assigns[:actor]
case MvWeb.LiveHelpers.submit_form(socket.assigns.form, custom_field_params, actor) do case MvWeb.LiveHelpers.submit_form(socket.assigns.form, custom_field_params, actor) do
{:ok, custom_field} -> {:ok, custom_field} ->

View file

@ -38,6 +38,7 @@ defmodule MvWeb.CustomFieldLive.IndexComponent do
<.live_component <.live_component
module={MvWeb.CustomFieldLive.FormComponent} module={MvWeb.CustomFieldLive.FormComponent}
id={@form_id} id={@form_id}
actor={@actor}
custom_field={@editing_custom_field} custom_field={@editing_custom_field}
on_save={ on_save={
fn custom_field, action -> send(self(), {:custom_field_saved, custom_field, action}) end fn custom_field, action -> send(self(), {:custom_field_saved, custom_field, action}) end

View file

@ -15,6 +15,7 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do
use MvWeb.ConnCase, async: true use MvWeb.ConnCase, async: true
import Phoenix.LiveViewTest import Phoenix.LiveViewTest
require Ash.Query
alias Mv.Membership.{CustomField, CustomFieldValue, Member} alias Mv.Membership.{CustomField, CustomFieldValue, Member}
@ -230,6 +231,46 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do
end end
end end
describe "create custom field" do
test "submitting new data field form creates custom field and shows success", %{conn: conn} do
{:ok, view, _html} = live(conn, ~p"/settings")
# Open "New Data Field" form
view
|> element("#custom-fields-component button", "New Data Field")
|> render_click()
# Form is visible; submit with valid data
form_params = %{
"custom_field" => %{
"name" => "Created via Form",
"value_type" => "string",
"description" => "",
"required" => "false",
"show_in_overview" => "true"
}
}
view
|> form("#custom-field-form-new-form", form_params)
|> render_submit()
# Success flash (FormComponent needs actor from parent; without it KeyError would occur)
assert render(view) =~ "successfully"
# Custom field was created in DB
system_actor = Mv.Helpers.SystemActor.get_system_actor()
search_name = "Created via Form"
[custom_field] =
Mv.Membership.CustomField
|> Ash.Query.filter(name == ^search_name)
|> Ash.read!(actor: system_actor)
assert custom_field.value_type == :string
end
end
# Helper functions # Helper functions
defp create_member do defp create_member do
system_actor = Mv.Helpers.SystemActor.get_system_actor() system_actor = Mv.Helpers.SystemActor.get_system_actor()