Skip to content

Commit

Permalink
Merge pull request #1988 from unboxed/review-policies
Browse files Browse the repository at this point in the history
Add reviewer interaction with policies
  • Loading branch information
benbaumann95 authored Oct 17, 2024
2 parents 2ab6011 + 6acd4c0 commit a6bb4b3
Show file tree
Hide file tree
Showing 18 changed files with 469 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# frozen_string_literal: true

module Reviewing
module PlanningApplicationPolicyClass
class LinkComponent < ViewComponent::Base
erb_template <<~ERB
<%= govuk_link_to(link_text, link_path, aria: {describedby: link_text}) %>
ERB

def initialize(planning_application_policy_class:)
@planning_application_policy_class = planning_application_policy_class
@planning_application = planning_application_policy_class.planning_application
@policy_class = planning_application_policy_class.policy_class
@part = @policy_class.policy_part
end

attr_reader :planning_application, :planning_application_policy_class, :policy_class, :part

def link_path
case planning_application_policy_class.current_review.review_status
when "review_complete"
planning_application_review_policy_areas_policy_class_path(planning_application_policy_class.planning_application, planning_application_policy_class)
else
edit_planning_application_review_policy_areas_policy_class_path(
planning_application, planning_application_policy_class
)
end
end

def link_text
"Review assessment of Part #{part.number}, Class #{policy_class.section}"
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,9 @@ def status_tag_component
end

def status
if planning_application_policy_class.current_review
planning_application_policy_class.current_review.status.to_sym
else
:not_started
end
return :not_started unless (review = planning_application_policy_class.current_review)

(review.updated? || review.complete?) ? :complete : review.status.to_sym
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module PlanningApplications
module Assessment
module PolicyAreas
class PolicyClassesController < BaseController
before_action :ensure_can_assess_planning_application
before_action :ensure_can_assess_planning_application, only: %i[new create]
before_action :find_policy_parts
before_action :find_part, only: %i[new create]
before_action :find_planning_application_policy_class, only: %i[edit update destroy]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# frozen_string_literal: true

module PlanningApplications
module Review
module PolicyAreas
class PolicyClassesController < BaseController
before_action :find_planning_application_policy_class, only: %i[show edit update]
before_action :build_form, only: %i[edit update]
before_action :set_review, only: %i[show edit update]

def show
respond_to do |format|
format.html
end
end

def edit
respond_to do |format|
format.html
end
end

def update
@form.update(policy_section_status_params)

if @planning_application_policy_class.update_review(review_params)
redirect_to planning_application_review_tasks_path(@planning_application), notice: t(".success")
else
render :edit
end
end

private

def find_planning_application_policy_class
@planning_application_policy_class = @planning_application.planning_application_policy_classes.find(params[:id])
end

def policy_section_status_params
params.require(:planning_application_policy_sections).permit(
params[:planning_application_policy_sections].keys.map do |key|
[key, [:status, {comments_attributes: [:id, :text]}]]
end.to_h
)
end

def build_form
@form = PolicySectionForm.new(
planning_application: @planning_application,
policy_class: @planning_application_policy_class.policy_class
)
end

def review_params
params.require(:review).permit(:review_status, :action, :comment).merge(reviewer: current_user, reviewed_at: Time.current)
end

def set_review
@review = @planning_application_policy_class.current_review
end
end
end
end
end
7 changes: 5 additions & 2 deletions app/form_models/policy_section_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ def build_planning_application_policy_sections
def update(params)
params.each do |policy_section_id, section_params|
planning_application_policy_section = planning_application_policy_sections[policy_section_id.to_i]
planning_application_policy_section.update!(

update_attributes = {
status: section_params[:status],
comments_attributes: section_params[:comments_attributes]
)
}.compact

planning_application_policy_section.update!(update_attributes)
end
end
end
17 changes: 14 additions & 3 deletions app/models/planning_application_policy_class.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ class PlanningApplicationPolicyClass < ApplicationRecord
belongs_to :planning_application
belongs_to :new_policy_class

has_many :reviews, as: :owner, dependent: :destroy, class_name: "Review", autosave: true
with_options dependent: :destroy do
has_many :reviews, -> { order(created_at: :desc) }, as: :owner
end

with_options on: :update do
validates :reporting_types, presence: true
Expand All @@ -17,13 +19,16 @@ def current_review
end

def update_review(params)
case params[:status]
status = params[:status] || params[:review_status]
case status
when "complete"
mark_as_complete(params)
when "in_progress"
mark_as_in_progress(params)
when "review_complete", "review_in_progress"
update_current_review(params)
else
raise ArgumentError, "Unexpected review status: #{params[:status].inspect}"
raise ArgumentError, "Unexpected review status: #{status.inspect}"
end
end

Expand All @@ -48,4 +53,10 @@ def mark_as_in_progress(params)
rescue ActiveRecord::ActiveRecordError
false
end

def update_current_review(params)
current_review.update!(params)
rescue ActiveRecord::ActiveRecordError
false
end
end
3 changes: 2 additions & 1 deletion app/models/review.rb
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ def ensure_consultation_has_finished!

def all_policies_are_determined
return unless status == "complete"
return if owner.policy_class.planning_application_policy_sections.none?(&:to_be_determined?)
policies = owner.policy_class.planning_application_policy_sections.where(planning_application_id: owner.planning_application)
return if policies.none?(&:to_be_determined?)

errors.add(:base, :policies_to_be_determined)
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@
}
) %>

<% if @review.comment.present? %>
<div class="govuk-inset-text" id="reviewer_comment">
<p class="govuk-body govuk-!-font-weight-bold govuk-!-margin-bottom-0">
Reviewer comment:
</p>
<p class="govuk-body govuk-!-margin-top-1"><%= @review.created_at.to_fs %></p>
<p class="govuk-body italic"><%= @review.comment %></p>
</div>
<% end %>

<% if @planning_application_policy_class.policy_class.policy_sections.any? %>
<%= govuk_error_summary(@review) %>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<% content_for :page_title do %>
<%= t(".review") %> - <%= t("page_title") %>
<% end %>
<% render(
partial: "shared/review_task_breadcrumbs",
locals: {
planning_application: planning_application,
current_page: t(
".review_policy_class",
part: policy_class.policy_part_number,
class: policy_class.section
)
}
) %>
<%= render(
partial: "shared/proposal_header",
locals: {heading: t(".review_policy_class", part: policy_class.policy_part_number, class: policy_class.section)}
) %>

<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<h2 class="govuk-heading-m govuk-!-padding-bottom-3">
<%= policy_class.name.upcase_first %>
</h2>

<p class="govuk-body">
<%= t(".complete_the_assessment") %>
<p class="govuk-body">
<%= govuk_link_to(
t(".open_legislation_in"),
policy_class.url,
new_tab: ""
) %>
</p>
<%= govuk_accordion do |accordion|
accordion.with_section(heading_text: "Constraints") do
render(partial: "shared/constraints")
end
end %>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<%= render(
partial: "summary",
locals: {
planning_application: @planning_application,
planning_application_policy_class: @planning_application_policy_class,
policy_class: @planning_application_policy_class.policy_class
}
) %>

<% if @planning_application_policy_class.policy_class.policy_sections.any? %>
<%= govuk_error_summary(@review) %>

<%= form_with url: planning_application_review_policy_areas_policy_class_path(@planning_application, @planning_application_policy_class), method: :patch, html: {data: unsaved_changes_data} do |form| %>
<%= govuk_table(id: "policy-sections") do |table| %>
<% table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(text: "Policy reference") %>
<% PlanningApplicationPolicySection.statuses.keys.each do |status| %>
<% row.with_cell(text: status.humanize) %>
<% end %>
<% end %>
<% end %>

<% table.with_body do |body| %>
<% @planning_application_policy_class.policy_class.policy_sections.each do |policy_section| %>
<% pa_policy_section = policy_section.planning_application_policy_section %>
<% body.with_row(html_attributes: {id: "policy-section-#{policy_section.id}"}) do |row| %>
<% row.with_cell do %>
<p><strong><%= @planning_application_policy_class.policy_class.section %>.<%= policy_section.section %></strong></p>
<%= render(FormattedContentComponent.new(text: policy_section.description)) %>

<%= form.govuk_text_area "planning_application_policy_sections[#{policy_section.id}][comments_attributes][0][text]",
label: {text: "Add comment", class: "govuk-label govuk-label--s"},
value: pa_policy_section&.last_comment&.text,
class: "govuk-textarea govuk-!-margin-bottom-2",
rows: 2 %>

<% if pa_policy_section %>
<%= render(
partial: "shared/policy_classes/previous_comments",
locals: {previous_comments: pa_policy_section.previous_comments}
) %>
<% end %>
<% end %>
<% PlanningApplicationPolicySection.statuses.keys.each do |status| %>
<% row.with_cell do %>
<div class="govuk-radios govuk-radios--small">
<%= form.govuk_radio_button(
"planning_application_policy_sections[#{policy_section.id}][status]",
status,
checked: @form.planning_application_policy_sections[policy_section.id].status == status,
label: {hidden: true},
disabled: true,
class: "govuk-radios__input"
) %>
</div>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>

<fieldset class="govuk-fieldset govuk-!-padding-bottom-5">
<div class="govuk-radios" data-module="govuk-radios">
<%= form.govuk_radio_button(:action, "accepted", label: {text: "Accept"}, name: "review[action]", checked: @planning_application_policy_class.current_review.accepted?) %>
<%= form.govuk_radio_button(
:action, "rejected", label: {text: "Return to officer with comment"}, name: "review[action]", checked: @planning_application_policy_class.current_review.rejected?
) do %>
<%= form.govuk_text_area(
:comment,
label: {text: "Explain to the assessor why this needs reviewing"},
rows: 6,
name: "review[comment]",
value: @planning_application_policy_class.current_review.comment
) %>
<% end %>
</div>
</fieldset>

<%= form.govuk_submit "Save and mark as complete", name: "review[review_status]", value: "review_complete" do %>
<%= form.govuk_submit "Save and come back later", name: "review[review_status]", value: "review_in_progress", secondary: true %>
<%= govuk_button_link_to(t("back"), planning_application_review_tasks_path(@planning_application), secondary: true) %>
<% end %>
<% end %>
<% else %>
<%= govuk_button_link_to(t("back"), planning_application_review_tasks_path(@planning_application), secondary: true) %>
<% end %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<%= render(
partial: "summary",
locals: {
planning_application: @planning_application,
planning_application_policy_class: @planning_application_policy_class,
policy_class: @planning_application_policy_class.policy_class
}
) %>

<%= form_with(
model: [@planning_application, @planning_application_policy_class],
url: planning_application_review_policy_areas_policy_class_path(@planning_application, @planning_application_policy_class)
) do |form| %>
<fieldset class="govuk-fieldset govuk-!-padding-bottom-5">
<div class="govuk-radios" data-module="govuk-radios">
<%= form.govuk_radio_button(:action, "accepted", label: {text: "Accept"}, disabled: true, checked: @planning_application_policy_class.current_review.accepted?) %>
<%= form.govuk_radio_button(
:action, "rejected", label: {text: "Return to officer with comment"}, disabled: true, checked: @planning_application_policy_class.current_review.rejected?
) do %>
<%= form.govuk_text_area(
:comment,
label: {text: "Explain to the assessor why this needs reviewing"},
rows: 6,
disabled: true,
value: @planning_application_policy_class.current_review.comment
) %>
<% end %>
</div>
</fieldset>
<% end %>

<div class="govuk-button-group">
<%= back_link %>
<%= govuk_link_to "Edit review of Part #{@planning_application_policy_class.policy_class.policy_part_number}, Class #{@planning_application_policy_class.policy_class.section}", edit_planning_application_review_policy_areas_policy_class_path(@planning_application, @planning_application_policy_class) %>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<% planning_application.planning_application_policy_classes.order(:new_policy_class_id).each do |policy_class| %>
<% next if policy_class.current_review.not_started? || policy_class.current_review.in_progress? %>

<%= render TaskListItems::Reviewing::Component.new do |c| %>
<% c.with_link do %>
<%= render(Reviewing::PlanningApplicationPolicyClass::LinkComponent.new(planning_application_policy_class: policy_class)) %>
<% end %>

<% c.with_tag do %>
<div class="govuk-task-list__status app-task-list__task-tag">
<%= render(
StatusTags::ReviewComponent.new(
review_item: policy_class.current_review,
updated: policy_class.current_review.updated?
)
) %>
</div>
<% end %>
<% end %>
<% end %>
Loading

0 comments on commit a6bb4b3

Please sign in to comment.