Reset form validation error state in a LiveView form

Context: I have a multi-step form (10+ steps) made in LiveView (Surface, technically, but I think this question is not Surface-specific). Each step contains some form inputs, on submission the data is validated, saved to the DB, then state in the LiveView is updated to show the next step (user remains at the same URL for each step).

Everything works great for the first rendered step, form errors show when the user has filled something out wrong, but not until they’ve entered something in the field.

My problem is that subsequent steps have their errors showing immediately. I know this has to do with phx-no-feedback, which as far as I can tell is a stateful thing handled on the client and I don’t see how I can tell it to “reset” back to a clean state.

I have worked around this by doing a push_redirect to the same URL, causing the liveview to remount on each step, however this means I can no longer easily send push_events because it’s swallowed by the redirect. I’d like to just fix the core issue of form errors showing up when I don’t want them to.

push_patch to a new URL for each step (which I don’t want to do) such as forms/:id?step=:step_id also has the same behavior (pictured below).

Any ideas/workarounds?

1 Like

Are the steps all one form? I’d probably suggest using separate forms. But you can also “reset” a form by updating its id attribute.

3 Likes

Each step is using the same custom form wrapper component, which uses the same hard-coded id. Changing the id per step totally worked! Thank you!

1 Like

Is ID updating the best method for resetting forms in July 2024? I have a form that’s always visible and needs to be reset after submit and there are a number of proposed methods for how this could best be done:

  1. don’t use forms. Just map form input to LV assigns and update assigns on change and submit
  2. Use a Phx hook to reset the fields in JS after receiving an event from the server
  3. update the ID of the form. This requires me to track the ID of the form somewhere so that I can reuse it on updates but ensure it’s changed on submits
  4. Use a button[type=reset] and do my submission validations in the reset handler. But then there’s a flash of empty form → previous form with errors when submission fails

It would be nice if we could set changeset actions to :reset or some other convenience since same page form resetting is a pretty common task.

1 Like