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