class DiaryCommentsController < ApplicationController
- include UserMethods
- include PaginationMethods
-
layout "site"
before_action :authorize_web
authorize_resource
- before_action :lookup_user, :only => :index
- before_action :check_database_writable, :only => [:create, :hide, :unhide]
-
- allow_thirdparty_images :only => [:index, :create]
-
- def index
- @title = t ".title", :user => @user.display_name
-
- comments = DiaryComment.where(:user => @user)
- comments = comments.visible unless can? :unhide, DiaryComment
+ before_action :check_database_writable
- @params = params.permit(:display_name, :before, :after)
-
- @comments, @newer_comments_id, @older_comments_id = get_page_items(comments, :includes => [:user])
-
- render :partial => "page" if turbo_frame_request_id == "pagination"
- end
+ allow_thirdparty_images :only => :create
def create
@entry = DiaryEntry.find(params[:id])
--- /dev/null
+module Users
+ class ChangesetCommentsController < CommentsController
+ def index
+ @title = t ".title", :user => @user.display_name
+
+ comments = ChangesetComment.where(:author => @user)
+ comments = comments.visible unless current_user&.moderator?
+
+ @params = params.permit(:display_name, :before, :after)
+
+ @comments, @newer_comments_id, @older_comments_id = get_page_items(comments, :includes => [:author])
+ end
+ end
+end
--- /dev/null
+module Users
+ class CommentsController < ApplicationController
+ include UserMethods
+ include PaginationMethods
+
+ layout "site"
+
+ before_action :authorize_web
+ before_action :set_locale
+ before_action :check_database_readable
+
+ authorize_resource
+
+ before_action :lookup_user
+
+ allow_thirdparty_images
+ end
+end
--- /dev/null
+module Users
+ class DiaryCommentsController < CommentsController
+ def index
+ @title = t ".title", :user => @user.display_name
+
+ comments = DiaryComment.where(:user => @user)
+ comments = comments.visible unless can? :unhide, DiaryComment
+
+ @params = params.permit(:display_name, :before, :after)
+
+ @comments, @newer_comments_id, @older_comments_id = get_page_items(comments, :includes => [:user])
+
+ render :partial => "page" if turbo_frame_request_id == "pagination"
+ end
+ end
+end
belongs_to :changeset
belongs_to :author, :class_name => "User"
+ scope :visible, -> { where(:visible => true) }
+
validates :id, :uniqueness => true, :presence => { :on => :update },
:numericality => { :on => :update, :only_integer => true }
validates :changeset, :associated => true
+++ /dev/null
-<% content_for :heading do %>
- <h1><%= t ".heading", :user => @user.display_name %></h1>
- <p><%= t ".subheading_html", :user => link_to(@user.display_name, @user) %></p>
-<% end %>
-
-<% if @comments.empty? %>
- <h4><%= t ".no_comments" %></h4>
-<% else %>
- <%= render :partial => "page" %>
-<% end -%>
--- /dev/null
+<turbo-frame id="pagination" target="_top" data-turbo="false">
+ <table class="table table-striped" width="100%">
+ <thead>
+ <tr>
+ <th width="25%"><%= t ".changeset" %></th>
+ <th width="25%"><%= t ".when" %></th>
+ <th width="50%"><%= t ".comment" %></th>
+ </tr>
+ </thead>
+ <% @comments.each do |comment| -%>
+ <tr>
+ <td width="25%" class="<%= "text-muted" unless comment.visible? %>"><%= link_to comment.changeset.id, changeset_path(comment.changeset) %></td>
+ <td width="25%" class="<%= "text-muted" unless comment.visible? %>"><span title="<%= l comment.created_at, :format => :friendly %>"><%= time_ago_in_words(comment.created_at, :scope => :"datetime.distance_in_words_ago") %></span></td>
+ <td width="50%" class="richtext text-break<%= " text-muted" unless comment.visible? %>"><%= comment.body.to_html %></td>
+ </tr>
+ <% end -%>
+ </table>
+
+ <%= render "shared/pagination",
+ :newer_id => @newer_comments_id,
+ :older_id => @older_comments_id %>
+</turbo-frame>
--- /dev/null
+<% content_for :heading_class, "pb-0" %>
+
+<% content_for :heading do %>
+ <h1><%= t ".heading_html", :user => link_to(@user.display_name, @user) %></h1>
+ <ul class="nav nav-tabs">
+ <li class="nav-item">
+ <%= link_to t(".diary_entries"), user_diary_comments_path, :class => ["nav-link", { "active" => controller_name == "diary_comments" }] %>
+ </li>
+ <li class="nav-item">
+ <%= link_to t(".changesets"), user_changeset_comments_path, :class => ["nav-link", { "active" => controller_name == "changeset_comments" }] %>
+ </li>
+ </ul>
+<% end %>
+
+<% if @comments.empty? %>
+ <h4><%= t ".no_comments" %></h4>
+<% else %>
+ <%= render :partial => "page" %>
+<% end -%>
<span class='badge count-number'><%= number_with_delimiter(current_user.diary_entries.size) %></span>
</li>
<li>
- <%= link_to t(".my comments"), diary_comments_path(current_user) %>
+ <%= link_to t(".my comments"), user_diary_comments_path(current_user) %>
<span class='badge count-number'><%= number_with_delimiter(current_user.diary_comments.size) %></span>
</li>
<li>
<span class='badge count-number'><%= number_with_delimiter(@user.diary_entries.size) %></span>
</li>
<li>
- <%= link_to t(".comments"), diary_comments_path(@user) %>
+ <%= link_to t(".comments"), user_diary_comments_path(@user) %>
<span class='badge count-number'><%= number_with_delimiter(@user.diary_comments.size) %></span>
</li>
<% if current_user %>
heading: Unsubscribe from the following diary entry discussion?
button: Unsubscribe from discussion
diary_comments:
- index:
- title: "Diary Comments added by %{user}"
- heading: "%{user}'s Diary Comments"
- subheading_html: "Diary Comments added by %{user}"
- no_comments: "No diary comments"
- page:
- post: Post
- when: When
- comment: Comment
new:
heading: Add a comment to the following diary entry discussion?
doorkeeper:
preview: Preview
help: Help
pagination:
+ changeset_comments:
+ older: Older Comments
+ newer: Newer Comments
diary_comments:
older: Older Comments
newer: Newer Comments
user:
summary_html: "%{name} created from %{ip_address} on %{date}"
summary_no_ip_html: "%{name} created on %{date}"
+ comments:
+ index:
+ heading_html: "%{user}'s Comments"
+ changesets: "Changesets"
+ diary_entries: "Diary entries"
+ no_comments: "No comments"
+ changeset_comments:
+ index:
+ title: "Changeset Comments added by %{user}"
+ page:
+ changeset: Changeset
+ when: When
+ comment: Comment
+ diary_comments:
+ index:
+ title: "Diary Comments added by %{user}"
+ page:
+ post: Post
+ when: When
+ comment: Comment
suspended:
title: Account Suspended
heading: Account Suspended
get "/user/:display_name/diary/rss" => "diary_entries#rss", :defaults => { :format => :rss }
get "/diary/:language/rss" => "diary_entries#rss", :defaults => { :format => :rss }
get "/diary/rss" => "diary_entries#rss", :defaults => { :format => :rss }
- get "/user/:display_name/diary/comments/:page", :page => /[1-9][0-9]*/, :to => redirect(:path => "/user/%{display_name}/diary/comments")
- get "/user/:display_name/diary/comments" => "diary_comments#index", :as => :diary_comments
get "/user/:display_name/diary" => "diary_entries#index"
get "/diary/:language" => "diary_entries#index"
scope "/user/:display_name" do
resources :users, :path => "user", :param => :display_name, :only => [:new, :create, :show] do
resource :role, :controller => "user_roles", :path => "roles/:role", :only => [:create, :destroy]
scope :module => :users do
+ resources :diary_comments, :only => :index
+ resources :changeset_comments, :only => :index
resource :issued_blocks, :path => "blocks_by", :only => :show
resource :received_blocks, :path => "blocks", :only => [:show, :edit, :destroy]
resource :status, :only => :update
end
end
get "/user/:display_name/account", :to => redirect(:path => "/account/edit")
+ get "/user/:display_name/diary/comments(/:page)", :page => /[1-9][0-9]*/, :to => redirect(:path => "/user/%{display_name}/diary_comments")
resource :account, :only => [:edit, :update, :destroy] do
scope :module => :accounts do
end
def test_routes
- assert_routing(
- { :path => "/user/username/diary/comments", :method => :get },
- { :controller => "diary_comments", :action => "index", :display_name => "username" }
- )
assert_routing(
{ :path => "/user/username/diary/1/comments", :method => :post },
{ :controller => "diary_comments", :action => "create", :display_name => "username", :id => "1" }
{ :path => "/diary_comments/2/unhide", :method => :post },
{ :controller => "diary_comments", :action => "unhide", :comment => "2" }
)
-
- get "/user/username/diary/comments/1"
- assert_redirected_to "/user/username/diary/comments"
- end
-
- def test_index
- user = create(:user)
- other_user = create(:user)
- suspended_user = create(:user, :suspended)
- deleted_user = create(:user, :deleted)
-
- # Test a user with no comments
- get diary_comments_path(:display_name => user.display_name)
- assert_response :success
- assert_template :index
- assert_select "h4", :html => "No diary comments"
-
- # Test a user with a comment
- create(:diary_comment, :user => other_user)
-
- get diary_comments_path(:display_name => other_user.display_name)
- assert_response :success
- assert_template :index
- assert_dom "a[href='#{user_path(other_user)}']", :text => other_user.display_name
- assert_select "table.table-striped tbody" do
- assert_select "tr", :count => 1
- end
-
- # Test a suspended user
- get diary_comments_path(:display_name => suspended_user.display_name)
- assert_response :not_found
-
- # Test a deleted user
- get diary_comments_path(:display_name => deleted_user.display_name)
- assert_response :not_found
- end
-
- def test_index_invalid_paged
- user = create(:user)
-
- %w[-1 0 fred].each do |id|
- get diary_comments_path(:display_name => user.display_name, :before => id)
- assert_redirected_to :controller => :errors, :action => :bad_request
-
- get diary_comments_path(:display_name => user.display_name, :after => id)
- assert_redirected_to :controller => :errors, :action => :bad_request
- end
end
def test_create
--- /dev/null
+require "test_helper"
+
+module Users
+ class ChangesetCommentsControllerTest < ActionDispatch::IntegrationTest
+ ##
+ # test all routes which lead to this controller
+ def test_routes
+ assert_routing(
+ { :path => "/user/username/changeset_comments", :method => :get },
+ { :controller => "users/changeset_comments", :action => "index", :user_display_name => "username" }
+ )
+ end
+
+ def test_index
+ user = create(:user)
+ other_user = create(:user)
+ changeset = create(:changeset, :closed)
+ create_list(:changeset_comment, 3, :changeset => changeset, :author => user)
+ create_list(:changeset_comment, 2, :changeset => changeset, :author => other_user)
+
+ get user_changeset_comments_path(user)
+ assert_response :success
+ assert_select "table.table-striped tbody" do
+ assert_select "tr", :count => 3
+ end
+
+ create(:changeset_comment, :changeset => changeset, :author => user)
+ create(:changeset_comment, :changeset => changeset, :author => user, :visible => false)
+
+ get user_changeset_comments_path(user)
+ assert_response :success
+ assert_select "table.table-striped tbody" do
+ assert_select "tr", :count => 4
+ end
+ end
+ end
+end
--- /dev/null
+require "test_helper"
+
+module Users
+ class DiaryCommentsControllerTest < ActionDispatch::IntegrationTest
+ def setup
+ super
+ # Create the default language for diary entries
+ create(:language, :code => "en")
+ end
+
+ ##
+ # test all routes which lead to this controller
+ def test_routes
+ assert_routing(
+ { :path => "/user/username/diary_comments", :method => :get },
+ { :controller => "users/diary_comments", :action => "index", :user_display_name => "username" }
+ )
+
+ get "/user/username/diary/comments/1"
+ assert_redirected_to "/user/username/diary_comments"
+
+ get "/user/username/diary/comments"
+ assert_redirected_to "/user/username/diary_comments"
+ end
+
+ def test_index
+ user = create(:user)
+ other_user = create(:user)
+ suspended_user = create(:user, :suspended)
+ deleted_user = create(:user, :deleted)
+
+ # Test a user with no comments
+ get user_diary_comments_path(user)
+ assert_response :success
+ assert_template :index
+ assert_select "h4", :html => "No comments"
+
+ # Test a user with a comment
+ create(:diary_comment, :user => other_user)
+
+ get user_diary_comments_path(other_user)
+ assert_response :success
+ assert_template :index
+ assert_dom "a[href='#{user_path(other_user)}']", :text => other_user.display_name
+ assert_select "table.table-striped tbody" do
+ assert_select "tr", :count => 1
+ end
+
+ # Test a suspended user
+ get user_diary_comments_path(suspended_user)
+ assert_response :not_found
+
+ # Test a deleted user
+ get user_diary_comments_path(deleted_user)
+ assert_response :not_found
+ end
+
+ def test_index_invalid_paged
+ user = create(:user)
+
+ %w[-1 0 fred].each do |id|
+ get user_diary_comments_path(user, :before => id)
+ assert_redirected_to :controller => "/errors", :action => :bad_request
+
+ get user_diary_comments_path(user, :after => id)
+ assert_redirected_to :controller => "/errors", :action => :bad_request
+ end
+ end
+ end
+end
assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
- assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
+ assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary_comments']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
assert_select "a[href^='/user/#{ERB::Util.u(blocked_user.display_name)}/history']", 1
assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/traces']", 1
assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary']", 1
- assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary/comments']", 1
+ assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary_comments']", 1
assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/account']", 0
assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks']", 1
assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks_by']", 0
assert_select "a[href^='/user/#{ERB::Util.u(moderator_user.display_name)}/history']", 1
assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/traces']", 1
assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary']", 1
- assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary/comments']", 1
+ assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary_comments']", 1
assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/account']", 0
assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks']", 0
assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks_by']", 1
assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
assert_select "a[href='/traces/mine']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
- assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
+ assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary_comments']", 1
assert_select "a[href='/account/edit']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
- assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
+ assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary_comments']", 1
assert_select "a[href='/account/edit']", 0
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0