diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 15aad41..ed82553 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -38,7 +38,7 @@ def show @next_fields = @next_instance.project_instance_fields.includes(:project_template_field).order(project_template_field_id: :asc) end - @comments = @current_instance.comments.order(created_at: :asc) + @comments = @project.comments.order(created_at: :asc) @new_comment = Comment.new(user: current_user, location: @current_instance) return unless @course.use_progress_updates diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index 7eac4dc..6f5c623 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -55,7 +55,7 @@ def show .order(project_template_field_id: :asc) end - @comments = @current_instance.comments.order(created_at: :asc) + @comments = @topic.comments.order(created_at: :asc) @new_comment = Comment.new @fields = @current_fields end diff --git a/app/javascript/controllers/scroll_to_bottom_controller.js b/app/javascript/controllers/scroll_to_bottom_controller.js new file mode 100644 index 0000000..a29bf5b --- /dev/null +++ b/app/javascript/controllers/scroll_to_bottom_controller.js @@ -0,0 +1,44 @@ +import { Controller } from "@hotwired/stimulus"; + +export default class extends Controller { + static values = { + enabled: Boolean, + targetVersion: String, + }; + + connect() { + // Wait for the browser to finish painting the DOM before calculating heights + requestAnimationFrame(() => { + setTimeout(() => { + if (this.enabledValue) { + this.scrollToBottom(); + } else if (this.hasTargetVersionValue) { + this.scrollToVersion(); + } + }, 50); + }); + } + + scrollToBottom() { + this.element.scrollTop = this.element.scrollHeight; + } + + scrollToVersion() { + const targetId = `version-${this.targetVersionValue}-comments`; + const targetElement = document.getElementById(targetId); + + if (targetElement) { + const containerRect = this.element.getBoundingClientRect(); + + const targetRect = targetElement.getBoundingClientRect(); + + const scrollPosition = + this.element.scrollTop + (targetRect.top - containerRect.top) - 20; + + this.element.scrollTo({ + top: scrollPosition, + behavior: "smooth", + }); + } + } +} diff --git a/app/models/project.rb b/app/models/project.rb index 053abce..d04e376 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -8,6 +8,7 @@ class Project < ApplicationRecord has_many :project_instances, dependent: :destroy has_many :progress_updates, dependent: :destroy + has_many :comments, through: :project_instances # DO NOT WRITE TO STATUS IN PROJECTS, IT'S ONLY MEANT TO KEEP TRACK OF THE STATUS OF THE LATEST PROJECT INSTANCE # write to the latest project instance instead diff --git a/app/models/topic.rb b/app/models/topic.rb index bb1fd79..1ac037c 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -9,6 +9,8 @@ class Topic < ApplicationRecord has_many :topic_instances, dependent: :destroy, foreign_key: 'project_id' + has_many :comments, through: :topic_instances + has_many :proposed_project_instances, class_name: 'ProjectInstance', foreign_key: 'source_topic_id' # DO NOT WRITE TO STATUS IN PROJECTS, IT'S ONLY MEANT TO KEEP TRACK OF THE STATUS OF THE LATEST PROJECT INSTANCE diff --git a/app/views/courses/_project_status_bar.html.erb b/app/views/courses/_project_status_bar.html.erb index 441cffe..6b6feef 100644 --- a/app/views/courses/_project_status_bar.html.erb +++ b/app/views/courses/_project_status_bar.html.erb @@ -12,12 +12,22 @@
No proposal submitted yet.
<%= link_to "Submit Proposal", new_course_project_path(@course), - class: "inline-flex items-center justify-center px-6 py-3 text-base font-semibold text-white transition-all duration-200 bg-blue-600 rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:shadow-md" %> + class: + "inline-flex items-center justify-center px-6 py-3 text-base font-semibold text-white transition-all duration-200 bg-blue-600 rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:shadow-md" %> <% end %> diff --git a/app/views/projects/_project_comments.html.erb b/app/views/projects/_project_comments.html.erb index 7c4e31b..0d547ea 100644 --- a/app/views/projects/_project_comments.html.erb +++ b/app/views/projects/_project_comments.html.erb @@ -26,72 +26,88 @@ class=" flex-1 min-h-0 overflow-y-auto bg-gray-50/30 p-5 custom-scrollbar relative " + data-controller="scroll-to-bottom" + data-scroll-to-bottom-enabled-value="<%= current_version == latest_version %>" + data-scroll-to-bottom-target-version-value="<%= current_version %>" > <% if comments.any? %>