axelclark

axelclark

Drab: Using a Shared Commander and Living Assigns

I’m working on a golf scorecard app. I’d like to be able to quickly update the number of strokes using Drab. I’m displaying the scores for each round in a table then rendering each score in a partial for that row.

show.html.eex

<h2>Scorecard</h2>

<table>
  <thead>
    <tr>
      <th>Hole Number</th>
      <th>Par</th>
      <th>Add</th>
      <th>Strokes</th>
    </tr>
  </thead>
  <tbody>
    <%= for score <- @round.scores do %>
      <%= render "score_rows.html", Map.put(assigns, :score, score) %>
    <% end %>
  </tbody>
</table>

score_rows.html.drab

<tr drab-commander="GolfWeb.RoundCommander">
  <td>
    <%= @score.hole.hole_number %>
  </td>
  <td>
    <%= @score.hole.par %>
  </td>
  <td>
    <button drab="click:add({id: <%= @score.id %>, num_strokes: <%= @score.num_strokes %>})">+</button>
  </td>
  <td>
    <%= @score.num_strokes %>
  </td>
</tr>

Eventually I will update the database, but I’m just trying to get it wired up for now. Here is my commander.
round_commander.ex

defmodule GolfWeb.RoundCommander do
  use Drab.Commander

  defhandler add(socket, sender, %{"id" => id, "num_strokes" => num_strokes}) do
    score = %{id: id, num_strokes: add_stroke(num_strokes), hole: %{par: 4, hole_number: 2}}
    poke socket, "score_rows.html", score: score
  end

  defp add_stroke(nil), do: 1
  defp add_stroke(num_strokes), do: (num_strokes + 1)
end

When I click the add button, all of the scores in the table are updated rather than just the score within the row.

In the Drab Examples section titled “Shared Commanders and Living Assigns”, it looks like only the partials within each drab-commander should be updated. I checked the rendered html and each partial has a different drab-id.

I also found the Shared Commanders section in the Drab docs and couldn’t find anything I needed to change.

Is what I’m trying to do possible or any ideas about what I’m doing wrong? Thanks!

Marked As Solved

axelclark

axelclark

I was able to get the basic functionality working using set_prop instead of poke:

score_rows.html.drab

<tr drab-commander="GolfWeb.RoundCommander">
  <td>
    <%= @score.hole.hole_number %>
  </td>
  <td>
    <%= @score.hole.par %>
  </td>
  <td>
    <button drab="click:add({id: <%= @score.id %>})">+</button>
  </td>
  <td class="num_strokes">
    <%= @score.num_strokes %>
  </td>
</tr>

RoundCommander.ex

  defhandler add(socket, sender, _params) do
    # hard code "4" for testing
    set_prop socket, this_commander(sender) <> " .num_strokes", innerHTML: "4"
  end

This updates only the score next to the button.

Also Liked

grych

grych

Creator of Drab

Well, it should be like this, otherwise it is counter-intuitive. I did not test this behaviour under the partial, but I will. Thanks for this!

Where Next?

Popular in Questions Top

mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
chokchit
** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2733ms. You can configure how long re...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
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
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
Lily
In templates/appointment/index.html.eex: &lt;%= for appointment &lt;- @appointments do %&gt; &lt;tr&gt; &lt;td&gt;&lt;%= appoi...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New

Other popular topics Top

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
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 43591 214
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

We're in Beta

About us Mission Statement