diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 35f6c6ea..198cb999 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -11,7 +11,7 @@ jobs:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: secret
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Install Ruby
uses: ruby/setup-ruby@v1
with:
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 139a4bbf..72b73aae 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -294,7 +294,7 @@ TODO
}
.tabnav-tab {
- padding: 1em 2em;
+ padding: 1em 1.6em;
background: #fff;
color: #2E294E;
transition: background-color .3s ease-out;
diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss
index 9764e190..a8881cee 100644
--- a/app/assets/stylesheets/home.scss
+++ b/app/assets/stylesheets/home.scss
@@ -55,6 +55,11 @@
}
}
+.grey-emoji {
+ color: transparent;
+ text-shadow: 0 0 0 #aaa;
+}
+
table.dashboard-table, table.comments-table, table.toc-table{
margin-top: 1em;
width: 100%;
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index ad0c0443..9000738e 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -1,7 +1,7 @@
class HomeController < ApplicationController
before_action :require_user, only: %w(profile update_profile)
before_action :require_editor, only: %w(dashboard reviews incoming stats all in_progress)
- before_action :set_track, only: %w(all incoming in_progress)
+ before_action :set_track, only: %w(all incoming in_progress query_scoped)
# layout "dashboard", only: %w(dashboard reviews incoming stats all in_progress)
def index
@@ -78,9 +78,9 @@ def incoming
@pagy, @papers = pagy(incoming_scope.order(created_at: @order))
end
- load_pending_invitations_for_papers(@papers)
-
@editor = current_user.editor
+ set_votes_by_paper_from_editor(@editor, @papers)
+ load_pending_invitations_for_papers(@papers)
render template: "home/reviews"
end
@@ -98,6 +98,26 @@ def in_progress
@pagy, @papers = pagy(in_progress_scope.order(created_at: @order))
end
+ set_votes_by_paper_from_editor(@editor, @papers)
+ load_pending_invitations_for_papers(@papers)
+
+ render template: "home/reviews"
+ end
+
+ def query_scoped
+ in_progress_query_scoped = Paper.unscoped.in_progress.query_scoped
+ in_progress_query_scoped = in_progress_query_scoped.by_track(@track.id) if @track.present?
+
+ @editor = current_user.editor
+ @order = params[:order].to_s.end_with?("-asc") ? "asc" : "desc"
+
+ if params[:order].to_s.include?("active-")
+ @pagy, @papers = pagy(in_progress_query_scoped.order(last_activity: @order))
+ else
+ @pagy, @papers = pagy(in_progress_query_scoped.order(created_at: @order))
+ end
+
+ set_votes_by_paper_from_editor(@editor, @papers)
load_pending_invitations_for_papers(@papers)
render template: "home/reviews"
@@ -116,6 +136,7 @@ def all
@pagy, @papers = pagy(all_scope.order(created_at: @order))
end
+ set_votes_by_paper_from_editor(@editor, @papers)
load_pending_invitations_for_papers(@papers)
render template: "home/reviews"
@@ -153,6 +174,11 @@ def load_pending_invitations_for_papers(papers)
end
def set_track
- @track = Track.find(params[:track_id]) if params[:track_id].present?
- end
+ @track = Track.find(params[:track_id]) if params[:track_id].present?
+ end
+
+ def set_votes_by_paper_from_editor(editor, papers)
+ in_scope_papers = papers.select {|p| p.labels.keys.include?("query-scope")}
+ @votes_by_paper_from_editor = in_scope_papers.any? ? Vote.where(editor: editor).where(paper: in_scope_papers).index_by(&:paper_id) : {}
+ end
end
diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb
index 7cfec47c..0a04cd5b 100644
--- a/app/helpers/home_helper.rb
+++ b/app/helpers/home_helper.rb
@@ -27,11 +27,20 @@ def current_class?(test_path)
'tabnav-tab'
end
- def vote_summary(paper)
+ def vote_summary(paper, votes_by_paper)
if paper.labels.keys.include?("query-scope")
- capture do
- concat(content_tag(:small, "👍(#{paper.votes.in_scope.count}) / 👎 (#{paper.votes.out_of_scope.count})"))
+ summary = ""
+ vote = votes_by_paper[paper.id]
+ summary = if vote.nil?
+ content_tag(:small, "👍(#{paper.in_scope_votes.count}) / 👎 (#{paper.votes.out_of_scope.count})")
+ elsif vote.in_scope?
+ content_tag(:small, "👍(#{paper.in_scope_votes.count}) / 👎 (#{paper.out_of_scope_votes.count})".html_safe)
+ elsif vote.out_of_scope?
+ content_tag(:small, "👍(#{paper.in_scope_votes.count}) / 👎 (#{paper.out_of_scope_votes.count})".html_safe)
+ elsif vote.comment?
+ content_tag(:small, "👍(#{paper.in_scope_votes.count}) / 👎 (#{paper.out_of_scope_votes.count})".html_safe)
end
+ summary.html_safe
else
'OK'
end
diff --git a/app/models/editor.rb b/app/models/editor.rb
index be745acb..52f78b77 100644
--- a/app/models/editor.rb
+++ b/app/models/editor.rb
@@ -36,6 +36,14 @@ def category_list
categories.join(", ")
end
+ def status
+ if retired?
+ "Retired"
+ else
+ "Active"
+ end
+ end
+
def three_month_average
paper_count = self.papers.visible.since(3.months.ago).count
return sprintf("%.1f", paper_count / 3.0)
diff --git a/app/models/paper.rb b/app/models/paper.rb
index 41545d37..892af1c8 100644
--- a/app/models/paper.rb
+++ b/app/models/paper.rb
@@ -132,6 +132,7 @@ class Paper < ApplicationRecord
scope :search_import, -> { where(state: VISIBLE_STATES) }
scope :not_archived, -> { where('archived = ?', false) }
scope :by_track, -> (track_id) { where('track_id = ?', track_id) }
+ scope :query_scoped, -> { where("labels->>'query-scope' IS NOT NULL") }
before_create :set_sha, :set_last_activity
after_create :notify_editors, :notify_author
diff --git a/app/views/home/_menu.html.erb b/app/views/home/_menu.html.erb
index 8afd54f5..62125515 100644
--- a/app/views/home/_menu.html.erb
+++ b/app/views/home/_menu.html.erb
@@ -12,6 +12,9 @@
In progress papers
<%= raw Paper.unscoped.in_progress.count %>
<% end %>
+ <%= link_to dashboard_query_scoped_path(track_id: @track), class: current_class?(dashboard_query_scoped_path) do %>
+ 👍👎
+ <% end %>
<%= link_to dashboard_all_path(track_id: @track), class: current_class?(dashboard_all_path) do %>
All papers
<%= raw Paper.unscoped.all.count %>
@@ -21,7 +24,7 @@
<% end %>
- <% if [dashboard_incoming_path, dashboard_in_progress_path, dashboard_all_path].include?(request.path) && JournalFeatures.tracks? %>
+ <% if [dashboard_incoming_path, dashboard_in_progress_path, dashboard_query_scoped_path, dashboard_all_path].include?(request.path) && JournalFeatures.tracks? %>
<%= select_tag :track_id, options_from_collection_for_select(Track.all, "id", "name", params[:track_id].presence), include_blank: "All tracks", class: "form-control left", style: "font-size:81%", onchange: "top.location.href='?track_id=' + this.options[this.selectedIndex].value;" %>
diff --git a/app/views/home/reviews.html.erb b/app/views/home/reviews.html.erb
index ad1bbc8d..6addbc7d 100644
--- a/app/views/home/reviews.html.erb
+++ b/app/views/home/reviews.html.erb
@@ -58,7 +58,7 @@
<%= paper.state.titleize %> |
<%= link_to paper.title, paper_url(paper), title: paper.title, class: "d-inline-block text-truncate", style: "max-width: 450px;" %> Submitted <%= time_ago_in_words(paper.created_at) %> ago <%= pretty_labels_for(paper) %> |
<% unless params[:editor]%>
- <%= vote_summary(paper).html_safe %> |
+ <%= vote_summary(paper, @votes_by_paper_from_editor) %> |
<%= open_invites_for_paper(paper) %> |
<% end %>
<%= review_issue_links(paper) %> |
diff --git a/app/views/papers/show.json.jbuilder b/app/views/papers/show.json.jbuilder
index 23403bf3..90254b7a 100644
--- a/app/views/papers/show.json.jbuilder
+++ b/app/views/papers/show.json.jbuilder
@@ -10,7 +10,9 @@ if @paper.published?
json.year @paper.year
json.page @paper.page
json.authors @paper.metadata_authors
+ json.submitting_author @paper&.submitting_author&.pretty_github_username
json.editor @paper.metadata_editor
+ json.editor_status @paper&.editor&.status
if @paper.editor
json.editor_name @paper.editor.full_name
json.editor_url @paper.editor.url if @paper.editor.url
diff --git a/config/routes.rb b/config/routes.rb
index d96cd891..a3ab6278 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -78,6 +78,7 @@
get '/dashboard/all', to: "home#all", as: "dashboard_all"
get '/dashboard/incoming', to: "home#incoming", as: "dashboard_incoming"
get '/dashboard/in_progress', to: "home#in_progress", as: "dashboard_in_progress"
+ get '/dashboard/query_scoped', to: "home#query_scoped", as: "dashboard_query_scoped"
get '/dashboard', to: "home#dashboard"
get '/dashboard/*editor', to: "home#reviews"
diff --git a/spec/controllers/papers_controller_spec.rb b/spec/controllers/papers_controller_spec.rb
index c560de20..675e17c1 100644
--- a/spec/controllers/papers_controller_spec.rb
+++ b/spec/controllers/papers_controller_spec.rb
@@ -402,6 +402,8 @@
expect(parsed_response["state"]).to eq("accepted")
expect(parsed_response["software_repository"]).to eq("http://github.com/arfon/fidgit")
expect(parsed_response["editor"]).to eq("@arfon")
+ expect(parsed_response["editor_status"]).to eq("Active")
+ expect(parsed_response["submitting_author"]).to eq("@foobar")
expect(parsed_response["editor_name"]).to eq("Person McEditor")
expect(parsed_response["editor_orcid"]).to eq("0000-0000-0000-1234")
expect(parsed_response["doi"]).to eq("10.21105/resciencec.00000")
diff --git a/spec/models/paper_spec.rb b/spec/models/paper_spec.rb
index 23ae0664..ddf200b9 100644
--- a/spec/models/paper_spec.rb
+++ b/spec/models/paper_spec.rb
@@ -116,6 +116,17 @@
expect(track_A_papers.include?(paper_A1)).to be true
expect(track_A_papers.include?(paper_A2)).to be true
end
+
+ it "should find query scoped papers" do
+ paper_1, paper_2, paper_3, paper_4, paper_5 = create_list(:paper, 5)
+ paper_2.update labels: {"query-scope" => "FF0000"}
+ paper_4.update labels: {"query-scope" => "CC00CC"}
+
+ query_scoped_papers = Paper.query_scoped
+ expect(query_scoped_papers.size).to eq(2)
+ expect(query_scoped_papers.include?(paper_2)).to be true
+ expect(query_scoped_papers.include?(paper_4)).to be true
+ end
end
# GitHub stuff
diff --git a/spec/system/dashboard_spec.rb b/spec/system/dashboard_spec.rb
index 5fa5198a..0a1df439 100644
--- a/spec/system/dashboard_spec.rb
+++ b/spec/system/dashboard_spec.rb
@@ -44,9 +44,10 @@
before do
editor = create(:editor, login: "editor1")
@track = create(:track, name: "TestingTrack")
- create(:paper, state: "submitted", title: "Paper Submitted", editor: nil)
+ query_scoped_paper = create(:paper, state: "submitted", title: "Paper Submitted", labels:{"query-scope" => "C0C"}, editor: nil)
+ create(:in_scope_vote, editor: editor, paper: query_scoped_paper)
create(:paper, state: "under_review", title: "Paper Under Review", editor: editor)
- create(:paper, state: "review_pending", title: "Paper Review Pending No Editor", editor: nil, track: @track)
+ create(:paper, state: "review_pending", title: "Paper Review Pending No Editor", labels:{"query-scope" => "C0C"}, editor: nil, track: @track)
create(:paper, state: "review_pending", title: "Paper Review Pending With Editor", editor: editor, track: @track)
create(:accepted_paper, title: "Paper Accepted", editor: editor, track: @track)
create(:rejected_paper, title: "Paper Rejected")
@@ -74,6 +75,16 @@
expect(page).to_not have_content("Paper Rejected")
end
+ scenario "List query scoped papers" do
+ click_link "👍👎"
+ expect(page).to have_content("Paper Submitted")
+ expect(page).to have_content("Paper Review Pending No Editor")
+ expect(page).to_not have_content("Paper Under Review")
+ expect(page).to_not have_content("Paper Review Pending With Editor")
+ expect(page).to_not have_content("Paper Accepted")
+ expect(page).to_not have_content("Paper Rejected")
+ end
+
scenario "List all visible papers" do
click_link "All papers"
expect(page).to have_content("Paper Submitted")
@@ -112,7 +123,7 @@
end
end
- scenario "Dropdown is visible only in incoming/in_progress/all_papers tabs" do
+ scenario "Dropdown is visible only in incoming/in_progress/query_scoped/all_papers tabs" do
expect(page).to_not have_css("select#track_id")
visit dashboard_incoming_path
@@ -124,6 +135,9 @@
visit dashboard_in_progress_path
expect(page).to have_css("select#track_id")
+ visit dashboard_query_scoped_path
+ expect(page).to have_css("select#track_id")
+
visit "/dashboard"
expect(page).to_not have_css("select#track_id")
@@ -150,6 +164,15 @@
expect(page).to_not have_content("Paper Accepted")
expect(page).to_not have_content("Paper Rejected")
+ visit dashboard_query_scoped_path(track_id: @track.id)
+
+ expect(page).to_not have_content("Paper Submitted")
+ expect(page).to have_content("Paper Review Pending No Editor")
+ expect(page).to_not have_content("Paper Under Review")
+ expect(page).to_not have_content("Paper Review Pending With Editor")
+ expect(page).to_not have_content("Paper Accepted")
+ expect(page).to_not have_content("Paper Rejected")
+
visit dashboard_all_path(track_id: @track.id)