From b76ed623d7d525975079e7c06aff73458feba29d Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 17:06:53 +0300 Subject: [PATCH 1/7] Create issue reporters template --- app/views/issues/_page.html.erb | 7 +------ app/views/issues/reporters/_reporters.html.erb | 6 ++++++ config/locales/en.yml | 4 +++- 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 app/views/issues/reporters/_reporters.html.erb diff --git a/app/views/issues/_page.html.erb b/app/views/issues/_page.html.erb index 9681704a1..225517c9d 100644 --- a/app/views/issues/_page.html.erb +++ b/app/views/issues/_page.html.erb @@ -25,12 +25,7 @@ <%= link_to reportable_title(issue.reportable), reportable_url(issue.reportable) %> <%= link_to issue.reported_user.display_name, issue.reported_user if issue.reported_user %> - <% @unique_reporters[issue.id][:users].each do |reporter| %> - <%= link_to reporter.display_name, reporter, :class => "d-block text-truncate", :title => reporter.display_name %> - <% end %> - <% if @unique_reporters[issue.id][:count] > 3 %> -

<%= t ".more_reporters", :count => @unique_reporters[issue.id][:count] - 3 %>

- <% end %> + <%= render :partial => "issues/reporters/reporters", :locals => { :issue => issue } %> <% if issue.user_updated %> diff --git a/app/views/issues/reporters/_reporters.html.erb b/app/views/issues/reporters/_reporters.html.erb new file mode 100644 index 000000000..bf29e55c0 --- /dev/null +++ b/app/views/issues/reporters/_reporters.html.erb @@ -0,0 +1,6 @@ + <% @unique_reporters[issue.id][:users].each do |reporter| %> + <%= link_to reporter.display_name, reporter, :class => "d-block text-truncate", :title => reporter.display_name %> + <% end %> + <% if @unique_reporters[issue.id][:count] > 3 %> +

<%= t ".more_reporters", :count => @unique_reporters[issue.id][:count] - 3 %>

+ <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 093827ebd..fd9a7e60d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1538,7 +1538,6 @@ en: reports_count: one: "%{count} Report" other: "%{count} Reports" - more_reporters: "and %{count} more" reported_item: Reported Item states: ignored: Ignored @@ -1581,6 +1580,9 @@ en: reportable_title: diary_comment: "%{entry_title}, comment #%{comment_id}" note: "Note #%{note_id}" + reporters: + reporters: + more_reporters: "and %{count} more" issue_comments: create: comment_created: Your comment was successfully created From 34970acc5ed321ceade725f400c1fbfc662b58b3 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 17:21:05 +0300 Subject: [PATCH 2/7] Add unique reporters limit variable --- app/controllers/issues_controller.rb | 3 ++- app/views/issues/reporters/_reporters.html.erb | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 298f7c374..640317ce7 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -45,11 +45,12 @@ class IssuesController < ApplicationController @issues, @newer_issues_id, @older_issues_id = get_page_items(@issues, :limit => @params[:limit]) + @unique_reporters_limit = 3 @unique_reporters = @issues.each_with_object({}) do |issue, reporters| user_ids = issue.reports.order(:created_at => :desc).pluck(:user_id).uniq reporters[issue.id] = { :count => user_ids.size, - :users => User.in_order_of(:id, user_ids.first(3)) + :users => User.in_order_of(:id, user_ids.first(@unique_reporters_limit)) } end diff --git a/app/views/issues/reporters/_reporters.html.erb b/app/views/issues/reporters/_reporters.html.erb index bf29e55c0..ea3861709 100644 --- a/app/views/issues/reporters/_reporters.html.erb +++ b/app/views/issues/reporters/_reporters.html.erb @@ -1,6 +1,6 @@ <% @unique_reporters[issue.id][:users].each do |reporter| %> <%= link_to reporter.display_name, reporter, :class => "d-block text-truncate", :title => reporter.display_name %> <% end %> - <% if @unique_reporters[issue.id][:count] > 3 %> -

<%= t ".more_reporters", :count => @unique_reporters[issue.id][:count] - 3 %>

+ <% if @unique_reporters_limit && @unique_reporters[issue.id][:count] > @unique_reporters_limit %> +

<%= t ".more_reporters", :count => @unique_reporters[issue.id][:count] - @unique_reporters_limit %>

<% end %> From a440afc604becf167e2a2666dec29435ff2751c4 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 17:47:45 +0300 Subject: [PATCH 3/7] Add empty issue reporters page --- .../issues/reporters_controller.rb | 17 ++++ app/views/issues/reporters/index.html.erb | 0 config/routes.rb | 1 + .../issues/reporters_controller_test.rb | 98 +++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 app/controllers/issues/reporters_controller.rb create mode 100644 app/views/issues/reporters/index.html.erb create mode 100644 test/controllers/issues/reporters_controller_test.rb diff --git a/app/controllers/issues/reporters_controller.rb b/app/controllers/issues/reporters_controller.rb new file mode 100644 index 000000000..0bc0695fc --- /dev/null +++ b/app/controllers/issues/reporters_controller.rb @@ -0,0 +1,17 @@ +module Issues + class ReportersController < ApplicationController + layout "site" + + before_action :authorize_web + before_action :set_locale + before_action :check_database_readable + + authorize_resource :issue + + def index + @issue = Issue.visible_to(current_user).find(params[:issue_id]) + rescue ActiveRecord::RecordNotFound + redirect_to :controller => "/errors", :action => "not_found" + end + end +end diff --git a/app/views/issues/reporters/index.html.erb b/app/views/issues/reporters/index.html.erb new file mode 100644 index 000000000..e69de29bb diff --git a/config/routes.rb b/config/routes.rb index 8d42db69b..ec78f6ffd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -375,6 +375,7 @@ OpenStreetMap::Application.routes.draw do # issues and reports resources :issues do resources :comments, :controller => :issue_comments + resources :reporters, :module => :issues, :only => :index member do post "resolve" post "assign" diff --git a/test/controllers/issues/reporters_controller_test.rb b/test/controllers/issues/reporters_controller_test.rb new file mode 100644 index 000000000..06cfba3c1 --- /dev/null +++ b/test/controllers/issues/reporters_controller_test.rb @@ -0,0 +1,98 @@ +require "test_helper" + +module Issues + class DataControllerTest < ActionDispatch::IntegrationTest + ## + # test all routes which lead to this controller + def test_routes + assert_routing( + { :path => "/issues/1/reporters", :method => :get }, + { :controller => "issues/reporters", :action => "index", :issue_id => "1" } + ) + end + + def test_index_missing_issue_as_moderator + session_for(create(:moderator_user)) + get issue_reporters_path(999111) + + assert_redirected_to :controller => "/errors", :action => :not_found + end + + def test_index_missing_issue_as_administrator + session_for(create(:administrator_user)) + get issue_reporters_path(999111) + + assert_redirected_to :controller => "/errors", :action => :not_found + end + + def test_index_assigned_to_moderator_as_unauthorized + issue = create(:issue, :assigned_role => "moderator") + + get issue_reporters_path(issue) + + assert_redirected_to login_path(:referer => issue_reporters_path(issue)) + end + + def test_index_assigned_to_moderator_as_regular_user + issue = create(:issue, :assigned_role => "moderator") + + session_for(create(:user)) + get issue_reporters_path(issue) + + assert_redirected_to :controller => "/errors", :action => :forbidden + end + + def test_index_assigned_to_moderator_as_administrator + issue = create(:issue, :assigned_role => "moderator") + + session_for(create(:administrator_user)) + get issue_reporters_path(issue) + + assert_redirected_to :controller => "/errors", :action => :not_found + end + + def test_index_assigned_to_moderator_as_moderator + issue = create(:issue, :assigned_role => "moderator") + + session_for(create(:moderator_user)) + get issue_reporters_path(issue) + + assert_response :success + end + + def test_index_assigned_to_administrator_as_unauthorized + issue = create(:issue, :assigned_role => "administrator") + + get issue_reporters_path(issue) + + assert_redirected_to login_path(:referer => issue_reporters_path(issue)) + end + + def test_index_assigned_to_administrator_as_regular_user + issue = create(:issue, :assigned_role => "administrator") + + session_for(create(:user)) + get issue_reporters_path(issue) + + assert_redirected_to :controller => "/errors", :action => :forbidden + end + + def test_index_assigned_to_administrator_as_moderator + issue = create(:issue, :assigned_role => "administrator") + + session_for(create(:moderator_user)) + get issue_reporters_path(issue) + + assert_redirected_to :controller => "/errors", :action => :not_found + end + + def test_index_assigned_to_administrator_as_administrator + issue = create(:issue, :assigned_role => "administrator") + + session_for(create(:administrator_user)) + get issue_reporters_path(issue) + + assert_response :success + end + end +end From 474c7edad5b524e411c28e34b439ad1142b3c476 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 17:53:11 +0300 Subject: [PATCH 4/7] Add link to issue reporters page --- app/views/issues/reporters/_reporters.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/issues/reporters/_reporters.html.erb b/app/views/issues/reporters/_reporters.html.erb index ea3861709..2ce4f6c19 100644 --- a/app/views/issues/reporters/_reporters.html.erb +++ b/app/views/issues/reporters/_reporters.html.erb @@ -2,5 +2,9 @@ <%= link_to reporter.display_name, reporter, :class => "d-block text-truncate", :title => reporter.display_name %> <% end %> <% if @unique_reporters_limit && @unique_reporters[issue.id][:count] > @unique_reporters_limit %> -

<%= t ".more_reporters", :count => @unique_reporters[issue.id][:count] - @unique_reporters_limit %>

+

+ <%= link_to t(".more_reporters", :count => @unique_reporters[issue.id][:count] - @unique_reporters_limit), + issue_reporters_path(issue), + :class => "link-body-emphasis" %> +

<% end %> From 1633671aee590d0b9b5886e56ca425594a72823e Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 17:58:05 +0300 Subject: [PATCH 5/7] Add contents to issue reporters page --- app/controllers/issues/reporters_controller.rb | 8 ++++++++ app/views/issues/reporters/index.html.erb | 5 +++++ config/locales/en.yml | 2 ++ 3 files changed, 15 insertions(+) diff --git a/app/controllers/issues/reporters_controller.rb b/app/controllers/issues/reporters_controller.rb index 0bc0695fc..78d9e2cc8 100644 --- a/app/controllers/issues/reporters_controller.rb +++ b/app/controllers/issues/reporters_controller.rb @@ -10,6 +10,14 @@ module Issues def index @issue = Issue.visible_to(current_user).find(params[:issue_id]) + + user_ids = @issue.reports.order(:created_at => :desc).pluck(:user_id).uniq + @unique_reporters = { + @issue.id => { + :count => user_ids.size, + :users => User.in_order_of(:id, user_ids) + } + } rescue ActiveRecord::RecordNotFound redirect_to :controller => "/errors", :action => "not_found" end diff --git a/app/views/issues/reporters/index.html.erb b/app/views/issues/reporters/index.html.erb index e69de29bb..88b33946e 100644 --- a/app/views/issues/reporters/index.html.erb +++ b/app/views/issues/reporters/index.html.erb @@ -0,0 +1,5 @@ +<% content_for :heading do %> +

<%= t ".title", :issue_id => @issue.id %>

+<% end %> + +<%= render :partial => "reporters", :locals => { :issue => @issue } %> diff --git a/config/locales/en.yml b/config/locales/en.yml index fd9a7e60d..4120c96e5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1581,6 +1581,8 @@ en: diary_comment: "%{entry_title}, comment #%{comment_id}" note: "Note #%{note_id}" reporters: + index: + title: "Issue #%{issue_id} Reporters" reporters: more_reporters: "and %{count} more" issue_comments: From 28c581307e31d4826130955f36a69d062e11f38b Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 18:01:10 +0300 Subject: [PATCH 6/7] Wrap reporting users in frame --- app/views/issues/reporters/_reporters.html.erb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/views/issues/reporters/_reporters.html.erb b/app/views/issues/reporters/_reporters.html.erb index 2ce4f6c19..d426cad33 100644 --- a/app/views/issues/reporters/_reporters.html.erb +++ b/app/views/issues/reporters/_reporters.html.erb @@ -1,3 +1,4 @@ +<%= turbo_frame_tag "#{dom_id(issue)}_reporters", :data => { :turbo => false } do %> <% @unique_reporters[issue.id][:users].each do |reporter| %> <%= link_to reporter.display_name, reporter, :class => "d-block text-truncate", :title => reporter.display_name %> <% end %> @@ -5,6 +6,8 @@

<%= link_to t(".more_reporters", :count => @unique_reporters[issue.id][:count] - @unique_reporters_limit), issue_reporters_path(issue), - :class => "link-body-emphasis" %> + :class => "link-body-emphasis", + :data => { :turbo => true } %>

<% end %> +<% end %> From ff3d04a100f1ae9aa19537d8a02a04f863c58494 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 7 Mar 2025 18:08:21 +0300 Subject: [PATCH 7/7] Send only reporters frame on frame requests --- app/controllers/issues/reporters_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/issues/reporters_controller.rb b/app/controllers/issues/reporters_controller.rb index 78d9e2cc8..b6513f443 100644 --- a/app/controllers/issues/reporters_controller.rb +++ b/app/controllers/issues/reporters_controller.rb @@ -18,6 +18,8 @@ module Issues :users => User.in_order_of(:id, user_ids) } } + + render :partial => "reporters", :locals => { :issue => @issue } if turbo_frame_request? rescue ActiveRecord::RecordNotFound redirect_to :controller => "/errors", :action => "not_found" end