diff --git a/app/components/form/step_navigation_component.html.erb b/app/components/form/step_navigation_component.html.erb new file mode 100644 index 0000000000..35dc06aa90 --- /dev/null +++ b/app/components/form/step_navigation_component.html.erb @@ -0,0 +1,34 @@ +
+ <%# Back navigation %> + <%= button_tag type: :submit, + name: :nav_step, + value: @nav_back, + class: "btn btn-link #{@nav_back.nil? ? 'disabled' : 'enabled'}", + title: "Back step", + aria: { label: "Back step" }, + disabled: !@nav_back do %> + <% if @nav_back.present? %> + <%= link_to @nav_back, title: "Back step", aria: { label: "Back step" } do %> + + <% end %> + <% elsif %> + + <% end %> + <% end %> + <%# Next navigation %> + <%= button_tag type: :submit, + name: :nav_step, + value: @nav_forward, + class: "btn btn-link #{@nav_next.nil? ? 'disabled' : 'enabled'}", + title: "Next step", + aria: { label: "Next step" }, + disabled: !@nav_next do %> + <% if @nav_next.present? %> + <%= link_to @nav_next, title: "Next step", aria: { label: "Next step" } do %> + + <% end %> + <% elsif %> + + <% end %> + <% end %> +
diff --git a/app/components/form/step_navigation_component.rb b/app/components/form/step_navigation_component.rb new file mode 100644 index 0000000000..1adf102f15 --- /dev/null +++ b/app/components/form/step_navigation_component.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class Form::StepNavigationComponent < ViewComponent::Base + def initialize(nav_back: nil, nav_next: nil) + @nav_back = nav_back + @nav_next = nav_next + end +end diff --git a/app/components/form/title_component.html.erb b/app/components/form/title_component.html.erb index 4935a40d4a..26873dd92b 100644 --- a/app/components/form/title_component.html.erb +++ b/app/components/form/title_component.html.erb @@ -11,15 +11,18 @@

<%= @subtitle %>

<% if @progress %>
-

- <%= @steps_in_text %> -

-
-
-
-
+ <% if navigable %> + <%= navigable %> + <% end %> +

+ <%= @steps_in_text %> +

+
+
+
+
<% end %>
diff --git a/app/components/form/title_component.rb b/app/components/form/title_component.rb index 4df2fae12c..9b94cc37c3 100644 --- a/app/components/form/title_component.rb +++ b/app/components/form/title_component.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true class Form::TitleComponent < ViewComponent::Base + # `Form::StepNavigationComponent` is defined in another file, so we can refer to it by class name. + renders_one :navigable, Form::StepNavigationComponent + def initialize(title:, subtitle:, step: nil, total_steps: nil, notes: nil, autosave: false) @title = title @subtitle = subtitle diff --git a/app/controllers/case_contacts/form_controller.rb b/app/controllers/case_contacts/form_controller.rb index d988c98bdf..24cef7cd5d 100644 --- a/app/controllers/case_contacts/form_controller.rb +++ b/app/controllers/case_contacts/form_controller.rb @@ -9,29 +9,21 @@ class CaseContacts::FormController < ApplicationController # wizard_path def show - authorize @case_contact + manage_form_step get_cases_and_contact_types - @page = wizard_steps.index(step) + 1 - @total_pages = steps.count - render_wizard wizard_path end def update - authorize @case_contact + manage_form_step(step_navigation: true) params[:case_contact][:status] = step.to_s if !@case_contact.active? remove_unwanted_contact_types remove_nil_draft_ids - if CaseContactUpdateService.new(@case_contact).update_attrs(case_contact_params) respond_to do |format| format.html { - if step == steps.last - finish_editing - else - render_wizard @case_contact, {}, {case_contact_id: @case_contact.id} - end + manage_navigation } format.json { head :ok } end @@ -52,6 +44,13 @@ def set_case_contact @case_contact = CaseContact.find(params[:case_contact_id]) end + def manage_form_step(step_navigation: false) + authorize @case_contact + @page = wizard_steps.index(step) + 1 + @total_pages = steps.count + @nav_step = params[:nav_step] if step_navigation + end + def get_cases_and_contact_types @casa_cases = policy_scope(current_organization.casa_cases) @casa_cases = @casa_cases.where(id: @case_contact.casa_case_id) if @case_contact.active? @@ -65,6 +64,17 @@ def get_cases_and_contact_types @selected_contact_type_ids = @case_contact.contact_type_ids end + def manage_navigation + if @nav_step.present? + jump_to(@nav_step.split("/").last.to_sym) + render_wizard @case_contact, {}, {case_contact_id: @case_contact.id} + elsif step == steps.last + finish_editing + else + render_wizard @case_contact, {}, {case_contact_id: @case_contact.id} + end + end + def finish_editing message = "" send_reimbursement_email(@case_contact) diff --git a/app/views/case_contacts/form/details.html.erb b/app/views/case_contacts/form/details.html.erb index 049fbd6d53..c9850302c8 100644 --- a/app/views/case_contacts/form/details.html.erb +++ b/app/views/case_contacts/form/details.html.erb @@ -1,7 +1,8 @@ -<%= render(Form::TitleComponent.new(title: @case_contact.decorate.form_title, subtitle: "Contact details", step: @page, total_steps: @total_pages)) %> -
<%= form_with(model: @case_contact, url: wizard_path(nil, case_contact_id: @case_contact.id), local: true, id: "casa-contact-form", class: "component-validated-form") do |form| %> + <%= render(Form::TitleComponent.new(title: @case_contact.decorate.form_title, subtitle: "Contact details", step: @page, total_steps: @total_pages)) do |component| %> + <% component.with_navigable(nav_back: nil, nav_next: next_wizard_path) %> + <% end %> <%= render "/shared/error_messages", resource: @case_contact %>
diff --git a/app/views/case_contacts/form/expenses.html.erb b/app/views/case_contacts/form/expenses.html.erb index b1dde6c48a..9bfac9209c 100644 --- a/app/views/case_contacts/form/expenses.html.erb +++ b/app/views/case_contacts/form/expenses.html.erb @@ -1,7 +1,7 @@ -<%= render(Form::TitleComponent.new(title: @case_contact.decorate.form_title, subtitle: "Contact expenses", step: @page, total_steps: @total_pages)) %>
<%= form_with(model: @case_contact, url: wizard_path(nil, case_contact_id: @case_contact.id), local: true, id: "casa-contact-form", class: "component-validated-form") do |form| %> + <%= render(Form::TitleComponent.new(title: @case_contact.decorate.form_title, subtitle: "Contact expenses", step: @page, total_steps: @total_pages, navigable: Form::StepNavigationComponent.new(nav_back: previous_wizard_path, nav_next: nil))) %> <%= render "/shared/error_messages", resource: @case_contact %>
diff --git a/app/views/case_contacts/form/notes.html.erb b/app/views/case_contacts/form/notes.html.erb index 4f4309bf7d..12f8d404d3 100644 --- a/app/views/case_contacts/form/notes.html.erb +++ b/app/views/case_contacts/form/notes.html.erb @@ -1,8 +1,8 @@
- <%= render(Form::TitleComponent.new(title: @case_contact.decorate.form_title, subtitle: "Contact notes", step: @page, total_steps: @total_pages, notes: @case_contact.decorate.form_page_notes[:notes], autosave: true)) %>
<%= form_with(model: @case_contact, url: wizard_path(nil, case_contact_id: @case_contact.id), id: "casa-contact-form", class: "component-validated-form", data: { "turbo-action": "advance", "autosave-target": "form" }) do |form| %> + <%= render(Form::TitleComponent.new(title: @case_contact.decorate.form_title, subtitle: "Contact notes", step: @page, total_steps: @total_pages, notes: @case_contact.decorate.form_page_notes[:notes], autosave: true, navigable: Form::StepNavigationComponent.new(nav_back: previous_wizard_path, nav_next: @case_contact.casa_org_any_expenses_enabled? ? next_wizard_path : nil))) %> <%= render "contact_topic_notes", form: %>