Terbium-135

Terbium-135

Live Component within form not updated

I’ve added a Live Component (within a nested schema) to a form. Changing the state of the component is neither persisted to the form nor an update event is sent.

Is it because the component has focus? But then at least the form update should succeed?
What did I miss?

Will be thankful for any help or pointers what to look at
Frontend is really not my scene…

Update event:

def handle_info({:updated_params, opts}, socket) do
  changeset = Backend.Schema.Meal.changeset_quick_edit(socket.assigns.content, opts)

  changeset = %{changeset | action: @check_for_errors}
  changed = changeset.changes != %{}
  form = to_form(changeset)

  state = [
    changed?: changed,
    intolerances_as_string:
      Intolerance.to_string(Ecto.Changeset.apply_changes(changeset).intolerance,
        locale: socket.assigns.locale
      ),
    form: form
  ]
  {:noreply, socket |> assign(state)}
end

Changeset:

changeset #=> #Ecto.Changeset<
  action: nil,
  changes: %{
    intolerance: #Ecto.Changeset<
      action: :update,
      changes: %{gluten_by_variety: [:wheat, :rye, :oats]},
      errors: [],
      data: #Backend.Schema.Intolerance<>,
      valid?: true,
      ...
    >
  },
  errors: [],
  data: #Backend.Schema.Meal<>,
  valid?: true,
  ...
>

Form (simplified):

<.form
  class="text_black dark:text_zinc_800"
  for={@form}
  phx-change="validate"
  phx-submit="save"
>
  <.input class="!text-white" field={@form[:displayname]} phx-debounce="300" />
  <.inputs_for :let={intolerances} field={@form[:intolerance]}>
debounce="300" /> --%>
    <.live_component
      id="glutens"
      module={BackendWeb.Components.MultiSelectComponent}
      options={@glutens}
      locale={@locale}
      field={intolerances[:gluten_by_variety]}
    />
    <.live_component
      id="nuts"
      module={BackendWeb.Components.MultiSelectComponent}
      options={@nuts}
      locale={@locale}
      field={intolerances[:nuts_by_variety]}
    />
  </.inputs_for>
</.form>

First Post!

mindok

mindok

Updating focused input elements from the server doesn’t work by design - it is assumed that user input “takes priority” while the element is focused. See Syncing changes and optimistic UIs — Phoenix LiveView v1.2.5 for the challenges and model used.

I had to cook up a bit of an elaborate workaround a few days ago to handle checkbox clicks that toggle state server-side - I ended up using JS.focus to push the focus to a hidden input (using sr-only tailwind class) so I could update the checkbox state. I’m sure someone here can give me some better ideas!

As to the form not updating - do you mean the server representation of the form, or how it renders in the browser?

Where Next?

Popular in Questions Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New

Other popular topics Top

jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31194 112
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

We're in Beta

About us Mission Statement