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:
@@ -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 %>
|
||||
21
app/components/admin/budgets/table_actions_component.rb
Normal file
21
app/components/admin/budgets/table_actions_component.rb
Normal 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
|
||||
@@ -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"),
|
||||
|
||||
@@ -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 %>
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user