Extract budget form to a component

This way it will be easier to change it and reuse it.
This commit is contained in:
Javi Martín
2021-06-04 21:58:09 +02:00
parent e9fb95d8d7
commit 82e8de094b
8 changed files with 74 additions and 54 deletions

View File

@@ -1,8 +1,8 @@
<%= translatable_form_for [:admin, @budget], html: { class: "budgets-form" } do |f| %>
<%= translatable_form_for [:admin, budget], html: { class: "budgets-form" } do |f| %>
<fieldset>
<legend><%= t("admin.budgets.edit.info.budget_settings") %></legend>
<%= render "shared/globalize_locales", resource: @budget %>
<%= render "shared/errors", resource: @budget %>
<%= render "shared/globalize_locales", resource: budget %>
<%= render "shared/errors", resource: budget %>
<%= f.translatable_fields do |translations_form| %>
<div class="small-12 medium-9 large-6 column end">
@@ -13,11 +13,11 @@
<% end %>
<div class="small-12 medium-4 column">
<%= f.select :voting_style, budget_voting_styles_select_options %>
<%= f.select :voting_style, voting_styles_select_options %>
</div>
<div class="small-12 medium-2 column end">
<%= f.select :currency_symbol, budget_currency_symbol_select_options %>
<%= f.select :currency_symbol, currency_symbol_select_options %>
</div>
</fieldset>
@@ -26,28 +26,28 @@
<% %w[administrators valuators].each do |staff| %>
<div class="small-12 medium-6 large-3 column end">
<%= link_to t("admin.budgets.edit.#{staff}", count: @budget.send(staff).count),
<%= link_to t("admin.budgets.edit.#{staff}", count: budget.send(staff).count),
"#",
class: "button expanded hollow js-budget-show-#{staff}-list js-budget-show-users-list",
data: { toggle: "#{staff}_list", texts: t("admin.budgets.edit.#{staff}") } %>
</div>
<% end %>
<%= render "/admin/budgets/association", assignable_type: "administrators", assignables: @admins, form: f %>
<%= render "/admin/budgets/association", assignable_type: "valuators", assignables: @valuators, form: f %>
<%= render "/admin/budgets/association", assignable_type: "administrators", assignables: admins, form: f %>
<%= render "/admin/budgets/association", assignable_type: "valuators", assignables: valuators, form: f %>
</fieldset>
<fieldset>
<legend><%= t("admin.budgets.edit.info.phases_settings") %></legend>
<div class="small-12 medium-6 column">
<%= f.select :phase, budget_phases_select_options %>
<%= f.select :phase, phases_select_options %>
</div>
<%= render Admin::Budgets::HelpComponent.new("budget_phases") %>
<%= render Admin::BudgetPhases::PhasesComponent.new(@budget) %>
<%= render Admin::BudgetPhases::PhasesComponent.new(budget) %>
</fieldset>
<% if @budget.persisted? %>
<% if budget.persisted? %>
<%= render "admin/shared/show_results_fields", form: f %>
<% end %>
@@ -57,21 +57,21 @@
</div>
<div class="float-right">
<% if display_calculate_winners_button?(@budget) %>
<%= link_to calculate_winner_button_text(@budget),
calculate_winners_admin_budget_path(@budget),
<% if display_calculate_winners_button?(budget) %>
<%= link_to calculate_winner_button_text(budget),
calculate_winners_admin_budget_path(budget),
method: :put,
class: "button hollow" %>
<% end %>
<% if @budget.has_winning_investments? %>
<% if budget.has_winning_investments? %>
<%= link_to t("budgets.show.see_results"),
budget_results_path(@budget),
budget_results_path(budget),
class: "button hollow margin-left" %>
<% end %>
<% if @budget.persisted? %>
<% if budget.persisted? %>
<%= link_to t("admin.budgets.edit.delete"),
admin_budget_path(@budget),
admin_budget_path(budget),
method: :delete,
class: "delete float-right margin-left" %>
<% end %>

View File

@@ -0,0 +1,38 @@
class Admin::Budgets::FormComponent < ApplicationComponent
include TranslatableFormHelper
include GlobalizeHelper
attr_reader :budget
delegate :display_calculate_winners_button?,
:calculate_winner_button_text,
:calculate_winners_admin_budget_path,
to: :helpers
def initialize(budget)
@budget = budget
end
def voting_styles_select_options
Budget::VOTING_STYLES.map do |style|
[Budget.human_attribute_name("voting_style_#{style}"), style]
end
end
def currency_symbol_select_options
Budget::CURRENCY_SYMBOLS.map { |cs| [cs, cs] }
end
def phases_select_options
Budget::Phase::PHASE_KINDS.map { |ph| [t("budgets.phase.#{ph}"), ph] }
end
private
def admins
@admins ||= Administrator.includes(:user)
end
def valuators
@valuators ||= Valuator.includes(:user).order(description: :asc).order("users.email ASC")
end
end

View File

@@ -7,7 +7,6 @@ class Admin::BudgetsController < Admin::BaseController
has_filters %w[all open finished], only: :index
before_action :load_budget, except: [:index, :new, :create]
before_action :load_staff, only: [:new, :create, :edit, :update, :show]
load_and_authorize_resource
def index
@@ -83,9 +82,4 @@ class Admin::BudgetsController < Admin::BaseController
def load_budget
@budget = Budget.find_by_slug_or_id! params[:id]
end
def load_staff
@admins = Administrator.includes(:user)
@valuators = Valuator.includes(:user).order(description: :asc).order("users.email ASC")
end
end

View File

@@ -1,10 +1,4 @@
module BudgetsHelper
def budget_voting_styles_select_options
Budget::VOTING_STYLES.map do |style|
[Budget.human_attribute_name("voting_style_#{style}"), style]
end
end
def csv_params
csv_params = params.clone.merge(format: :csv)
csv_params = csv_params.to_unsafe_h.map { |k, v| [k.to_sym, v] }.to_h
@@ -12,14 +6,6 @@ module BudgetsHelper
csv_params
end
def budget_phases_select_options
Budget::Phase::PHASE_KINDS.map { |ph| [t("budgets.phase.#{ph}"), ph] }
end
def budget_currency_symbol_select_options
Budget::CURRENCY_SYMBOLS.map { |cs| [cs, cs] }
end
def namespaced_budget_investment_path(investment, options = {})
case namespace
when "management"

View File

@@ -5,4 +5,4 @@
<%= render Admin::Budgets::DraftingComponent.new(@budget) %>
</header>
<%= render "/admin/budgets/form" %>
<%= render Admin::Budgets::FormComponent.new(@budget) %>

View File

@@ -4,4 +4,4 @@
<h2><%= t("admin.budgets.new.title") %></h2>
</header>
<%= render "/admin/budgets/form" %>
<%= render Admin::Budgets::FormComponent.new(@budget) %>

View File

@@ -0,0 +1,16 @@
require "rails_helper"
describe Admin::Budgets::FormComponent, type: :component do
describe "#voting_styles_select_options" do
it "provides vote kinds" do
types = [
["Knapsack", "knapsack"],
["Approval", "approval"]
]
component = Admin::Budgets::FormComponent.new(double)
expect(component.voting_styles_select_options).to eq(types)
end
end
end

View File

@@ -1,14 +0,0 @@
require "rails_helper"
describe BudgetsHelper do
describe "#budget_voting_styles_select_options" do
it "provides vote kinds" do
types = [
["Knapsack", "knapsack"],
["Approval", "approval"]
]
expect(budget_voting_styles_select_options).to eq(types)
end
end
end