Arsenalist
I want to show input fields based on the value of a the radio button. Here are the two approaches I tried. This is inside a LiveComponent and I’m on LiveView 1.0.2. What is the best way to implement this simple feature (neither of the below work)?
APPROACH 1
When I click on a radio button, it is selected, but none of the following two ifs evaluate to true so the additional fields are never shown.
<.form for={@form} phx-change="validate" phx-submit="save" phx-target={@myself}>
<.input
label="I am an individual"
type="radio"
value="INDIVIDUAL"
field={@form[:entity_type]}
/>
<.input
label="I represent a company"
type="radio"
value="COMPANY"
field={@form[:entity_type]}
/>
<%= if Phoenix.HTML.Form.input_value(@form, :entity_type) == "INDIVIDUAL" do %>
<.input label="First Name" type="text" field={@form[:first_name]} />
<.input label="Last Name" type="text" field={@form[:last_name]} />
<% end %>
<%= if Phoenix.HTML.Form.input_value(@form, :entity_type) == "COMPANY" do %>
<.input label="Company Name" type="text" field={@form[:company_name]} />
<% end %>
</.form>
Here is the LiveView code:
def mount(socket) do
form_attributes = %{
"first_name" => "",
"last_name" => "",
"company_name" => "",
"entity_type" => ""
}
{:ok,
assign(
socket,
:form,
to_form(form_attributes)
)
}
end
def handle_event("validate", _params, socket) do
{:noreply, socket}
end
APPROACH 2
After not getting this to work I also tried this approach where I set a new variable to track which entity_type is selected. This resulted in the if condition being executed, but the radio button not being selected and I have to click it again for it to be selected. Here’s a video: Area - Dubz
<.form for={@form} phx-change="validate" phx-submit="save" phx-target={@myself}>
<.input
label="I am an individual"
type="radio"
value="INDIVIDUAL"
field={@form[:entity_type]}
phx-change="entity_type_changed"
phx-target={@myself}
/>
<.input
label="I represent a company"
type="radio"
value="COMPANY"
field={@form[:entity_type]}
phx-change="entity_type_changed"
phx-target={@myself}
/>
<%= if @entity_type_selected == "INDIVIDUAL" do %>
<.input label="First Name" type="text" field={@form[:first_name]} />
<.input label="Last Name" type="text" field={@form[:last_name]} />
<% end %>
<%= if @entity_type_selected == "COMPANY" do %>
<.input label="Company Name" type="text" field={@form[:company_name]} />
<% end %>
</.form>
def mount(socket) do
form_attributes = %{
"first_name" => "",
"last_name" => "",
"company_name" => "",
"entity_type" => ""
}
{:ok,
assign(
socket,
:form,
to_form(form_attributes)
)
|> assign(:entity_type_selected, "")
}
end
def handle_event("entity_type_changed", %{"entity_type" => entity_type} = params, socket) do
{:noreply, assign(socket, :entity_type_selected, entity_type)}
end
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 6- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
garrison
When your
"validate"event is called, the form sends back the params in theparamsvariable (the second argument tohandle_event/3). You have to actually assign the new values back to the socket - currently you are just throwing them away.This is why your first approach doesn’t work. It’s also why your second approach doesn’t work - you are updating the variable, but you’re also throwing away the new params, so when the update comes back from the server it clobbers the radio button (since the server state was never changed).
LostKobrakai
The form abstraction needs to deal with invalid and partial values and various types of values. Hence it’s not the best place to check if an input is of a certain value. I’d suggest checking
Ecto.Changeset.get_field(@form.source, field)instead if the form is based on a changeset.Arsenalist
Thank you, I tried that and it only partially worked. The if conditions worked fine but the radio button remained unselected in the UI. Here’s a video: ex - Dubz
LiveComponent
Template:
Here’s also the core_component.ex part which renders the radio button:
The IO.inspect prints this in the console:
Arsenalist
BTW, I also tried adding this to the radio input but same effect:
garrison
You need to handle the checked state in your
inputcomponent, it’s not actually added to the real<input>element. It would probably be better to compare the value there instead of passing incheckedanyway.Also, radio buttons are not supposed to share the same
id, only thename.sreyansjain
You can try this. I am on mobile so I am a bit limited now.
For conditional field visibility this would work too
Need to update the form in the validate event