diff --git a/app/components/task_list_items/assessment/meeting_component.rb b/app/components/task_list_items/assessment/meeting_component.rb new file mode 100644 index 0000000000..0e1e713d39 --- /dev/null +++ b/app/components/task_list_items/assessment/meeting_component.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module TaskListItems + module Assessment + class MeetingComponent < TaskListItems::BaseComponent + def initialize(planning_application:) + @planning_application = planning_application + end + + private + + attr_reader :planning_application + + delegate :meeting, to: :planning_application + + def link_text + "Meeting" + end + + def link_path + if planning_application + planning_application_assessment_meetings_path(@planning_application) + else + new_planning_application_assessment_meeting_path(@planning_application) + end + end + + def status_tag_component + StatusTags::BaseComponent.new( + status: @planning_application.meetings.last.status + ) + end + end + end +end diff --git a/app/controllers/planning_applications/assessment/meetings_controller.rb b/app/controllers/planning_applications/assessment/meetings_controller.rb new file mode 100644 index 0000000000..b923b3215a --- /dev/null +++ b/app/controllers/planning_applications/assessment/meetings_controller.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module PlanningApplications + module Assessment + class MeetingsController < AuthenticationController + before_action :set_planning_application + before_action :build_meeting, only: %i[new create] + + def index + @meetings = @planning_application.meetings + respond_to do |format| + format.html + end + end + + def show + respond_to do |format| + format.html + end + end + + def new + respond_to do |format| + format.html + end + end + + def create + respond_to do |format| + if @meeting.update(meeting_params) + format.html do + redirect_to planning_application_assessment_tasks_path(@planning_application), notice: t(".success") + end + else + format.html { render :new } + end + end + end + + private + + def meeting_params + params.require(:meeting) + .permit(:occurred_at, :comment) + .merge(created_by: current_user, status: "complete") + end + + def build_meeting + @meeting = @planning_application.meetings.new + end + end + end +end diff --git a/app/models/meeting.rb b/app/models/meeting.rb new file mode 100644 index 0000000000..130331b611 --- /dev/null +++ b/app/models/meeting.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class Meeting < ApplicationRecord + include DateValidateable + + belongs_to :created_by, class_name: "User" + + belongs_to :planning_application + + validates :status, presence: true + + validates :occurred_at, + presence: true, + date: { + on_or_before: :current + } + + enum :status, %i[ + not_started + complete + ].index_with(&:to_s) + + scope :by_created_at_desc, -> { order(created_at: :desc) } +end diff --git a/app/models/planning_application.rb b/app/models/planning_application.rb index a9bb0d2667..7756ddfa2c 100644 --- a/app/models/planning_application.rb +++ b/app/models/planning_application.rb @@ -52,6 +52,7 @@ class WithdrawOrCancelError < RuntimeError; end has_many :planning_application_constraints_queries has_many :constraints, through: :planning_application_constraints, source: :constraint has_many :site_histories + has_many :meetings, -> { by_created_at_desc } has_many :site_notices has_many :site_visits, -> { by_created_at_desc } has_many :policy_classes, -> { order(:section) } diff --git a/app/views/planning_applications/assessment/meetings/_form.html.erb b/app/views/planning_applications/assessment/meetings/_form.html.erb new file mode 100644 index 0000000000..ce428842ce --- /dev/null +++ b/app/views/planning_applications/assessment/meetings/_form.html.erb @@ -0,0 +1,18 @@ +<%= form_with( + model: @meeting, + class: "govuk-!-margin-top-5", + url: planning_application_assessment_meetings_path(@planning_application, @meeting), + method: :post + ) do |form| %> + + <%= form.govuk_date_field(:occurred_at, rows: 6, legend: {text: "Meeting date"}) %> + + <%= form.govuk_text_area(:comment, rows: 6, label: {text: "Add notes (optional)"}) %> + +
+ +<% end %> diff --git a/app/views/planning_applications/assessment/meetings/_overview.html.erb b/app/views/planning_applications/assessment/meetings/_overview.html.erb new file mode 100644 index 0000000000..a13068e62b --- /dev/null +++ b/app/views/planning_applications/assessment/meetings/_overview.html.erb @@ -0,0 +1,6 @@ +Response created by: <%= meeting.created_by.name %>
+Response created: <%= meeting.created_at.to_fs %>
+<% if meeting.valid? %> +Meeting occured at: <%= meeting.occurred_at&.to_date&.to_fs %>
+<% end %> +Comment: <%= meeting.comment %>
diff --git a/app/views/planning_applications/assessment/meetings/index.html.erb b/app/views/planning_applications/assessment/meetings/index.html.erb new file mode 100644 index 0000000000..44481b789f --- /dev/null +++ b/app/views/planning_applications/assessment/meetings/index.html.erb @@ -0,0 +1,37 @@ +<% content_for :page_title do %> + Meetings - <%= t("page_title") %> +<% end %> + +<%= render( + partial: "shared/proposal_header", + locals: {heading: "View meetings"} + ) %> + +<% if @meetings.any? %> +<%= govuk_link_to "View", planning_application_assessment_meeting_path(@planning_application, meeting) %>
++ No meetings have been added yet. +
+<% end %> + +<%= govuk_link_to "Add new meeting", new_planning_application_assessment_meeting_path(@planning_application) %> + + diff --git a/app/views/planning_applications/assessment/meetings/new.html.erb b/app/views/planning_applications/assessment/meetings/new.html.erb new file mode 100644 index 0000000000..77d1f460f9 --- /dev/null +++ b/app/views/planning_applications/assessment/meetings/new.html.erb @@ -0,0 +1,23 @@ +<% content_for :page_title do %> + Meeting - <%= t("page_title") %> +<% end %> + +<%= render( + partial: "shared/assessment_task_breadcrumbs", + locals: {planning_application: @planning_application} + ) %> +<% content_for :title, "Meeting" %> + +<%= render( + partial: "shared/proposal_header", + locals: {heading: "Add a meeting"} + ) %> +