Extract component for budget actions

We can omit passing a parameter to the helper method thanks to that, and
we group related code together.
This commit is contained in:
Javi Martín
2020-06-30 19:08:12 +02:00
parent 1537f25739
commit 02e27e13dc
5 changed files with 63 additions and 23 deletions

View File

@@ -0,0 +1,11 @@
<%= render Admin::TableActionsComponent.new(budget, actions: [:edit], edit_text: t("admin.budgets.index.edit_budget")) do %>
<%= link_to t("admin.budgets.index.budget_investments"),
admin_budget_budget_investments_path(budget_id: budget.id),
class: "button hollow medium" %>
<%= link_to t("admin.budgets.index.edit_groups"), admin_budget_groups_path(budget) %>
<% if budget.poll.present? %>
<%= link_to t("admin.budgets.index.admin_ballots"), admin_poll_booth_assignments_path(budget.poll) %>
<% else %>
<%= link_to_create_budget_poll %>
<% end %>
<% end %>

View File

@@ -0,0 +1,21 @@
class Admin::Budgets::TableActionsComponent < ApplicationComponent
attr_reader :budget
def initialize(budget)
@budget = budget
end
private
def link_to_create_budget_poll
balloting_phase = budget.phases.find_by(kind: "balloting")
link_to t("admin.budgets.index.admin_ballots"),
admin_polls_path(poll: {
name: budget.name,
budget_id: budget.id,
starts_at: balloting_phase.starts_at,
ends_at: balloting_phase.ends_at }),
method: :post
end
end

View File

@@ -97,18 +97,6 @@ module BudgetsHelper
investment.group.headings.count > 1
end
def link_to_create_budget_poll(budget)
balloting_phase = budget.phases.find_by(kind: "balloting")
link_to t("admin.budgets.index.admin_ballots"),
admin_polls_path(poll: {
name: budget.name,
budget_id: budget.id,
starts_at: balloting_phase.starts_at,
ends_at: balloting_phase.ends_at }),
method: :post
end
def budget_subnav_items_for(budget)
{
results: t("budgets.results.link"),

View File

@@ -27,17 +27,7 @@
<%= t("budgets.phase.#{budget.phase}") %>
</td>
<td>
<%= render Admin::TableActionsComponent.new(budget, actions: [:edit], edit_text: t("admin.budgets.index.edit_budget")) do |actions| %>
<%= actions.link_to t("admin.budgets.index.budget_investments"),
admin_budget_budget_investments_path(budget_id: budget.id),
class: "button hollow medium" %>
<%= actions.link_to t("admin.budgets.index.edit_groups"), admin_budget_groups_path(budget) %>
<% if budget.poll.present? %>
<%= actions.link_to t("admin.budgets.index.admin_ballots"), admin_poll_booth_assignments_path(budget.poll) %>
<% else %>
<%= link_to_create_budget_poll(budget) %>
<% end %>
<% end %>
<%= render Admin::Budgets::TableActionsComponent.new(budget) %>
</td>
</tr>
<% end %>

View File

@@ -0,0 +1,30 @@
require "rails_helper"
describe Admin::Budgets::TableActionsComponent, type: :component do
let(:budget) { create(:budget) }
let(:component) { Admin::Budgets::TableActionsComponent.new(budget) }
it "renders links to edit budget, manage investments and edit groups and manage ballots" do
render_inline component
expect(page).to have_css "a", count: 4
expect(page).to have_link "Manage projects", href: /investments/
expect(page).to have_link "Edit headings groups", href: /groups/
expect(page).to have_link "Edit budget", href: /edit/
expect(page).to have_link "Admin ballots"
end
it "renders link to create new poll for budgets without polls" do
render_inline component
expect(page).to have_css "a[href*='polls'][data-method='post']", text: "Admin ballots"
end
it "renders link to manage ballots for budgets with polls" do
budget.poll = create(:poll, budget: budget)
render_inline component
expect(page).to have_link "Admin ballots", href: /booth_assignments/
end
end