16 changed files with 267 additions and 20 deletions
@ -0,0 +1,30 @@ |
|||||||
|
module MergeRequestsHelper |
||||||
|
def display_value_or_placeholder(value, placeholder = "You didn't answer this question") |
||||||
|
value.presence || content_tag(:span, placeholder, class: "app-!-colour-muted") |
||||||
|
end |
||||||
|
|
||||||
|
def request_details(merge_request) |
||||||
|
[ |
||||||
|
{ label: "Requester", value: display_value_or_placeholder(merge_request.requester&.name) }, |
||||||
|
{ label: "Helpdesk ticket", value: merge_request.helpdesk_ticket.present? ? link_to("#{merge_request.helpdesk_ticket} (opens in a new tab)", "https://dluhcdigital.atlassian.net/browse/#{merge_request.helpdesk_ticket}", target: "_blank", rel: "noopener noreferrer") : display_value_or_placeholder(nil), action: merge_request.status == "request_merged" ? nil : { text: "Change", href: "#", visually_hidden_text: "helpdesk ticket" } }, |
||||||
|
{ label: "Status", value: status_tag(merge_request.status) }, |
||||||
|
] |
||||||
|
end |
||||||
|
|
||||||
|
def merge_details(merge_request) |
||||||
|
[ |
||||||
|
{ label: "Absorbing organisation", value: display_value_or_placeholder(merge_request.absorbing_organisation_name), action: merge_request.status == "request_merged" ? nil : { text: "Change", href: absorbing_organisation_merge_request_path(merge_request), visually_hidden_text: "absorbing organisation" } }, |
||||||
|
{ label: "Merging organisations", value: merge_request.merge_request_organisations.any? ? merge_request.merge_request_organisations.map(&:merging_organisation_name).join("<br>").html_safe : display_value_or_placeholder(nil), action: merge_request.status == "request_merged" ? nil : { text: "Change", href: organisations_merge_request_path(merge_request), visually_hidden_text: "merging organisations" } }, |
||||||
|
{ label: "Merge date", value: display_value_or_placeholder(merge_request.merge_date), action: merge_request.status == "request_merged" ? nil : { text: "Change", href: merge_date_merge_request_path(merge_request), visually_hidden_text: "merge date" } }, |
||||||
|
] |
||||||
|
end |
||||||
|
|
||||||
|
def merge_outcomes(merge_request) |
||||||
|
[ |
||||||
|
{ label: "Total users after merge", value: display_value_or_placeholder(merge_request.total_users), action: { text: "View", href: "#", visually_hidden_text: "total users after merge" } }, |
||||||
|
{ label: "Total schemes after merge", value: display_value_or_placeholder(merge_request.total_schemes), action: { text: "View", href: "#", visually_hidden_text: "total schemes after merge" } }, |
||||||
|
{ label: "Total logs after merge", value: merge_request.total_lettings_logs.present? || merge_request.total_sales_logs.present? ? "#{merge_request.total_lettings_logs} lettings logs<br>#{merge_request.total_sales_logs} sales logs".html_safe : display_value_or_placeholder(nil), action: { text: "View", href: "#", visually_hidden_text: "total logs after merge" } }, |
||||||
|
{ label: "Total stock owners & managing agents after merge", value: merge_request.total_stock_owners.present? || merge_request.total_managing_agents.present? ? "#{merge_request.total_stock_owners} stock owners<br>#{merge_request.total_managing_agents} managing agents".html_safe : display_value_or_placeholder(nil), action: { text: "View", href: "#", visually_hidden_text: "total stock owners & managing agents after merge" } }, |
||||||
|
] |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,33 @@ |
|||||||
|
<%= govuk_summary_list do |summary_list| %> |
||||||
|
<% details.each do |detail| %> |
||||||
|
<% summary_list.with_row do |row| %> |
||||||
|
<% row.with_key { detail[:label] } %> |
||||||
|
|
||||||
|
<% row.with_value do %> |
||||||
|
<% if detail[:value].html_safe? %> |
||||||
|
<div class="govuk-!-margin-left-8 govuk-!-margin-right-4"> |
||||||
|
<%= raw(detail[:value]) %> |
||||||
|
</div> |
||||||
|
<% elsif detail[:value].is_a?(Date) || detail[:value].is_a?(Time) %> |
||||||
|
<div class="govuk-!-margin-left-8 govuk-!-margin-right-4"> |
||||||
|
<%= detail[:value].strftime("%d %B %Y") %> |
||||||
|
</div> |
||||||
|
<% else %> |
||||||
|
<%= simple_format( |
||||||
|
detail[:value], |
||||||
|
wrapper_tag: "span", |
||||||
|
class: "govuk-!-margin-left-8 govuk-!-margin-right-4", |
||||||
|
) %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
<% if detail[:action].present? %> |
||||||
|
<% row.with_action( |
||||||
|
text: detail[:action][:text], |
||||||
|
href: detail[:action][:href], |
||||||
|
visually_hidden_text: detail[:action][:visually_hidden_text], |
||||||
|
) %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
|
<% end %> |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
<div class="govuk-summary-card govuk-!-margin-bottom-6 govuk-!-width-three-quarters"> |
||||||
|
<div class="govuk-summary-card__title-wrapper"> |
||||||
|
<h3 class="govuk-summary-card__title govuk-!-font-weight-regular"><%= title %></h3> |
||||||
|
</div> |
||||||
|
<div class="govuk-summary-card__content"> |
||||||
|
<%= render partial: "merge_requests/details_list", locals: { details: } %> |
||||||
|
</div> |
||||||
|
</div> |
||||||
@ -0,0 +1,45 @@ |
|||||||
|
<% 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" %> |
||||||
|
<% end %> |
||||||
|
<% unless @merge_request.signed_dsa || @merge_request.absorbing_organisation_id.blank? %> |
||||||
|
<div class="govuk-notification-banner" role="region" aria-labelledby="govuk-notification-banner-title" data-module="govuk-notification-banner"> |
||||||
|
<div class="govuk-notification-banner__header"> |
||||||
|
<h2 class="govuk-notification-banner__title" id="govuk-notification-banner-title"> |
||||||
|
Important |
||||||
|
</h2> |
||||||
|
</div> |
||||||
|
<div class="govuk-notification-banner__content"> |
||||||
|
<strong>The absorbing organisation must accept the Data Sharing Agreement before merging.</strong> |
||||||
|
<br> |
||||||
|
<% if @merge_request.dpo_user %> |
||||||
|
Contact the Data Protection Officer: <%= link_to @merge_request.dpo_user.name, user_path(@merge_request.dpo_user.id) %> |
||||||
|
<% else %> |
||||||
|
<%= @merge_request.absorbing_organisation_name %> does not have a Data Protection Officer. You can assign one on the <%= link_to "users page", "#{organisation_path(@merge_request.absorbing_organisation_id)}/users" %>. |
||||||
|
<% end %> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<% end %> |
||||||
|
<h1 class="govuk-heading-l"> |
||||||
|
<span class="govuk-caption-l">Merge details</span> |
||||||
|
<%= display_value_or_placeholder(@merge_request.absorbing_organisation_name) %> |
||||||
|
</h1> |
||||||
|
<% unless @merge_request.status == "request_merged" %> |
||||||
|
<div class="govuk-button-group"> |
||||||
|
<button type="submit" <%= @merge_request.status == "ready_to_merge" ? "" : "disabled aria-disabled=\"true\"" %> class="govuk-button" data-module="govuk-button"> |
||||||
|
Begin merge |
||||||
|
</button> |
||||||
|
<button type="submit" class="govuk-button govuk-button--warning" data-module="govuk-button"> |
||||||
|
Delete merge request |
||||||
|
</button> |
||||||
|
</div> |
||||||
|
<% end %> |
||||||
|
|
||||||
|
<%= render partial: "merge_requests/summary_card", locals: { title: "Request details", details: request_details(@merge_request) } %> |
||||||
|
|
||||||
|
<%= render partial: "merge_requests/summary_card", locals: { title: "Merge details", details: merge_details(@merge_request) } %> |
||||||
|
|
||||||
|
<% unless @merge_request.status == "incomplete" %> |
||||||
|
<%= render partial: "merge_requests/summary_card", locals: { title: "Merge outcomes", details: merge_outcomes(@merge_request) } %> |
||||||
|
<% end %> |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
class AddAdditionalFieldsToMergeRequests < ActiveRecord::Migration[7.0] |
||||||
|
def change |
||||||
|
change_table :merge_requests, bulk: true do |t| |
||||||
|
t.integer :requester_id |
||||||
|
t.string :helpdesk_ticket |
||||||
|
t.integer :total_users |
||||||
|
t.integer :total_schemes |
||||||
|
t.integer :total_lettings_logs |
||||||
|
t.integer :total_sales_logs |
||||||
|
t.integer :total_stock_owners |
||||||
|
t.integer :total_managing_agents |
||||||
|
t.boolean :signed_dsa, default: false |
||||||
|
t.datetime :discarded_at |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,104 @@ |
|||||||
|
require "rails_helper" |
||||||
|
|
||||||
|
RSpec.describe "merge_requests/show.html.erb", type: :view do |
||||||
|
let(:absorbing_organisation) { create(:organisation, name: "Absorbing Org") } |
||||||
|
let(:dpo_user) { create(:user, name: "DPO User", is_dpo: true, organisation: absorbing_organisation) } |
||||||
|
let(:merge_request) { create(:merge_request, absorbing_organisation_id: absorbing_organisation.id, signed_dsa: false, status: 1) } |
||||||
|
|
||||||
|
before do |
||||||
|
assign(:merge_request, merge_request) |
||||||
|
render |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the correct title" do |
||||||
|
expect(rendered).to have_selector("h1.govuk-heading-l") do |h1| |
||||||
|
expect(h1).to have_selector("span.govuk-caption-l", text: "Merge details") |
||||||
|
expect(h1).to have_content("Absorbing Org") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the notification banner when DSA is not signed" do |
||||||
|
expect(rendered).to have_selector(".govuk-notification-banner") |
||||||
|
expect(rendered).to have_content("The absorbing organisation must accept the Data Sharing Agreement before merging.") |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the requester details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Requester") |
||||||
|
expect(rendered).to have_selector("dd", text: merge_request.requester&.name || "You didn't answer this question") |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the helpdesk ticket details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Helpdesk ticket") |
||||||
|
if merge_request.helpdesk_ticket.present? |
||||||
|
expect(rendered).to have_link(merge_request.helpdesk_ticket, href: "https://dluhcdigital.atlassian.net/browse/#{merge_request.helpdesk_ticket}") |
||||||
|
else |
||||||
|
expect(rendered).to have_selector("dd", text: "You didn't answer this question") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the status details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Status") |
||||||
|
expect(rendered).to have_selector("dd", text: "Incomplete") |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the absorbing organisation details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Absorbing organisation") |
||||||
|
expect(rendered).to have_selector("dd", text: merge_request.absorbing_organisation_name) |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the merging organisations details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Merging organisations") |
||||||
|
if merge_request.other_merging_organisations.present? |
||||||
|
merge_request.other_merging_organisations.split(",").each do |organisation| |
||||||
|
expect(rendered).to have_selector("dd", text: organisation.strip) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the merge date details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Merge date") |
||||||
|
expect(rendered).to have_selector("dd", text: merge_request.merge_date || "You didn't answer this question") |
||||||
|
end |
||||||
|
|
||||||
|
context "when the merge request is complete" do |
||||||
|
before do |
||||||
|
merge_request.update!(status: 4, signed_dsa: true, total_users: 10, total_schemes: 5, total_lettings_logs: 20, total_sales_logs: 30, total_stock_owners: 40, total_managing_agents: 50) |
||||||
|
assign(:merge_request, merge_request) |
||||||
|
render |
||||||
|
end |
||||||
|
|
||||||
|
it "has status of 'Merged'" do |
||||||
|
expect(rendered).to have_selector("dd", text: "Merged") |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the total users after merge details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Total users after merge") |
||||||
|
expect(rendered).to have_selector("dd", text: merge_request.total_users) |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the total schemes after merge details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Total schemes after merge") |
||||||
|
expect(rendered).to have_selector("dd", text: merge_request.total_schemes) |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the total logs after merge details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Total logs after merge") |
||||||
|
if merge_request.total_lettings_logs.present? || merge_request.total_sales_logs.present? |
||||||
|
combined_text = [] |
||||||
|
combined_text << "#{merge_request.total_lettings_logs} lettings logs" if merge_request.total_lettings_logs.present? |
||||||
|
combined_text << "#{merge_request.total_sales_logs} sales logs" if merge_request.total_sales_logs.present? |
||||||
|
expect(rendered).to have_selector("dd", text: combined_text.join("")) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
it "displays the total stock owners & managing agents after merge details" do |
||||||
|
expect(rendered).to have_selector("dt", text: "Total stock owners & managing agents after merge") |
||||||
|
if merge_request.total_stock_owners.present? || merge_request.total_managing_agents.present? |
||||||
|
combined_text = [] |
||||||
|
combined_text << "#{merge_request.total_stock_owners} stock owners" if merge_request.total_stock_owners.present? |
||||||
|
combined_text << "#{merge_request.total_managing_agents} managing agents" if merge_request.total_managing_agents.present? |
||||||
|
expect(rendered).to have_selector("dd", text: combined_text.join("")) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
Loading…
Reference in new issue