Extract component to render dashboard polls

Just like we usually do when reorganizing code.
This commit is contained in:
Javi Martín
2025-08-26 18:42:03 +02:00
parent fc0d79b47b
commit de303aa1df
5 changed files with 43 additions and 33 deletions

View File

@@ -0,0 +1,5 @@
<div class="row expanded margin-top" data-equalizer="poll-cards" data-equalize-on="medium">
<% polls.each do |poll| %>
<%= render Dashboard::PollComponent.new(poll) %>
<% end %>
</div>

View File

@@ -0,0 +1,11 @@
class Dashboard::PollsComponent < ApplicationComponent
attr_reader :polls
def initialize(polls)
@polls = polls
end
def render?
polls.any?
end
end

View File

@@ -3,13 +3,7 @@
<div class="small-12 medium-9 column"> <div class="small-12 medium-9 column">
<%= Setting["proposals.poll_description"] %> <%= Setting["proposals.poll_description"] %>
<% if @polls.any? %> <%= render Dashboard::PollsComponent.new(@polls) %>
<div class="row expanded margin-top" data-equalizer="poll-cards" data-equalize-on="medium">
<% @polls.each do |poll| %>
<%= render Dashboard::PollComponent.new(poll) %>
<% end %>
</div>
<% end %>
</div> </div>
<div class="small-12 medium-3 column"> <div class="small-12 medium-3 column">

View File

@@ -9,27 +9,13 @@ describe Dashboard::PollComponent do
describe "Poll card content" do describe "Poll card content" do
describe "actions visibility" do describe "actions visibility" do
it "shows edit link for upcoming polls" do
upcoming = create(:poll, related: proposal, starts_at: 1.week.from_now)
render_inline Dashboard::PollComponent.new(upcoming)
page.find("div#poll_#{upcoming.id}") do |poll_card|
expect(poll_card).to have_link "Edit survey",
href: edit_proposal_dashboard_poll_path(proposal, upcoming)
expect(poll_card).not_to have_link "View results"
end
end
it "shows results link for current polls" do it "shows results link for current polls" do
current = create(:poll, related: proposal) current = create(:poll, related: proposal)
render_inline Dashboard::PollComponent.new(current) render_inline Dashboard::PollComponent.new(current)
page.find("div#poll_#{current.id}") do |poll_card| expect(page).not_to have_link "Edit survey"
expect(poll_card).not_to have_link "Edit survey" expect(page).to have_link "View results", href: results_proposal_poll_path(proposal, current)
expect(poll_card).to have_link "View results", href: results_proposal_poll_path(proposal, current)
end
end end
it "shows results link for expired polls" do it "shows results link for expired polls" do
@@ -37,10 +23,17 @@ describe Dashboard::PollComponent do
render_inline Dashboard::PollComponent.new(expired) render_inline Dashboard::PollComponent.new(expired)
page.find("div#poll_#{expired.id}") do |poll_card| expect(page).not_to have_link "Edit survey"
expect(poll_card).not_to have_link "Edit survey" expect(page).to have_link "View results", href: results_proposal_poll_path(proposal, expired)
expect(poll_card).to have_link "View results", href: results_proposal_poll_path(proposal, expired)
end end
it "shows edit link for upcoming polls" do
upcoming = create(:poll, related: proposal, starts_at: 1.week.from_now)
render_inline Dashboard::PollComponent.new(upcoming)
expect(page).to have_link "Edit survey", href: edit_proposal_dashboard_poll_path(proposal, upcoming)
expect(page).not_to have_link "View results"
end end
end end
@@ -49,7 +42,6 @@ describe Dashboard::PollComponent do
render_inline Dashboard::PollComponent.new(expired) render_inline Dashboard::PollComponent.new(expired)
page.find("div#poll_#{expired.id}") do |poll_card|
expect(page).to have_content I18n.l(expired.starts_at.to_date) expect(page).to have_content I18n.l(expired.starts_at.to_date)
expect(page).to have_content I18n.l(expired.ends_at.to_date) expect(page).to have_content I18n.l(expired.ends_at.to_date)
expect(page).to have_link expired.title expect(page).to have_link expired.title
@@ -57,4 +49,3 @@ describe Dashboard::PollComponent do
end end
end end
end end
end

View File

@@ -0,0 +1,9 @@
require "rails_helper"
describe Dashboard::PollsComponent do
it "is not rendered when there aren't any polls" do
render_inline Dashboard::PollsComponent.new(Poll.none)
expect(page).not_to be_rendered
end
end