From bdd5361f6a8bc9f7eb9c065a3e9a58507c310f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Mon, 7 Jun 2021 20:19:55 +0200 Subject: [PATCH] Allow editing the budget in budget creation wizard When users created a budget and made a typo, they could use the link to go back to edit a budget. However, after doing so, they were out of the budget creation process. So we're now letting users go back to edit the budget, fix any mistakes they might have made, and then continue to groups. --- .../admin/budgets/form_component.html.erb | 8 ++-- .../admin/budgets/form_component.rb | 6 ++- .../budgets/edit_component.html.erb | 6 +++ .../budgets_wizard/budgets/edit_component.rb | 12 +++++ .../budgets/new_component.html.erb | 2 +- .../groups/index_component.html.erb | 2 +- .../budgets_wizard/budgets_controller.rb | 17 ++++++- .../budgets_wizard/budgets/edit.html.erb | 1 + config/locales/en/admin.yml | 1 + config/locales/es/admin.yml | 1 + config/routes/admin.rb | 2 +- .../admin/budgets_wizard/budgets_spec.rb | 47 +++++++++++++++++-- 12 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 app/components/admin/budgets_wizard/budgets/edit_component.html.erb create mode 100644 app/components/admin/budgets_wizard/budgets/edit_component.rb create mode 100644 app/views/admin/budgets_wizard/budgets/edit.html.erb diff --git a/app/components/admin/budgets/form_component.html.erb b/app/components/admin/budgets/form_component.html.erb index 2b8898607..57a3f8d44 100644 --- a/app/components/admin/budgets/form_component.html.erb +++ b/app/components/admin/budgets/form_component.html.erb @@ -37,7 +37,7 @@ <%= render "/admin/budgets/association", assignable_type: "valuators", assignables: valuators, form: f %> - <% if budget.persisted? %> + <% unless wizard? %>
<%= t("admin.budgets.edit.info.phases_settings") %>
@@ -52,10 +52,10 @@
- <% if budget.persisted? %> - <%= f.submit nil, class: "button success" %> - <% else %> + <% if wizard? %> <%= f.submit t("admin.budgets_wizard.budgets.continue"), class: "button success expanded" %> + <% else %> + <%= f.submit nil, class: "button success" %> <% end %>
diff --git a/app/components/admin/budgets/form_component.rb b/app/components/admin/budgets/form_component.rb index 35d9b6de0..3d57663f0 100644 --- a/app/components/admin/budgets/form_component.rb +++ b/app/components/admin/budgets/form_component.rb @@ -3,14 +3,16 @@ class Admin::Budgets::FormComponent < ApplicationComponent include GlobalizeHelper include Admin::Namespace - attr_reader :budget + attr_reader :budget, :wizard + alias_method :wizard?, :wizard delegate :display_calculate_winners_button?, :calculate_winner_button_text, :calculate_winners_admin_budget_path, to: :helpers - def initialize(budget) + def initialize(budget, wizard: false) @budget = budget + @wizard = wizard end def voting_styles_select_options diff --git a/app/components/admin/budgets_wizard/budgets/edit_component.html.erb b/app/components/admin/budgets_wizard/budgets/edit_component.html.erb new file mode 100644 index 000000000..672f3e8ca --- /dev/null +++ b/app/components/admin/budgets_wizard/budgets/edit_component.html.erb @@ -0,0 +1,6 @@ +<%= back_link_to admin_budgets_path %> + +<%= header %> + +<%= render Admin::BudgetsWizard::CreationTimelineComponent.new("budget") %> +<%= render Admin::Budgets::FormComponent.new(budget, wizard: true) %> diff --git a/app/components/admin/budgets_wizard/budgets/edit_component.rb b/app/components/admin/budgets_wizard/budgets/edit_component.rb new file mode 100644 index 000000000..7b3d686c9 --- /dev/null +++ b/app/components/admin/budgets_wizard/budgets/edit_component.rb @@ -0,0 +1,12 @@ +class Admin::BudgetsWizard::Budgets::EditComponent < ApplicationComponent + include Header + attr_reader :budget + + def initialize(budget) + @budget = budget + end + + def title + t("admin.budgets.edit.title") + end +end diff --git a/app/components/admin/budgets_wizard/budgets/new_component.html.erb b/app/components/admin/budgets_wizard/budgets/new_component.html.erb index c035cbc78..672f3e8ca 100644 --- a/app/components/admin/budgets_wizard/budgets/new_component.html.erb +++ b/app/components/admin/budgets_wizard/budgets/new_component.html.erb @@ -3,4 +3,4 @@ <%= header %> <%= render Admin::BudgetsWizard::CreationTimelineComponent.new("budget") %> -<%= render Admin::Budgets::FormComponent.new(budget) %> +<%= render Admin::Budgets::FormComponent.new(budget, wizard: true) %> diff --git a/app/components/admin/budgets_wizard/groups/index_component.html.erb b/app/components/admin/budgets_wizard/groups/index_component.html.erb index a038a3f77..04a0059aa 100644 --- a/app/components/admin/budgets_wizard/groups/index_component.html.erb +++ b/app/components/admin/budgets_wizard/groups/index_component.html.erb @@ -1,4 +1,4 @@ -<%= back_link_to admin_budget_path(budget), t("admin.budget_groups.index.back") %> +<%= back_link_to edit_admin_budgets_wizard_budget_path(budget), t("admin.budgets_wizard.groups.back") %> <%= header %> diff --git a/app/controllers/admin/budgets_wizard/budgets_controller.rb b/app/controllers/admin/budgets_wizard/budgets_controller.rb index d55bab0cd..4100d951a 100644 --- a/app/controllers/admin/budgets_wizard/budgets_controller.rb +++ b/app/controllers/admin/budgets_wizard/budgets_controller.rb @@ -8,16 +8,27 @@ class Admin::BudgetsWizard::BudgetsController < Admin::BaseController def new end + def edit + end + def create @budget.published = false if @budget.save - redirect_to admin_budgets_wizard_budget_groups_path(@budget), notice: t("admin.budgets.create.notice") + redirect_to groups_index, notice: t("admin.budgets.create.notice") else render :new end end + def update + if @budget.update(budget_params) + redirect_to groups_index, notice: t("admin.budgets.update.notice") + else + render :edit + end + end + private def budget_params @@ -29,4 +40,8 @@ class Admin::BudgetsWizard::BudgetsController < Admin::BaseController valid_attributes + [translation_params(Budget)] end + + def groups_index + admin_budgets_wizard_budget_groups_path(@budget) + end end diff --git a/app/views/admin/budgets_wizard/budgets/edit.html.erb b/app/views/admin/budgets_wizard/budgets/edit.html.erb new file mode 100644 index 000000000..51f56237c --- /dev/null +++ b/app/views/admin/budgets_wizard/budgets/edit.html.erb @@ -0,0 +1 @@ +<%= render Admin::BudgetsWizard::Budgets::EditComponent.new(@budget) %> diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index 00cc77e7f..144cb6503 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -306,6 +306,7 @@ en: budgets: continue: "Continue to groups" groups: + back: "Go back to edit budget" continue: "Continue to headings" headings: continue: "Continue to phases" diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml index 468a6d37d..e45e5bb13 100644 --- a/config/locales/es/admin.yml +++ b/config/locales/es/admin.yml @@ -306,6 +306,7 @@ es: budgets: continue: "Continuar a grupos" groups: + back: "Volver a editar presupuesto" continue: "Continuar a partidas" headings: continue: "Continuar a fases" diff --git a/config/routes/admin.rb b/config/routes/admin.rb index cbdaab6eb..8749178b1 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -73,7 +73,7 @@ namespace :admin do end namespace :budgets_wizard do - resources :budgets, only: [:create, :new] do + resources :budgets, only: [:create, :new, :edit, :update] do resources :groups, only: [:index, :create, :edit, :update, :destroy] do resources :headings, only: [:index, :create, :edit, :update, :destroy] end diff --git a/spec/system/admin/budgets_wizard/budgets_spec.rb b/spec/system/admin/budgets_wizard/budgets_spec.rb index d6a18651b..ac4722bad 100644 --- a/spec/system/admin/budgets_wizard/budgets_spec.rb +++ b/spec/system/admin/budgets_wizard/budgets_spec.rb @@ -11,7 +11,7 @@ describe "Budgets wizard, first step", :admin do expect(page).to have_content "New participatory budget created successfully!" - click_link "Go back to budgets" + click_link "Go back to edit budget" expect(page).to have_field "Name", with: "M30 - Summer campaign" expect(page).to have_select "Final voting style", selected: "Knapsack" @@ -29,7 +29,7 @@ describe "Budgets wizard, first step", :admin do expect(page).to have_content "New participatory budget created successfully!" - click_link "Go back to budgets" + click_link "Go back to edit budget" expect(page).to have_field "Name", with: "M30 - Summer campaign" expect(page).to have_select "Final voting style", selected: "Approval" @@ -81,11 +81,52 @@ describe "Budgets wizard, first step", :admin do expect(page).to have_content "New participatory budget created successfully!" - click_link "Go back to budgets" + within("#side_menu") { click_link "Participatory budgets" } + within("tr", text: "M30 - Summer campaign") { click_link "Edit budget" } expect(page).to have_content "This participatory budget is in draft mode" expect(page).to have_link "Preview budget" expect(page).to have_link "Publish budget" end end + + describe "Edit" do + scenario "update budget" do + budget = create(:budget, name: "Budget wiht typo") + + visit admin_budgets_wizard_budget_groups_path(budget) + + click_link "Go back to edit budget" + + expect(page).to have_content "Edit Participatory budget" + expect(page).to have_css ".creation-timeline" + expect(page).to have_field "Name", with: "Budget wiht typo" + + fill_in "Name", with: "Budget without typos" + click_button "Continue to groups" + + expect(page).to have_content "Participatory budget updated successfully" + expect(page).to have_content "Budget without typos" + expect(page).to have_css ".creation-timeline" + expect(page).to have_content "There are no groups" + end + + scenario "submit the form with errors and then without errors" do + budget = create(:budget, name: "Budget wiht typo") + + visit edit_admin_budgets_wizard_budget_path(budget) + fill_in "Name", with: "" + click_button "Continue to groups" + + expect(page).to have_css "#error_explanation" + + fill_in "Name", with: "Budget without typos" + click_button "Continue to groups" + + expect(page).to have_content "Participatory budget updated successfully" + expect(page).to have_content "Budget without typos" + expect(page).to have_css ".creation-timeline" + expect(page).to have_content "There are no groups" + end + end end