Background
I have a button that may be disabled or not, depending on a set of conditions. I want to disable/enable the button without having to reload the page.
To achieve this I am using the following code:
my_app_live.ex
#provided as a sample
def disable_buttton? do
if :rand.uniform(100) > 50 do
"true"
else
"false"
end
end
my_app.html.heex
<.button disabled={disable_button?)}>Execute Command</.button>
core_components.ex
def button(assigns) do
extra = assigns_to_attributes(assigns, [:disabled])
assigns = assign(assigns, :disabled?, case Map.get(extra[:rest], :disabled) do
"true" -> true
_ -> false
end)
~H"""
<p><%= "INSIDE BUTTON: #{inspect(@disabled?)}" %></p>
<button
type={@type}
class={if @disabled? do
[
"rounded-md bg-slate-400 px-3 py-2 text-sm font-semibold text-white shadow-sm",
@class
]
else
[
"rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm",
"active:text-white/80",
@class
]
end}
{@rest}
>
<%= render_slot(@inner_block) %>
</button>
"""
end
Problem
For some reason, <p><%= "INSIDE BUTTON: #{inspect(@disabled?)}" %></p>
always shows true
and thus the button is always disabled.
In reality disable_buttton?
may return true/false depending on which buttons are selected (if all forms have a value, then the button should be enabled), however I am unaware of any pattern to do this in Phoenix.
I am also not convinced I am using assigns
properly.
Questions
- How can I enable/disable a button in Phoenix, depending on state?
- Am I using
assigns_to_attributes
andassign
correctly in this sample?
I read Phoenix.Component — Phoenix LiveView v0.19.5 but I still don’t quite understand what I am missing here.