From 607ab25939522b809435e9710e82f28434c64199 Mon Sep 17 00:00:00 2001 From: Andrej Date: Thu, 9 Jan 2025 08:35:44 +0100 Subject: [PATCH] Add delete action to step form response [SCI-11382] --- .../step_elements/form_responses_controller.rb | 5 +++++ .../vue/shared/content/form_response.vue | 5 ++++- .../vue/shared/content/mixins/delete.js | 2 +- app/models/form_response.rb | 15 ++++++++++++++- app/models/step.rb | 3 +++ app/serializers/step_form_response_serializer.rb | 3 ++- ...vious_form_responses_value_to_form_response.rb | 7 +++++++ 7 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20250107134229_add_previous_form_responses_value_to_form_response.rb diff --git a/app/controllers/step_elements/form_responses_controller.rb b/app/controllers/step_elements/form_responses_controller.rb index 73b91fc07..272be12fb 100644 --- a/app/controllers/step_elements/form_responses_controller.rb +++ b/app/controllers/step_elements/form_responses_controller.rb @@ -58,6 +58,11 @@ module StepElements def destroy ActiveRecord::Base.transaction do log_step_form_activity(:form_deleted, { form: @form_response.form.id }) + if @form_response.destroy + render json: {}, status: :ok + else + render json: { errors: @form_response.errors.full_messages }, status: :unprocessable_entity + end end end diff --git a/app/javascript/vue/shared/content/form_response.vue b/app/javascript/vue/shared/content/form_response.vue index c0b9df79b..3cc92a2d3 100644 --- a/app/javascript/vue/shared/content/form_response.vue +++ b/app/javascript/vue/shared/content/form_response.vue @@ -83,7 +83,8 @@ export default { return { form: this.element.attributes.orderable.form, formResponse: this.element.attributes.orderable, - formFieldValues: this.element.attributes.orderable.form_field_values + formFieldValues: this.element.attributes.orderable.form_field_values, + deleteUrl: this.element.attributes.orderable.urls.delete_url }; }, mounted() { @@ -155,12 +156,14 @@ export default { axios.post(this.formResponse.urls.submit).then((response) => { const { attributes } = response.data.data; this.formResponse = attributes.orderable; + this.deleteUrl = attributes.orderable.urls.delete_url; }); }, resetForm() { axios.post(this.formResponse.urls.reset).then((response) => { const { attributes } = response.data.data; this.formResponse = attributes.orderable; + this.deleteUrl = attributes.orderable.urls.delete_url; }); } } diff --git a/app/javascript/vue/shared/content/mixins/delete.js b/app/javascript/vue/shared/content/mixins/delete.js index 540569009..b85832461 100644 --- a/app/javascript/vue/shared/content/mixins/delete.js +++ b/app/javascript/vue/shared/content/mixins/delete.js @@ -13,7 +13,7 @@ export default { }, deleteElement() { $.ajax({ - url: this.element.attributes.orderable.urls.delete_url, + url: this.deleteUrl || this.element.attributes.orderable.urls.delete_url, type: 'DELETE', success: (result) => { this.$emit( diff --git a/app/models/form_response.rb b/app/models/form_response.rb index efc314216..c0a3a7418 100644 --- a/app/models/form_response.rb +++ b/app/models/form_response.rb @@ -17,6 +17,19 @@ class FormResponse < ApplicationRecord has_many :form_field_values, dependent: :destroy + belongs_to :previous_form_response, + -> { unscope(where: :discarded_at) }, + class_name: 'FormResponse', + inverse_of: :next_form_response, + optional: true, + dependent: :destroy + + has_one :next_form_response, + class_name: 'FormResponse', + foreign_key: 'previous_form_response_id', + inverse_of: :previous_form_response, + dependent: :destroy + def step step_orderable_element&.step end @@ -57,7 +70,7 @@ class FormResponse < ApplicationRecord ActiveRecord::Base.transaction(requires_new: true) do new_form_response = dup - new_form_response.update!(status: 'pending', created_by: user) + new_form_response.update!(status: 'pending', created_by: user, previous_form_response: self) form_field_values.latest.find_each do |form_field_value| form_field_value.dup.update!(form_response: new_form_response, created_by: user) diff --git a/app/models/step.rb b/app/models/step.rb index 395dfbc55..b6eef090c 100644 --- a/app/models/step.rb +++ b/app/models/step.rb @@ -42,6 +42,8 @@ class Step < ApplicationRecord has_many :step_tables, inverse_of: :step, dependent: :destroy has_many :tables, through: :step_tables, dependent: :destroy has_many :report_elements, inverse_of: :step, dependent: :destroy + has_many :form_responses, through: :step_orderable_elements, + source: :orderable, source_type: 'FormResponse', dependent: :destroy accepts_nested_attributes_for :checklists, reject_if: :all_blank, @@ -204,6 +206,7 @@ class Step < ApplicationRecord def cascade_before_destroy assets.each(&:destroy) tables.each(&:destroy) + form_responses.each(&:destroy) end def set_completed_on diff --git a/app/serializers/step_form_response_serializer.rb b/app/serializers/step_form_response_serializer.rb index 8f6eb50ad..7bb618190 100644 --- a/app/serializers/step_form_response_serializer.rb +++ b/app/serializers/step_form_response_serializer.rb @@ -39,7 +39,8 @@ class StepFormResponseSerializer < ActiveModel::Serializer list[:reset] = reset_step_form_response_path(object.step, object) if can_reset_form_response?(user, object) if can_manage_step?(user, object.step) list[:move_url] = move_step_form_response_path(object.step, object) - list[:move_targets_url] = move_targets_step_text_path(object.step, object) if can_manage_step?(user, object.step) + list[:move_targets_url] = move_targets_step_text_path(object.step, object) + list[:delete_url] = step_form_response_path(object.step, object) end list diff --git a/db/migrate/20250107134229_add_previous_form_responses_value_to_form_response.rb b/db/migrate/20250107134229_add_previous_form_responses_value_to_form_response.rb new file mode 100644 index 000000000..3659b2780 --- /dev/null +++ b/db/migrate/20250107134229_add_previous_form_responses_value_to_form_response.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddPreviousFormResponsesValueToFormResponse < ActiveRecord::Migration[7.0] + def change + add_reference :form_responses, :previous_form_response, foreign_key: { to_table: :form_responses } + end +end