Commit 55f4ddad authored by Mehdi Lahmam's avatar Mehdi Lahmam
Browse files

Add an option to list only archived projects

Closes #35994
parent d4b3f2fbf9c8
...@@ -43,7 +43,13 @@ def by_last_repository_check_failed(items) ...@@ -43,7 +43,13 @@ def by_last_repository_check_failed(items)
end end
def by_archived(items) def by_archived(items)
items.non_archived unless params[:archived].present? if params[:archived] == 'only'
items.archived
elsif params[:archived].blank?
items.non_archived
else
items
end
end end
def by_personal(items) def by_personal(items)
......
...@@ -125,9 +125,18 @@ def sort(items) ...@@ -125,9 +125,18 @@ def sort(items)
end end
def by_archived(projects) def by_archived(projects)
# Back-compatibility with the places where `params[:archived]` can be set explicitly to `false` if params[:non_archived]
params[:non_archived] = !Gitlab::Utils.to_boolean(params[:archived]) if params.key?(:archived) projects.non_archived
elsif params.key?(:archived) # Back-compatibility with the places where `params[:archived]` can be set explicitly to `false`
params[:non_archived] ? projects.non_archived : projects if params[:archived] == 'only'
projects.archived
elsif Gitlab::Utils.to_boolean(params[:archived])
projects
else
projects.non_archived
end
else
projects
end
end end
end end
...@@ -247,6 +247,7 @@ class Project < ActiveRecord::Base ...@@ -247,6 +247,7 @@ class Project < ActiveRecord::Base
scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) } scope :joined, ->(user) { where('namespace_id != ?', user.namespace_id) }
scope :starred_by, ->(user) { joins(:users_star_projects).where('users_star_projects.user_id': user.id) } scope :starred_by, ->(user) { joins(:users_star_projects).where('users_star_projects.user_id': user.id) }
scope :visible_to_user, ->(user) { where(id: user.authorized_projects.select(:id).reorder(nil)) } scope :visible_to_user, ->(user) { where(id: user.authorized_projects.select(:id).reorder(nil)) }
scope :archived, -> { where(archived: true) }
scope :non_archived, -> { where(archived: false) } scope :non_archived, -> { where(archived: false) }
scope :for_milestones, ->(ids) { joins(:milestones).where('milestones.id' => ids).distinct } scope :for_milestones, ->(ids) { joins(:milestones).where('milestones.id' => ids).distinct }
scope :with_push, -> { joins(:events).where('events.action = ?', Event::PUSHED) } scope :with_push, -> { joins(:events).where('events.action = ?', Event::PUSHED) }
......
...@@ -15,8 +15,11 @@ ...@@ -15,8 +15,11 @@
= link_to filter_projects_path(archived: nil), class: ("is-active" unless params[:archived].present?) do = link_to filter_projects_path(archived: nil), class: ("is-active" unless params[:archived].present?) do
Hide archived projects Hide archived projects
%li %li
= link_to filter_projects_path(archived: true), class: ("is-active" if params[:archived].present?) do = link_to filter_projects_path(archived: true), class: ("is-active" if Gitlab::Utils.to_boolean(params[:archived])) do
Show archived projects Show archived projects
%li
= link_to filter_projects_path(archived: 'only'), class: ("is-active" if params[:archived] == 'only') do
Show archived projects only
- if current_user - if current_user
%li.divider %li.divider
%li %li
......
---
title: Add an option to list only archived projects
merge_request: 13492
author: Mehdi Lahmam (@mehlah)
type: added
...@@ -36,6 +36,14 @@ ...@@ -36,6 +36,14 @@
expect(page).to have_content(archived_project.name) expect(page).to have_content(archived_project.name)
expect(page).to have_xpath("//span[@class='label label-warning']", text: 'archived') expect(page).to have_xpath("//span[@class='label label-warning']", text: 'archived')
end end
it 'renders only archived projects', js: true do
find(:css, '#sort-projects-dropdown').click
click_link 'Show archived projects only'
expect(page).to have_content(archived_project.name)
expect(page).not_to have_content(project.name)
end
end end
describe "GET /admin/projects/:namespace_id/:id" do describe "GET /admin/projects/:namespace_id/:id" do
......
...@@ -26,6 +26,13 @@ ...@@ -26,6 +26,13 @@
expect(page).to have_link(archived_project.name) expect(page).to have_link(archived_project.name)
end end
it 'renders only archived projects' do
click_link 'Show archived projects only'
expect(page).to have_content(archived_project.name)
expect(page).not_to have_content(project.name)
end
it 'searchs archived projects', :js do it 'searchs archived projects', :js do
click_button 'Last updated' click_button 'Last updated'
click_link 'Show archived projects' click_link 'Show archived projects'
......
...@@ -118,6 +118,12 @@ ...@@ -118,6 +118,12 @@
it { is_expected.to match_array([archived_project, shared_project, public_project, internal_project, private_project]) } it { is_expected.to match_array([archived_project, shared_project, public_project, internal_project, private_project]) }
end end
context 'archived=only' do
let(:params) { { archived: 'only' } }
it { is_expected.to eq([archived_project]) }
end
end end
context 'filter by personal' do context 'filter by personal' do
......
...@@ -123,6 +123,12 @@ ...@@ -123,6 +123,12 @@
it { is_expected.to match_array([public_project, internal_project, archived_project]) } it { is_expected.to match_array([public_project, internal_project, archived_project]) }
end end
describe 'filter by archived only' do
let(:params) { { archived: 'only' } }
it { is_expected.to eq([archived_project]) }
end
describe 'filter by archived for backward compatibility' do describe 'filter by archived for backward compatibility' do
let(:params) { { archived: false } } let(:params) { { archived: false } }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment