diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index 9874cfffb..746de0a5a 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -42,6 +42,11 @@ class MergeRequestsController < ApplicationController render :merging_organisations end + def delete + @merge_request.discard! + redirect_to organisations_path(anchor: "merge-requests") + end + private def page diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 2abea9d7f..7c95e199c 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -18,7 +18,7 @@ class MergeRequest < ApplicationRecord scope :merged, -> { where(status: "request_merged") } scope :visible, lambda { open_collection_period_start_date = FormHandler.instance.start_date_of_earliest_open_collection_period - merged.where("merge_requests.merge_date >= ?", open_collection_period_start_date).or(not_merged) + merged.where("merge_requests.merge_date >= ?", open_collection_period_start_date).or(not_merged).where(discarded_at: nil) } def absorbing_organisation_name @@ -28,4 +28,8 @@ class MergeRequest < ApplicationRecord def dpo_user absorbing_organisation.data_protection_officers.filter_by_active.first end + + def discard! + update!(discarded_at: Time.zone.now) + end end diff --git a/app/views/merge_requests/delete_confirmation.html.erb b/app/views/merge_requests/delete_confirmation.html.erb new file mode 100644 index 000000000..8b8103d42 --- /dev/null +++ b/app/views/merge_requests/delete_confirmation.html.erb @@ -0,0 +1,23 @@ +<% content_for :before_content do %> + <% content_for :title, "Are you sure you want to delete this merge request?" %> + <%= govuk_back_link(href: :back) %> +<% end %> + +
+
+

+ <%= content_for(:title) %> +

+ + <%= govuk_warning_text(text: "You cannot undo this.") %> + +
+ <%= govuk_button_to( + "Delete merge request", + delete_merge_request_path(@merge_request), + method: :delete, + ) %> + <%= govuk_button_link_to "Cancel", merge_request_path(@merge_request), html: { method: :get }, secondary: true %> +
+
+
diff --git a/app/views/merge_requests/show.html.erb b/app/views/merge_requests/show.html.erb index b28ee3c1e..cf85e287b 100644 --- a/app/views/merge_requests/show.html.erb +++ b/app/views/merge_requests/show.html.erb @@ -1,7 +1,7 @@ <% content_for :before_content do %> <% title = "Merge details: #{@merge_request.absorbing_organisation_name}" %> <% content_for :title, title %> - <%= govuk_back_link href: "#{organisations_path}#merge-requests" %> + <%= govuk_back_link href: organisations_path(anchor: "merge-requests") %> <% end %> <% unless @merge_request.signed_dsa || @merge_request.absorbing_organisation_id.blank? %>
@@ -27,12 +27,8 @@ <% unless @merge_request.status == "request_merged" %>
- - + <%= govuk_button_link_to "Begin merge", nil, html: { method: :get }, disabled: @merge_request.status == "ready_to_merge" ? false : true %> + <%= govuk_button_link_to "Delete merge request", delete_confirmation_merge_request_path(@merge_request), warning: true%>
<% end %> diff --git a/config/routes.rb b/config/routes.rb index 8920e1587..ecdb8f2c1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -201,7 +201,8 @@ Rails.application.routes.draw do get "absorbing-organisation" get "merge-date" get "helpdesk-ticket" - get "details", to: "merge_requests#details" + get "delete-confirmation", to: "merge_requests#delete_confirmation" + delete "delete", to: "merge_requests#delete" end end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index e3bb24b46..10901623f 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -23,4 +23,25 @@ RSpec.describe MergeRequest, type: :model do expect(described_class.visible).to include(not_merged) end end + + describe "#discard!" do + let(:merge_request) { create(:merge_request) } + + it "sets the discarded_at field to the current time" do + Timecop.freeze(Time.zone.now) do + merge_request.discard! + expect(merge_request.discarded_at).to eq(Time.zone.now) + end + end + + it "does not delete the record" do + merge_request.discard! + expect(merge_request).to be_persisted + end + + it "is not visible in the visible scope" do + merge_request.discard! + expect(described_class.visible).not_to include(merge_request) + end + end end