Commit 0032ee27 authored by Ash McKenzie's avatar Ash McKenzie

Merge branch 'ss/add-issuables-list-to-projects' into 'master'

Add Vue Issuables List to Project List

Closes #220970

See merge request gitlab-org/gitlab!34317
parents afca7045 bb7112a4
...@@ -47,6 +47,7 @@ class Projects::IssuesController < Projects::ApplicationController ...@@ -47,6 +47,7 @@ class Projects::IssuesController < Projects::ApplicationController
before_action do before_action do
push_frontend_feature_flag(:vue_issuable_sidebar, project.group) push_frontend_feature_flag(:vue_issuable_sidebar, project.group)
push_frontend_feature_flag(:tribute_autocomplete, @project) push_frontend_feature_flag(:tribute_autocomplete, @project)
push_frontend_feature_flag(:vue_issuables_list, project)
end end
before_action only: :show do before_action only: :show do
...@@ -55,6 +56,10 @@ class Projects::IssuesController < Projects::ApplicationController ...@@ -55,6 +56,10 @@ class Projects::IssuesController < Projects::ApplicationController
push_frontend_feature_flag(:confidential_apollo_sidebar, @project) push_frontend_feature_flag(:confidential_apollo_sidebar, @project)
end end
before_action only: :index do
push_frontend_feature_flag(:scoped_labels, @project)
end
around_action :allow_gitaly_ref_name_caching, only: [:discussions] around_action :allow_gitaly_ref_name_caching, only: [:discussions]
respond_to :html respond_to :html
......
- empty_state_path = local_assigns.fetch(:empty_state_path, 'shared/empty_states/issues') - if Feature.enabled?(:vue_issuables_list, @project)
.js-issuables-list{ data: { endpoint: expose_url(api_v4_projects_issues_path(id: @project.id)),
%ul.content-list.issues-list.issuable-list{ class: ("manual-ordering" if @sort == 'relative_position') } 'can-bulk-edit': @can_bulk_update.to_json,
'empty-svg-path': image_path('illustrations/issues.svg'),
'sort-key': @sort } }
- else
- empty_state_path = local_assigns.fetch(:empty_state_path, 'shared/empty_states/issues')
%ul.content-list.issues-list.issuable-list{ class: ("manual-ordering" if @sort == 'relative_position') }
= render partial: "projects/issues/issue", collection: @issues = render partial: "projects/issues/issue", collection: @issues
- if @issues.blank? - if @issues.blank?
= render empty_state_path = render empty_state_path
- if @issues.present? - if @issues.present?
= paginate @issues, theme: "gitlab", total_pages: @total_pages = paginate @issues, theme: "gitlab", total_pages: @total_pages
...@@ -5,6 +5,10 @@ require 'spec_helper' ...@@ -5,6 +5,10 @@ require 'spec_helper'
RSpec.describe 'Issue weight', :js do RSpec.describe 'Issue weight', :js do
let(:project) { create(:project, :public) } let(:project) { create(:project, :public) }
before do
stub_feature_flags(vue_issuables_list: false)
end
it 'shows weight on issue list row' do it 'shows weight on issue list row' do
create(:issue, project: project, weight: 2) create(:issue, project: project, weight: 2)
......
...@@ -7,6 +7,8 @@ RSpec.describe 'Service Desk Issue Tracker', :js do ...@@ -7,6 +7,8 @@ RSpec.describe 'Service Desk Issue Tracker', :js do
let(:user) { create(:user) } let(:user) { create(:user) }
before do before do
stub_feature_flags(vue_issuables_list: false)
allow(License).to receive(:feature_available?).and_call_original allow(License).to receive(:feature_available?).and_call_original
allow(License).to receive(:feature_available?).with(:service_desk).and_return(true) allow(License).to receive(:feature_available?).with(:service_desk).and_return(true)
allow(Gitlab::IncomingEmail).to receive(:enabled?).and_return(true) allow(Gitlab::IncomingEmail).to receive(:enabled?).and_return(true)
......
...@@ -7,6 +7,8 @@ RSpec.describe 'Group empty states' do ...@@ -7,6 +7,8 @@ RSpec.describe 'Group empty states' do
let(:user) { create(:group_member, :developer, user: create(:user), group: group ).user } let(:user) { create(:group_member, :developer, user: create(:user), group: group ).user }
before do before do
stub_feature_flags(vue_issuables_list: false)
sign_in(user) sign_in(user)
end end
......
...@@ -2,13 +2,15 @@ ...@@ -2,13 +2,15 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe 'issuable list' do RSpec.describe 'issuable list', :js do
let(:project) { create(:project) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
issuable_types = [:issue, :merge_request] issuable_types = [:issue, :merge_request]
before do before do
stub_feature_flags(vue_issuables_list: false)
# something is going on
project.add_user(user, :developer) project.add_user(user, :developer)
sign_in(user) sign_in(user)
issuable_types.each { |type| create_issuables(type) } issuable_types.each { |type| create_issuables(type) }
......
...@@ -10,6 +10,10 @@ RSpec.describe 'Sort Issuable List' do ...@@ -10,6 +10,10 @@ RSpec.describe 'Sort Issuable List' do
let(:first_updated_issuable) { issuables.order_updated_asc.first } let(:first_updated_issuable) { issuables.order_updated_asc.first }
let(:last_updated_issuable) { issuables.order_updated_desc.first } let(:last_updated_issuable) { issuables.order_updated_desc.first }
before do
stub_feature_flags(vue_issuables_list: false)
end
context 'for merge requests' do context 'for merge requests' do
include MergeRequestHelpers include MergeRequestHelpers
......
...@@ -13,6 +13,9 @@ RSpec.describe 'Issues > Labels bulk assignment' do ...@@ -13,6 +13,9 @@ RSpec.describe 'Issues > Labels bulk assignment' do
context 'as an allowed user', :js do context 'as an allowed user', :js do
before do before do
# Make sure that issuables list FF is not turned on.
stub_feature_flags(vue_issuables_list: false)
project.add_maintainer(user) project.add_maintainer(user)
sign_in user sign_in user
......
...@@ -26,6 +26,8 @@ RSpec.describe 'Filter issues', :js do ...@@ -26,6 +26,8 @@ RSpec.describe 'Filter issues', :js do
end end
before do before do
stub_feature_flags(vue_issuables_list: false)
project.add_maintainer(user) project.add_maintainer(user)
create(:issue, project: project, author: user2, title: "Bug report 1") create(:issue, project: project, author: user2, title: "Bug report 1")
......
...@@ -8,6 +8,7 @@ RSpec.describe 'Multiple issue updating from issues#index', :js do ...@@ -8,6 +8,7 @@ RSpec.describe 'Multiple issue updating from issues#index', :js do
let!(:user) { create(:user)} let!(:user) { create(:user)}
before do before do
stub_feature_flags(vue_issuables_list: false)
project.add_maintainer(user) project.add_maintainer(user)
sign_in(user) sign_in(user)
end end
......
...@@ -7,6 +7,8 @@ RSpec.describe 'User filters issues' do ...@@ -7,6 +7,8 @@ RSpec.describe 'User filters issues' do
let_it_be(:project) { create(:project_empty_repo, :public) } let_it_be(:project) { create(:project_empty_repo, :public) }
before do before do
stub_feature_flags(vue_issuables_list: false)
%w[foobar barbaz].each do |title| %w[foobar barbaz].each do |title|
create(:issue, create(:issue,
author: user, author: user,
......
...@@ -7,6 +7,8 @@ RSpec.describe 'New issue breadcrumb' do ...@@ -7,6 +7,8 @@ RSpec.describe 'New issue breadcrumb' do
let(:user) { project.creator } let(:user) { project.creator }
before do before do
stub_feature_flags(vue_issuables_list: false)
sign_in(user) sign_in(user)
visit(new_project_issue_path(project)) visit(new_project_issue_path(project))
end end
......
...@@ -6,6 +6,10 @@ RSpec.describe 'Issues > User sees empty state' do ...@@ -6,6 +6,10 @@ RSpec.describe 'Issues > User sees empty state' do
let_it_be(:project) { create(:project, :public) } let_it_be(:project) { create(:project, :public) }
let_it_be(:user) { project.creator } let_it_be(:user) { project.creator }
before do
stub_feature_flags(vue_issuables_list: false)
end
shared_examples_for 'empty state with filters' do shared_examples_for 'empty state with filters' do
it 'user sees empty state with filters' do it 'user sees empty state with filters' do
create(:issue, author: user, project: project) create(:issue, author: user, project: project)
......
...@@ -16,6 +16,8 @@ RSpec.describe "User sorts issues" do ...@@ -16,6 +16,8 @@ RSpec.describe "User sorts issues" do
let_it_be(:later_due_milestone) { create(:milestone, project: project, due_date: '2013-12-12') } let_it_be(:later_due_milestone) { create(:milestone, project: project, due_date: '2013-12-12') }
before do before do
stub_feature_flags(vue_issuables_list: false)
create_list(:award_emoji, 2, :upvote, awardable: issue1) create_list(:award_emoji, 2, :upvote, awardable: issue1)
create_list(:award_emoji, 2, :downvote, awardable: issue2) create_list(:award_emoji, 2, :downvote, awardable: issue2)
create(:award_emoji, :downvote, awardable: issue1) create(:award_emoji, :downvote, awardable: issue1)
......
...@@ -9,6 +9,10 @@ RSpec.describe "User views issues" do ...@@ -9,6 +9,10 @@ RSpec.describe "User views issues" do
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
before do
stub_feature_flags(vue_issuables_list: false)
end
shared_examples "opens issue from list" do shared_examples "opens issue from list" do
it "opens issue" do it "opens issue" do
click_link(issue.title) click_link(issue.title)
...@@ -116,4 +120,24 @@ RSpec.describe "User views issues" do ...@@ -116,4 +120,24 @@ RSpec.describe "User views issues" do
context "when not signed in" do context "when not signed in" do
include_examples "public project" include_examples "public project"
end end
context 'when vue_issuables_list feature is enabled', :js do
before do
stub_feature_flags(vue_issuables_list: true)
end
context 'when signed in' do
before do
project.add_developer(user)
sign_in(user)
end
include_examples "public project"
include_examples "internal project"
end
context 'when not signed in' do
include_examples "public project"
end
end
end end
...@@ -13,6 +13,10 @@ RSpec.describe 'Issue prioritization' do ...@@ -13,6 +13,10 @@ RSpec.describe 'Issue prioritization' do
let(:label_4) { create(:label, title: 'label_4', project: project, priority: 4) } let(:label_4) { create(:label, title: 'label_4', project: project, priority: 4) }
let(:label_5) { create(:label, title: 'label_5', project: project) } # no priority let(:label_5) { create(:label, title: 'label_5', project: project) } # no priority
before do
stub_feature_flags(vue_issuables_list: false)
end
# According to https://gitlab.com/gitlab-org/gitlab-foss/issues/14189#note_4360653 # According to https://gitlab.com/gitlab-org/gitlab-foss/issues/14189#note_4360653
context 'when issues have one label' do context 'when issues have one label' do
it 'Are sorted properly' do it 'Are sorted properly' do
......
...@@ -6,6 +6,10 @@ RSpec.describe 'Projects > User sees sidebar' do ...@@ -6,6 +6,10 @@ RSpec.describe 'Projects > User sees sidebar' do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project, :private, public_builds: false, namespace: user.namespace) } let(:project) { create(:project, :private, public_builds: false, namespace: user.namespace) }
before do
stub_feature_flags(vue_issuables_list: false)
end
# NOTE: See documented behaviour https://design.gitlab.com/regions/navigation#contextual-navigation # NOTE: See documented behaviour https://design.gitlab.com/regions/navigation#contextual-navigation
context 'on different viewports', :js do context 'on different viewports', :js do
include MobileHelpers include MobileHelpers
......
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