Actions for budgets' headings added. Edit headings, delete headings if not budget investments associated and add link in order to see budgets investments filtered by the heading.
Cambios para hacer commit: modificado: app/controllers/admin/budget_headings_controller.rb modificado: app/models/budget/heading.rb nuevo archivo: app/views/admin/budget_headings/_errors.html.erb nuevo archivo: app/views/admin/budget_headings/edit.js.erb nuevo archivo: app/views/admin/budget_headings/update.js.erb modificado: app/views/admin/budgets/_group.html.erb nuevo archivo: app/views/admin/budgets/_heading.html.erb nuevo archivo: app/views/admin/budgets/_heading_form.html.erb modificado: config/locales/en/activerecord.yml modificado: config/locales/es/activerecord.yml modificado: spec/features/admin/budgets_spec.rb modificado: spec/models/budget/heading_spec.rb
This commit is contained in:
@@ -9,6 +9,27 @@ class Admin::BudgetHeadingsController < Admin::BaseController
|
||||
@headings = @budget_group.headings
|
||||
end
|
||||
|
||||
def edit
|
||||
@budget = Budget.find params[:budget_id]
|
||||
@budget_group = @budget.groups.find params[:budget_group_id]
|
||||
@heading = Budget::Heading.find params[:id]
|
||||
end
|
||||
|
||||
def update
|
||||
@budget = Budget.find params[:budget_id]
|
||||
@budget_group = @budget.groups.find params[:budget_group_id]
|
||||
@heading = Budget::Heading.find params[:id]
|
||||
@heading.assign_attributes(budget_heading_params)
|
||||
@errors = @heading.errors.full_messages unless @heading.save
|
||||
end
|
||||
|
||||
def destroy
|
||||
@heading = Budget::Heading.find params[:id]
|
||||
@heading.destroy
|
||||
@budget = Budget.find params[:budget_id]
|
||||
redirect_to admin_budget_path(@budget)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def budget_heading_params
|
||||
|
||||
@@ -20,7 +20,11 @@ class Budget
|
||||
end
|
||||
|
||||
def name_exists_in_budget_headings
|
||||
group.budget.headings.where(name: name).any?
|
||||
group.budget.headings.where(name: name).where.not(id: id).any?
|
||||
end
|
||||
|
||||
def can_be_deleted?
|
||||
investments.empty?
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
7
app/views/admin/budget_headings/_errors.html.erb
Normal file
7
app/views/admin/budget_headings/_errors.html.erb
Normal file
@@ -0,0 +1,7 @@
|
||||
<div id='error_explanation' class='callout alert'>
|
||||
<ul>
|
||||
<% errors.each do |error| %>
|
||||
<li><%= error %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
1
app/views/admin/budget_headings/edit.js.erb
Normal file
1
app/views/admin/budget_headings/edit.js.erb
Normal file
@@ -0,0 +1 @@
|
||||
$("#heading-<%=@heading.id%>").html("<td colspan='4'><%= j render("admin/budgets/heading_form", group: @budget_group, budget: @budget, heading: @heading) %></td>");
|
||||
5
app/views/admin/budget_headings/update.js.erb
Normal file
5
app/views/admin/budget_headings/update.js.erb
Normal file
@@ -0,0 +1,5 @@
|
||||
<% if @errors %>
|
||||
$("#heading-<%=@heading.id%> div#error_explanation").replaceWith("<%= j render("admin/budget_headings/errors", errors: @errors) %>");
|
||||
<% else %>
|
||||
$("#heading-<%=@heading.id%>").html("<td colspan='4'><%= j render("admin/budgets/heading", group: @budget_group, budget: @budget, heading: @heading) %></td>");
|
||||
<% end %>
|
||||
@@ -1,7 +1,7 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="3" class="with-button">
|
||||
<th colspan="4" class="with-button">
|
||||
<%= group.name %>
|
||||
<%= link_to t("admin.budgets.form.add_heading"), "#", class: "button float-right js-toggle-link", data: { "toggle-selector" => "#group-#{group.id}-new-heading-form" } %>
|
||||
</th>
|
||||
@@ -11,7 +11,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<td colspan="4">
|
||||
<div class="callout primary">
|
||||
<%= t("admin.budgets.form.no_heading") %>
|
||||
</div>
|
||||
@@ -22,6 +22,7 @@
|
||||
<th><%= t("admin.budgets.form.table_heading") %></th>
|
||||
<th><%= t("admin.budgets.form.table_amount") %></th>
|
||||
<th><%= t("admin.budgets.form.table_population") %></th>
|
||||
<th><%= t("admin.actions.actions") %></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -29,51 +30,14 @@
|
||||
|
||||
<!-- new heading form -->
|
||||
<tr id="group-<%= group.id %>-new-heading-form" style="display:none">
|
||||
<td colspan="3">
|
||||
<%= form_for [:admin, @budget, group, Budget::Heading.new], remote: true do |f| %>
|
||||
<label><%= t("admin.budgets.form.heading") %></label>
|
||||
<%= f.text_field :name,
|
||||
label: false,
|
||||
maxlength: 50,
|
||||
placeholder: t("admin.budgets.form.heading") %>
|
||||
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<label><%= t("admin.budgets.form.amount") %></label>
|
||||
<%= f.text_field :price,
|
||||
label: false,
|
||||
maxlength: 8,
|
||||
placeholder: t("admin.budgets.form.amount") %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<label><%= t("admin.budgets.form.population") %></label>
|
||||
<%= f.text_field :population,
|
||||
label: false,
|
||||
maxlength: 8,
|
||||
placeholder: t("admin.budgets.form.population") %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= f.submit t("admin.budgets.form.save_heading"), class: "button success" %>
|
||||
<% end %>
|
||||
<td colspan="4">
|
||||
<%= render "admin/budgets/heading_form", group: group, budget: @budget, heading: Budget::Heading.new %>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- /. new heading form -->
|
||||
<!-- headings list -->
|
||||
<% headings.each do |heading| %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= heading.name %>
|
||||
</td>
|
||||
<td>
|
||||
<%= heading.price %>
|
||||
</td>
|
||||
<td>
|
||||
<%= heading.population %>
|
||||
</td>
|
||||
</tr>
|
||||
<%= render "admin/budgets/heading", group: group, budget: @budget, heading: heading %>
|
||||
<% end %>
|
||||
<!-- /. headings list -->
|
||||
</tbody>
|
||||
|
||||
27
app/views/admin/budgets/_heading.html.erb
Normal file
27
app/views/admin/budgets/_heading.html.erb
Normal file
@@ -0,0 +1,27 @@
|
||||
<tr id="heading-<%=heading.id%>">
|
||||
<td>
|
||||
<%= heading.name %>
|
||||
</td>
|
||||
<td>
|
||||
<%= heading.price %>
|
||||
</td>
|
||||
<td>
|
||||
<%= heading.population %>
|
||||
</td>
|
||||
<td>
|
||||
<%= link_to t("admin.actions.edit"),
|
||||
edit_admin_budget_budget_group_budget_heading_path(budget_id: group.budget.id, budget_group_id: group.id, id: heading.id),
|
||||
class: "button hollow",
|
||||
remote: true%>
|
||||
<%= link_to t("admin.budget_investments.index.title"),
|
||||
admin_budget_budget_investments_path(budget_id: group.budget.id, heading_id: heading.id),
|
||||
class: "button hollow"%>
|
||||
<% if heading.can_be_deleted? %>
|
||||
<%= link_to t('admin.administrators.administrator.delete'),
|
||||
#admin_budget_budget_group_budget_headings_path(group.budget.id, group.id),
|
||||
[:admin, group.budget, group, heading],
|
||||
method: :delete,
|
||||
class: "button hollow alert"%>
|
||||
<% end %>
|
||||
</td>
|
||||
</tr>
|
||||
30
app/views/admin/budgets/_heading_form.html.erb
Normal file
30
app/views/admin/budgets/_heading_form.html.erb
Normal file
@@ -0,0 +1,30 @@
|
||||
<%= form_for [:admin, budget, group, heading], remote: true do |f| %>
|
||||
<label><%= t("admin.budgets.form.heading") %></label>
|
||||
<%= f.text_field :name,
|
||||
label: false,
|
||||
maxlength: 50,
|
||||
placeholder: t("admin.budgets.form.heading") %>
|
||||
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<label><%= t("admin.budgets.form.amount") %></label>
|
||||
<%= f.text_field :price,
|
||||
label: false,
|
||||
maxlength: 8,
|
||||
placeholder: t("admin.budgets.form.amount") %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="small-12 medium-6 column">
|
||||
<label><%= t("admin.budgets.form.population") %></label>
|
||||
<%= f.text_field :population,
|
||||
label: false,
|
||||
maxlength: 8,
|
||||
placeholder: t("admin.budgets.form.population") %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= f.submit t("admin.budgets.form.save_heading"), class: "button success" %>
|
||||
|
||||
<div id="error_explanation"></div>
|
||||
<% end %>
|
||||
@@ -107,6 +107,10 @@ en:
|
||||
budget/investment/milestone:
|
||||
title: "Title"
|
||||
description: "Description"
|
||||
budget/heading:
|
||||
name: "Heading name"
|
||||
price: "Price"
|
||||
population: "Population"
|
||||
comment:
|
||||
body: "Comment"
|
||||
user: "User"
|
||||
|
||||
@@ -99,6 +99,10 @@ es:
|
||||
title: "Título"
|
||||
location: "Ubicación"
|
||||
organization_name: "Si estás proponiendo en nombre de una organización o colectivo, escribe su nombre"
|
||||
budget/heading:
|
||||
name: "Nombre de la partida"
|
||||
price: "Cantidad"
|
||||
population: "Población"
|
||||
comment:
|
||||
body: "Comentario"
|
||||
user: "Usuario"
|
||||
|
||||
@@ -199,5 +199,43 @@ feature 'Admin budgets' do
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'Update heading', :js do
|
||||
budget = create(:budget, name: 'Yearly participatory budget')
|
||||
group = create(:budget_group, budget: budget, name: 'Districts improvments')
|
||||
heading = create(:budget_heading, group: group, name: "District 1")
|
||||
heading = create(:budget_heading, group: group, name: "District 3")
|
||||
|
||||
visit admin_budget_path(budget)
|
||||
|
||||
within("#heading-#{heading.id}") do
|
||||
click_link 'Edit'
|
||||
|
||||
fill_in 'budget_heading_name', with: 'District 2'
|
||||
fill_in 'budget_heading_price', with: '10000'
|
||||
fill_in 'budget_heading_population', with: '6000'
|
||||
click_button 'Save heading'
|
||||
end
|
||||
|
||||
expect(page).to have_content 'District 2'
|
||||
expect(page).to have_content '10000'
|
||||
expect(page).to have_content '6000'
|
||||
end
|
||||
|
||||
scenario 'Delete heading', :js do
|
||||
budget = create(:budget, name: 'Yearly participatory budget')
|
||||
group = create(:budget_group, budget: budget, name: 'Districts improvments')
|
||||
heading = create(:budget_heading, group: group, name: "District 1")
|
||||
|
||||
visit admin_budget_path(budget)
|
||||
|
||||
expect(page).to have_content 'District 1'
|
||||
|
||||
within("#heading-#{heading.id}") do
|
||||
click_link 'Delete'
|
||||
end
|
||||
|
||||
expect(page).to_not have_content 'District 1'
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -25,4 +25,17 @@ describe Budget::Heading do
|
||||
end
|
||||
end
|
||||
|
||||
describe "heading" do
|
||||
it "can be deleted if not budget's investments associated" do
|
||||
heading1 = create(:budget_heading, group: group, name: 'name')
|
||||
heading2 = create(:budget_heading, group: group, name: 'name 2')
|
||||
|
||||
create(:budget_investment, heading: heading1)
|
||||
|
||||
expect(heading1.can_be_deleted?).to eq false
|
||||
expect(heading2.can_be_deleted?).to eq true
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user