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)