diff --git a/app/controllers/admin/budget_headings_controller.rb b/app/controllers/admin/budget_headings_controller.rb
index eea93716f..ee1878edf 100644
--- a/app/controllers/admin/budget_headings_controller.rb
+++ b/app/controllers/admin/budget_headings_controller.rb
@@ -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
diff --git a/app/models/budget/heading.rb b/app/models/budget/heading.rb
index 1a232c75e..10feaa909 100644
--- a/app/models/budget/heading.rb
+++ b/app/models/budget/heading.rb
@@ -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
diff --git a/app/views/admin/budget_headings/_errors.html.erb b/app/views/admin/budget_headings/_errors.html.erb
new file mode 100644
index 000000000..bb3e5482e
--- /dev/null
+++ b/app/views/admin/budget_headings/_errors.html.erb
@@ -0,0 +1,7 @@
+
+
+ <% errors.each do |error| %>
+ - <%= error %>
+ <% end %>
+
+
diff --git a/app/views/admin/budget_headings/edit.js.erb b/app/views/admin/budget_headings/edit.js.erb
new file mode 100644
index 000000000..5f9ac48f8
--- /dev/null
+++ b/app/views/admin/budget_headings/edit.js.erb
@@ -0,0 +1 @@
+$("#heading-<%=@heading.id%>").html("<%= j render("admin/budgets/heading_form", group: @budget_group, budget: @budget, heading: @heading) %> | ");
diff --git a/app/views/admin/budget_headings/update.js.erb b/app/views/admin/budget_headings/update.js.erb
new file mode 100644
index 000000000..d46e35386
--- /dev/null
+++ b/app/views/admin/budget_headings/update.js.erb
@@ -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("<%= j render("admin/budgets/heading", group: @budget_group, budget: @budget, heading: @heading) %> | ");
+<% end %>
diff --git a/app/views/admin/budgets/_group.html.erb b/app/views/admin/budgets/_group.html.erb
index 8537fa477..d6a648f10 100644
--- a/app/views/admin/budgets/_group.html.erb
+++ b/app/views/admin/budgets/_group.html.erb
@@ -1,7 +1,7 @@
- |
+ |
<%= 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" } %>
|
@@ -11,7 +11,7 @@
- |
+ |
<%= t("admin.budgets.form.no_heading") %>
@@ -22,6 +22,7 @@
| <%= t("admin.budgets.form.table_heading") %> |
<%= t("admin.budgets.form.table_amount") %> |
<%= t("admin.budgets.form.table_population") %> |
+ <%= t("admin.actions.actions") %> |
@@ -29,51 +30,14 @@
-
- <%= form_for [:admin, @budget, group, Budget::Heading.new], remote: true do |f| %>
-
- <%= f.text_field :name,
- label: false,
- maxlength: 50,
- placeholder: t("admin.budgets.form.heading") %>
-
-
-
-
- <%= f.text_field :price,
- label: false,
- maxlength: 8,
- placeholder: t("admin.budgets.form.amount") %>
-
-
-
-
-
- <%= f.text_field :population,
- label: false,
- maxlength: 8,
- placeholder: t("admin.budgets.form.population") %>
-
-
-
- <%= f.submit t("admin.budgets.form.save_heading"), class: "button success" %>
- <% end %>
+ |
+ <%= render "admin/budgets/heading_form", group: group, budget: @budget, heading: Budget::Heading.new %>
|
<% headings.each do |heading| %>
-
- |
- <%= heading.name %>
- |
-
- <%= heading.price %>
- |
-
- <%= heading.population %>
- |
-
+ <%= render "admin/budgets/heading", group: group, budget: @budget, heading: heading %>
<% end %>
diff --git a/app/views/admin/budgets/_heading.html.erb b/app/views/admin/budgets/_heading.html.erb
new file mode 100644
index 000000000..7ffeca7a0
--- /dev/null
+++ b/app/views/admin/budgets/_heading.html.erb
@@ -0,0 +1,27 @@
+
+ |
+ <%= heading.name %>
+ |
+
+ <%= heading.price %>
+ |
+
+ <%= heading.population %>
+ |
+
+ <%= 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 %>
+ |
+
\ No newline at end of file
diff --git a/app/views/admin/budgets/_heading_form.html.erb b/app/views/admin/budgets/_heading_form.html.erb
new file mode 100644
index 000000000..43a4797a8
--- /dev/null
+++ b/app/views/admin/budgets/_heading_form.html.erb
@@ -0,0 +1,30 @@
+<%= form_for [:admin, budget, group, heading], remote: true do |f| %>
+
+ <%= f.text_field :name,
+ label: false,
+ maxlength: 50,
+ placeholder: t("admin.budgets.form.heading") %>
+
+
+
+
+ <%= f.text_field :price,
+ label: false,
+ maxlength: 8,
+ placeholder: t("admin.budgets.form.amount") %>
+
+
+
+
+
+ <%= f.text_field :population,
+ label: false,
+ maxlength: 8,
+ placeholder: t("admin.budgets.form.population") %>
+
+
+
+ <%= f.submit t("admin.budgets.form.save_heading"), class: "button success" %>
+
+
+<% end %>
\ No newline at end of file
diff --git a/config/locales/en/activerecord.yml b/config/locales/en/activerecord.yml
index 79982150c..0008eced6 100644
--- a/config/locales/en/activerecord.yml
+++ b/config/locales/en/activerecord.yml
@@ -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"
diff --git a/config/locales/es/activerecord.yml b/config/locales/es/activerecord.yml
index d409d1c5e..2315fc65a 100644
--- a/config/locales/es/activerecord.yml
+++ b/config/locales/es/activerecord.yml
@@ -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"
diff --git a/spec/features/admin/budgets_spec.rb b/spec/features/admin/budgets_spec.rb
index d4ed2d2ac..e21db46df 100644
--- a/spec/features/admin/budgets_spec.rb
+++ b/spec/features/admin/budgets_spec.rb
@@ -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
diff --git a/spec/models/budget/heading_spec.rb b/spec/models/budget/heading_spec.rb
index ee2e4c142..76ac82692 100644
--- a/spec/models/budget/heading_spec.rb
+++ b/spec/models/budget/heading_spec.rb
@@ -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