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 @@ +
+ +
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 @@ - @@ -11,7 +11,7 @@ - + @@ -29,51 +30,14 @@ - <% headings.each do |heading| %> - - - - - + <%= 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 @@ + + + + + + \ 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
+ <%= 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" } %>
+
<%= 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") %>
- <%= heading.name %> - - <%= heading.price %> - - <%= heading.population %> -
+ <%= 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 %> +