mirror of
https://github.com/ash-project/ash_phoenix.git
synced 2024-09-20 07:12:49 +12:00
fix: mark forms updated with update_form/4
as touched by default
This commit is contained in:
parent
f5390fb8dd
commit
1bbe7c34db
2 changed files with 56 additions and 4 deletions
|
@ -1370,8 +1370,18 @@ defmodule AshPhoenix.Form do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@update_form_opts [
|
||||||
|
mark_as_touched?: [
|
||||||
|
type: :boolean,
|
||||||
|
default: true,
|
||||||
|
doc: "Whether or not to mark the path to the updating form as touched"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
@spec update_form(t(), list(atom | integer) | String.t(), (t() -> t())) :: t()
|
@spec update_form(t(), list(atom | integer) | String.t(), (t() -> t())) :: t()
|
||||||
def update_form(form, path, func) do
|
def update_form(form, path, func, opts \\ []) do
|
||||||
|
opts = Ash.OptionsHelpers.validate!(opts, @update_form_opts)
|
||||||
|
|
||||||
path =
|
path =
|
||||||
case path do
|
case path do
|
||||||
[] ->
|
[] ->
|
||||||
|
@ -1395,14 +1405,36 @@ defmodule AshPhoenix.Form do
|
||||||
List.update_at(nested_forms, integer, &update_form(&1, rest, func))
|
List.update_at(nested_forms, integer, &update_form(&1, rest, func))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
%{form | forms: new_forms}
|
if opts[:mark_as_touched?] do
|
||||||
|
%{
|
||||||
|
form
|
||||||
|
| forms: new_forms,
|
||||||
|
touched_forms: MapSet.put(form.touched_forms, to_string(atom))
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%{
|
||||||
|
form
|
||||||
|
| forms: new_forms
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
[atom | rest] ->
|
[atom | rest] ->
|
||||||
new_forms =
|
new_forms =
|
||||||
form.forms
|
form.forms
|
||||||
|> Map.update!(atom, &update_form(&1, rest, func))
|
|> Map.update!(atom, &update_form(&1, rest, func, opts))
|
||||||
|
|
||||||
%{form | forms: new_forms}
|
if opts[:mark_as_touched?] do
|
||||||
|
%{
|
||||||
|
form
|
||||||
|
| forms: new_forms,
|
||||||
|
touched_forms: MapSet.put(form.touched_forms, to_string(atom))
|
||||||
|
}
|
||||||
|
else
|
||||||
|
%{
|
||||||
|
form
|
||||||
|
| forms: new_forms
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,26 @@ defmodule AshPhoenix.FormTest do
|
||||||
"Unhandled error in form submission for AshPhoenix.Test.Comment.create_with_unknown_error"
|
"Unhandled error in form submission for AshPhoenix.Test.Comment.create_with_unknown_error"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "update_form marks touched by default" do
|
||||||
|
form =
|
||||||
|
Post
|
||||||
|
|> Form.for_create(:create,
|
||||||
|
api: Api,
|
||||||
|
params: %{"text" => "bar"},
|
||||||
|
forms: [
|
||||||
|
comments: [
|
||||||
|
type: :list,
|
||||||
|
resource: Comment,
|
||||||
|
create_action: :create_with_unknown_error
|
||||||
|
]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|> Form.add_form([:comments], params: %{"text" => "foo"})
|
||||||
|
|> Form.update_form([:comments, 0], & &1)
|
||||||
|
|
||||||
|
assert MapSet.member?(form.touched_forms, "comments")
|
||||||
|
end
|
||||||
|
|
||||||
test "errors are not set on the parent and single child form" do
|
test "errors are not set on the parent and single child form" do
|
||||||
form =
|
form =
|
||||||
Comment
|
Comment
|
||||||
|
|
Loading…
Reference in a new issue