Default value for a text input in an Ash.Form

I’m trying to provide a default value (which is a name retrieved from a DB) to an input tag. When the form is mounted, the default value in the “name” field input box is populated as expected. Then the user enters a different name to replace the default value, and it changes with no problem. However, when the user then enters a value to the other input (“Code” field), the Name field goes back to the initial default value. How can I make the form keep the user input (after the form validation)? Or is there a better way to provide a default input value?

<.form :let={f} phx-change="validate">
<.input field={{f, :name}} type="text" label="Name" value={@dynamic_default_name}>

<.input field={{f, :code}} type="text" label="Code" >
</.form>
def handle_event("validate", %{"form" => form_params}, socket) do
   form = AshPhoenix.Form.validate(socket.assigns.form, form_params)

  socket
   |> assign(:form, form)
  |> noreply()
end

There are three ways to do it. The first, is to set the default in the action logic

change fn changeset, _ -> 
  if ...(check if argument or attribute set w/ your name) do
    Ash.Changeset.change_attribute(:name, dynamic_default)
  else
    changeset
  end
end

The second one:

<.input field={{f, :name}} type="text" label="Name" value={AshPhoenix.Form.value(f, :name) || @dynamic_default_name}>

The third one, when creating the initial form

form = AshPhoenix.Form.for_create(...)
AshPhoenix.Form.validate(form, %{...params with deafult})
4 Likes

Using AshPhoenix.Form.validate in handle_params causes my form to briefly display errors on page load.

Try doing AshPhoenix.Form.validate(form, %{...params}, errors: false)

1 Like