diff --git a/ee/app/assets/javascripts/pages/groups/epics/index/index.js b/ee/app/assets/javascripts/pages/groups/epics/index/index.js index 3c1dfb628c8283f942f40f038474c6b2b0248fb3..1dc2103f33c1ed3611441d6f1fc380b76fa17163 100644 --- a/ee/app/assets/javascripts/pages/groups/epics/index/index.js +++ b/ee/app/assets/javascripts/pages/groups/epics/index/index.js @@ -1,5 +1,15 @@ -import initEpicsList from 'ee/epics_list/epics_list_bundle'; - -initEpicsList({ - mountPointSelector: '#js-epics-list', -}); +if (gon.features.workItemEpicsList && gon.features.namespaceLevelWorkItems) { + import(/* webpackChunkName: 'workItemsList' */ '~/work_items/list') + .then(({ mountWorkItemsListApp }) => { + mountWorkItemsListApp(); + }) + .catch(() => {}); +} else { + import(/* webpackChunkName: 'epicsList' */ 'ee/epics_list/epics_list_bundle') + .then(({ default: initEpicsList }) => { + initEpicsList({ + mountPointSelector: '#js-epics-list', + }); + }) + .catch(() => {}); +} diff --git a/ee/app/controllers/groups/epics_controller.rb b/ee/app/controllers/groups/epics_controller.rb index 152f883b711c09bbf0d1f594bd6deeb39d508dac..53bef6b1d4427db6d9a0d3a5c53b2d6c716d5a4e 100644 --- a/ee/app/controllers/groups/epics_controller.rb +++ b/ee/app/controllers/groups/epics_controller.rb @@ -23,10 +23,14 @@ class Groups::EpicsController < Groups::ApplicationController push_force_frontend_feature_flag(:namespace_level_work_items, epic_work_items_enabled?) end + before_action only: :index do + push_frontend_feature_flag(:work_item_epics_list, @group) + push_force_frontend_feature_flag(:namespace_level_work_items, epic_work_items_enabled?) + end + feature_category :portfolio_management urgency :default, [:show, :new, :realtime_changes] urgency :low, [:discussions] - def show respond_to do |format| format.html do @@ -42,6 +46,14 @@ def new @noteable = Epic.new end + def index + if Feature.enabled?(:work_item_epics_list, @group) && epic_work_items_enabled? + render 'work_items_index' + else + render 'index' + end + end + def create @epic = ::Epics::CreateService.new(group: @group, current_user: current_user, params: epic_params).execute diff --git a/ee/app/views/groups/epics/work_items_index.html.haml b/ee/app/views/groups/epics/work_items_index.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..707c8b83ed9ed435a3ba723dc222dd5610750b4b --- /dev/null +++ b/ee/app/views/groups/epics/work_items_index.html.haml @@ -0,0 +1,4 @@ +- page_title _("Epics") +- add_page_specific_style 'page_bundles/issuable_list' + +.js-work-items-list-root{ data: work_items_list_data(@group, current_user).merge(work_item_type: 'EPIC') } diff --git a/ee/config/feature_flags/wip/work_item_epics_list.yml b/ee/config/feature_flags/wip/work_item_epics_list.yml new file mode 100644 index 0000000000000000000000000000000000000000..771ce66a64eaea65f8b40b86249f9b7586aad8c4 --- /dev/null +++ b/ee/config/feature_flags/wip/work_item_epics_list.yml @@ -0,0 +1,9 @@ +--- +name: work_item_epics_list +feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/471578 +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/159604 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/473073 +milestone: '17.3' +group: group::product planning +type: wip +default_enabled: false diff --git a/ee/spec/features/epics/delete_epic_spec.rb b/ee/spec/features/epics/delete_epic_spec.rb index fba5ebdaf823ac7b21d852f42e249497aebb1858..e57b8780a4a16eb2ebef7099358f586e4e32cdb3 100644 --- a/ee/spec/features/epics/delete_epic_spec.rb +++ b/ee/spec/features/epics/delete_epic_spec.rb @@ -12,7 +12,8 @@ before do stub_licensed_features(epics: true) - stub_feature_flags(work_item_epics: false, namespace_level_work_items: false, work_item_epics_rollout: false) + stub_feature_flags(work_item_epics: false, namespace_level_work_items: false, work_item_epics_rollout: false, + work_item_epics_list: false) sign_in(user) end diff --git a/ee/spec/features/epics/epics_list_spec.rb b/ee/spec/features/epics/epics_list_spec.rb index b5b96cb230faa19f5a49e90448266975131dd5a3..a0e376ef56f03d6a082195be2ffab27bac7ba075 100644 --- a/ee/spec/features/epics/epics_list_spec.rb +++ b/ee/spec/features/epics/epics_list_spec.rb @@ -15,7 +15,7 @@ before do stub_licensed_features(epics: true) - stub_feature_flags(work_item_epics: false, namespace_level_work_items: false, work_item_epics_rollout: false) + stub_feature_flags(work_item_epics: false, namespace_level_work_items: false, work_item_epics_rollout: false, work_item_epics_list: false) sign_in(user) end @@ -223,6 +223,37 @@ end end end + + context 'when work_item_epics_list is enabled' do + let_it_be(:epic_work_item_1) do + create(:work_item, :epic_with_legacy_epic, namespace: group, title: "WorkItem Epic 1", assignees: [user]) + end + + let_it_be(:epic_work_item_2) do + create(:work_item, :epic_with_legacy_epic, namespace: group, title: "WorkItem Epic 2", assignees: [user]) + end + + before do + stub_feature_flags(work_item_epics: true, work_item_epics_rollout: true, work_item_epics_list: true) + end + + it 'renders work item epics' do + visit group_epics_path(group) + + # We create a synced epic work item for each epic and legacy epic for each WI epic. + # We therefore expect 6 epics (4 legacy epics and their synced work item + 2 work item epics) + expect(page).to have_selector('.issue', count: 6) + expect(page).to have_link(epic_work_item_1.title) + expect(page).to have_link(epic_work_item_2.title) + end + + it 'displays epic assignees' do + visit group_epics_path(group) + + expect(page.find("#issuable_#{epic_work_item_1.id}")).to have_link("Assigned to #{user.name}") + expect(page.find("#issuable_#{epic_work_item_2.id}")).to have_link("Assigned to #{user.name}") + end + end end describe 'within a sub-group group' do