diff --git a/app/assets/images/icons/checkmark-green-circle.svg b/app/assets/images/icons/checkmark-green-circle.svg new file mode 100644 index 0000000000..fe1d9798e4 --- /dev/null +++ b/app/assets/images/icons/checkmark-green-circle.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/crossmark-red-circle.svg b/app/assets/images/icons/crossmark-red-circle.svg new file mode 100644 index 0000000000..ddc1560875 --- /dev/null +++ b/app/assets/images/icons/crossmark-red-circle.svg @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/app/assets/stylesheets/components/_hub-doc-assessment.scss b/app/assets/stylesheets/components/_hub-doc-assessment.scss index b4c5f8c7fa..4c04b0f288 100644 --- a/app/assets/stylesheets/components/_hub-doc-assessment.scss +++ b/app/assets/stylesheets/components/_hub-doc-assessment.scss @@ -28,4 +28,27 @@ font-weight: bold; text-transform: capitalize; } +} + +.feedback-box { + padding: 2.5rem 2rem; + border: 1px solid #525252; + border-radius: 8px; + word-break: break-word; + background-color: #F7F7F7; + font-weight: bold; + + #top-question{ + display: flex; + align-items: center; + gap: 8px; + } + + #additional-feedback{ + width: 100%; + background: white; + box-sizing: border-box; + min-height: 10rem; + font-weight: $font-weight-normal; + } } \ No newline at end of file diff --git a/app/controllers/hub/documents_controller.rb b/app/controllers/hub/documents_controller.rb index f78ef09036..b8dc408340 100644 --- a/app/controllers/hub/documents_controller.rb +++ b/app/controllers/hub/documents_controller.rb @@ -5,6 +5,7 @@ class DocumentsController < Hub::BaseController load_and_authorize_resource through: :client before_action :load_document_type_options helper_method :transient_storage_url + before_action :require_admin, only: [:rerun_screener, :record_feedback] layout "hub" @@ -67,13 +68,24 @@ def destroy end def rerun_screener - return head :forbidden if acts_like_production? || !current_user.admin? + return head :forbidden if acts_like_production? DocScreenerJob.perform_now(@document.id) redirect_back(fallback_location: edit_hub_client_document_path(client_id: @document.client.id, id: @document), notice: "Re-ran document screening.") end + def record_feedback + DocAssessmentFeedback.create!( + doc_assessment: @document.latest_assessment, + user: current_user, + feedback: params[:feedback], + feedback_notes: params[:feedback_notes] + ) + + redirect_back fallback_location: edit_hub_client_document_path(client_id: @document.client.id, id: @document) + end + private def load_document_type_options diff --git a/app/javascript/hub/feedback.js b/app/javascript/hub/feedback.js new file mode 100644 index 0000000000..f48c43ba23 --- /dev/null +++ b/app/javascript/hub/feedback.js @@ -0,0 +1,8 @@ +export default function feedback() { + document.querySelectorAll('[data-feedback-x]').forEach(button => { + button.addEventListener('click', () => { + const notesDiv = document.querySelector('[data-feedback-notes]') + notesDiv.classList.remove('hidden') + }) + }) +} \ No newline at end of file diff --git a/app/javascript/packs/hub.js b/app/javascript/packs/hub.js index a454e4b59b..f0ad9a325e 100644 --- a/app/javascript/packs/hub.js +++ b/app/javascript/packs/hub.js @@ -1,8 +1,10 @@ // See `app/javascript/hub/README.md` import MainMenuComponent from "../hub/MainMenuComponent"; import imageRotate from "../hub/image_rotate"; +import feedback from "../hub/feedback"; window.addEventListener("load", function() { MainMenuComponent(); imageRotate(); + feedback(); }) diff --git a/app/models/doc_assessment.rb b/app/models/doc_assessment.rb index 98a51ad600..f8ccec7bb7 100644 --- a/app/models/doc_assessment.rb +++ b/app/models/doc_assessment.rb @@ -24,4 +24,6 @@ # class DocAssessment < ApplicationRecord belongs_to :document + has_many :feedbacks, class_name: "DocAssessmentFeedback", dependent: :destroy + end diff --git a/app/models/doc_assessment_feedback.rb b/app/models/doc_assessment_feedback.rb new file mode 100644 index 0000000000..8111393631 --- /dev/null +++ b/app/models/doc_assessment_feedback.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: doc_assessment_feedbacks +# +# id :bigint not null, primary key +# feedback :integer default("unfilled"), not null +# feedback_notes :text +# created_at :datetime not null +# updated_at :datetime not null +# doc_assessment_id :bigint not null +# user_id :bigint not null +# +# Indexes +# +# index_doc_assessment_feedbacks_on_doc_assessment_id (doc_assessment_id) +# index_doc_assessment_feedbacks_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (doc_assessment_id => doc_assessments.id) +# fk_rails_... (user_id => users.id) +# +class DocAssessmentFeedback < ApplicationRecord + belongs_to :doc_assessment + belongs_to :user + + enum feedback: { unfilled: 0, correct: 1, incorrect: 2 }, _prefix: :feedback + + validates :feedback, presence: true +end diff --git a/app/models/user.rb b/app/models/user.rb index eed4ff8198..e029b3a85b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -79,6 +79,7 @@ class User < ApplicationRecord has_many :access_logs has_many :notifications, class_name: "UserNotification" belongs_to :role, polymorphic: true + has_many :doc_assessment_feedbacks validates_presence_of :name validates_inclusion_of :timezone, in: ActiveSupport::TimeZone.country_zones("us").map { |tz| tz.tzinfo.name } diff --git a/app/views/hub/documents/_feedback_collection.erb b/app/views/hub/documents/_feedback_collection.erb new file mode 100644 index 0000000000..29c5fbb080 --- /dev/null +++ b/app/views/hub/documents/_feedback_collection.erb @@ -0,0 +1,31 @@ +<% if current_user.admin? && (@document.latest_assessment.present? && @document.latest_assessment&.feedbacks.blank?) %> +
Provide additional feedback
+ <%= form_with url: record_feedback_hub_client_document_path, method: :post do |f| %> + <%= f.hidden_field :feedback, value: "incorrect" %> + <%= f.text_area :feedback_notes, id: "additional-feedback" %> +