diff --git a/.tool-versions b/.tool-versions index 55e53bf..44acbf0 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -erlang 25.2.2 -elixir 1.14.3 +erlang 26.0.2 +elixir 1.15.4 diff --git a/lib/ash_phoenix/form/form.ex b/lib/ash_phoenix/form/form.ex index 1f50aa6..a3b0e6b 100644 --- a/lib/ash_phoenix/form/form.ex +++ b/lib/ash_phoenix/form/form.ex @@ -856,6 +856,15 @@ defmodule AshPhoenix.Form do type: :boolean, default: true, doc: "Set to false to hide errors after validation" + ], + target: [ + type: {:list, :string}, + doc: "The `_target` param provided by phoenix. Used to support the `only_touched?` option." + ], + only_touched?: [ + type: :boolean, + default: false, + doc: "If set to true, only fields that have been marked as touched will be used" ] ] @@ -876,7 +885,32 @@ defmodule AshPhoenix.Form do |> Phoenix.HTML.FormData.to_form(form.options) end - def validate(form, new_params, opts) do + def validate(%{name: name} = form, new_params, opts) do + form = + case opts[:target] do + [^name | target] -> + field = List.last(target) + path = :lists.droplast(target) + + case path do + [] -> + touch(form, field) + + path -> + update_form(form, path, &touch(&1, field)) + end + + _ -> + form + end + + new_params = + if opts[:only_touched?] do + Map.take(new_params, form.touched_forms) + else + new_params + end + opts = validate_opts_with_extra_keys(opts, @validate_opts) prepare_source = form.prepare_source || (& &1) diff --git a/test/form_test.exs b/test/form_test.exs index 6feb052..a1d0606 100644 --- a/test/form_test.exs +++ b/test/form_test.exs @@ -193,7 +193,10 @@ defmodule AshPhoenix.FormTest do test "blank form values unset - helps support dead view forms" do form = - Form.for_create(PostWithDefault, :create, api: Api, exclude_fields_if_empty: [:text, :title]) + Form.for_create(PostWithDefault, :create, + api: Api, + exclude_fields_if_empty: [:text, :title] + ) {:ok, post} = Form.submit(form, params: %{"title" => "", "text" => "bar"}) assert post.text == "bar"