Unify code in debates/legislation vote links
We were using the same code to render links to agree and disagree, so we can extract a new component for this code. We're also adding component tests to make it easier to test whether we're breaking anything while refactoring, although the code is probably already covered by system tests. Since the votes mixin was only used in one place, we're removing it and moving most of its code to a new CSS file for the shared component.
This commit is contained in:
40
app/components/shared/in_favor_against_component.html.erb
Normal file
40
app/components/shared/in_favor_against_component.html.erb
Normal file
@@ -0,0 +1,40 @@
|
||||
<div class="in-favor-against">
|
||||
<div class="in-favor inline-block">
|
||||
<% if current_user %>
|
||||
<%= link_to polymorphic_path(votable, action: :vote, value: "yes"),
|
||||
class: "like #{voted_classes[:in_favor]}", title: t("votes.agree"), method: "post", remote: true do %>
|
||||
<span class="icon-like">
|
||||
<span class="show-for-sr"><%= t("votes.agree") %></span>
|
||||
</span>
|
||||
<span class="percentage"><%= votes_percentage("likes", votable) %></span>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<div class="like">
|
||||
<span class="icon-like">
|
||||
<span class="show-for-sr"><%= t("votes.agree") %></span>
|
||||
</span>
|
||||
<span class="percentage"><%= votes_percentage("likes", votable) %></span>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<span class="divider"></span>
|
||||
|
||||
<div class="against inline-block">
|
||||
<% if current_user %>
|
||||
<%= link_to polymorphic_path(votable, action: :vote, value: "no"), class: "unlike #{voted_classes[:against]}", title: t("votes.disagree"), method: "post", remote: true do %>
|
||||
<span class="icon-unlike">
|
||||
<span class="show-for-sr"><%= t("votes.disagree") %></span>
|
||||
</span>
|
||||
<span class="percentage"><%= votes_percentage("dislikes", votable) %></span>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<div class="unlike">
|
||||
<span class="icon-unlike">
|
||||
<span class="show-for-sr"><%= t("votes.disagree") %></span>
|
||||
</span>
|
||||
<span class="percentage"><%= votes_percentage("dislikes", votable) %></span>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
25
app/components/shared/in_favor_against_component.rb
Normal file
25
app/components/shared/in_favor_against_component.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
class Shared::InFavorAgainstComponent < ApplicationComponent
|
||||
attr_reader :votable
|
||||
delegate :current_user, :votes_percentage, to: :helpers
|
||||
|
||||
def initialize(votable)
|
||||
@votable = votable
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def voted_classes
|
||||
@voted_classes ||= css_classes_for_vote
|
||||
end
|
||||
|
||||
def css_classes_for_vote
|
||||
case current_user&.voted_as_when_voted_for(votable)
|
||||
when true
|
||||
{ in_favor: "voted", against: "no-voted" }
|
||||
when false
|
||||
{ in_favor: "no-voted", against: "voted" }
|
||||
else
|
||||
{ in_favor: "", against: "" }
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user