diff --git a/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue b/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue index 5cc3c552bf8898f9613b3811655c688748c5f167..124f2ab23b94e5149a57408ac2d203b34fc73ace 100644 --- a/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue +++ b/app/assets/javascripts/sidebar/components/sidebar_dropdown.vue @@ -29,6 +29,7 @@ import { import { issuableAttributesQueries } from 'ee_else_ce/sidebar/queries/constants'; import { createAlert } from '~/alert'; import { PathIdSeparator } from '~/related_issues/constants'; +import { WORK_ITEM_TYPE_ENUM_EPIC } from '~/work_items/constants'; export default { noAttributeId, @@ -123,6 +124,10 @@ export default { includeWorkItems: this.showWorkItemEpics, }; + if (this.showWorkItemEpics) { + variables.types = [WORK_ITEM_TYPE_ENUM_EPIC]; + } + if (epicIidPattern.test(this.searchTerm)) { const matches = this.searchTerm.match(epicIidPattern); variables.iidStartsWith = matches.groups.iid; @@ -222,12 +227,7 @@ export default { @show="handleShow" @shown="setFocus" > - <gl-search-box-by-type - v-if="!showWorkItemEpics" - ref="search" - v-model="searchTerm" - :placeholder="__('Search')" - /> + <gl-search-box-by-type ref="search" v-model="searchTerm" :placeholder="__('Search')" /> <gl-dropdown-item :data-testid="`no-${formatIssuableAttribute.kebab}-item`" is-check-item diff --git a/ee/app/assets/javascripts/sidebar/queries/group_epics.query.graphql b/ee/app/assets/javascripts/sidebar/queries/group_epics.query.graphql index 61740ff4c56a0d804b2618505d83925f48485530..4e89da3ac79c22f1a76b9ba4b7437ab569cb0157 100644 --- a/ee/app/assets/javascripts/sidebar/queries/group_epics.query.graphql +++ b/ee/app/assets/javascripts/sidebar/queries/group_epics.query.graphql @@ -7,6 +7,7 @@ query issueEpics( $in: [IssuableSearchableField!] $iidStartsWith: String $includeWorkItems: Boolean! + $types: [IssueType!] ) { workspace: group(fullPath: $fullPath) { id @@ -23,7 +24,7 @@ query issueEpics( state } } - workItems @include(if: $includeWorkItems) { + workItems(types: $types) @include(if: $includeWorkItems) { nodes { id title diff --git a/ee/spec/features/issues/epic_in_issue_sidebar_spec.rb b/ee/spec/features/issues/epic_in_issue_sidebar_spec.rb index 5b6596b1ef43cad5be8da7f929548bb951bca4db..24dc92237ffd9381fdd9aec4a3c57dcbd2f4ef82 100644 --- a/ee/spec/features/issues/epic_in_issue_sidebar_spec.rb +++ b/ee/spec/features/issues/epic_in_issue_sidebar_spec.rb @@ -25,7 +25,6 @@ before do group.add_owner(user) - # disable work item search until work items filters are available stub_feature_flags(display_work_item_epic_issue_sidebar: false) sign_in user @@ -55,6 +54,7 @@ expect(page).to have_content epic1.title expect(page).to have_content epic2.title expect(page).to have_content epic3.title + expect(page).not_to have_content work_item_epic.title end end end @@ -170,6 +170,11 @@ click_edit aggregate_failures do + expect(page).to have_selector('.gl-dropdown-contents .gl-dropdown-item', count: 5) + expect(page).to have_content 'No epic' + expect(page).to have_content epic1.title + expect(page).to have_content epic2.title + expect(page).to have_content epic3.title expect(page).to have_content work_item_epic.title end end diff --git a/ee/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js b/ee/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js index 642d9941ddda2534ee7a0725ef39bc55170dc183..55b564d532660681f04daf051d43b92abad4ac85 100644 --- a/ee/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js +++ b/ee/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js @@ -1,4 +1,4 @@ -import { GlDropdown, GlFormInput, GlSearchBoxByType } from '@gitlab/ui'; +import { GlDropdown, GlFormInput } from '@gitlab/ui'; import { mount } from '@vue/test-utils'; import Vue from 'vue'; import VueApollo from 'vue-apollo'; @@ -19,7 +19,7 @@ import { extendedWrapper } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; import { createAlert } from '~/alert'; import { TYPE_ISSUE } from '~/issues/constants'; -import { WORK_ITEM_TYPE_VALUE_EPIC } from '~/work_items/constants'; +import { WORK_ITEM_TYPE_VALUE_EPIC, WORK_ITEM_TYPE_ENUM_EPIC } from '~/work_items/constants'; import { clickEdit, search } from '../helpers'; import { @@ -51,7 +51,6 @@ describe('SidebarDropdownWidget', () => { const findSidebarDropdown = () => wrapper.findComponent(SidebarDropdown); const findPopoverCta = () => wrapper.findByTestId('confirm-edit-cta'); const findPopoverCancel = () => wrapper.findByTestId('confirm-edit-cancel'); - const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType); const waitForDropdown = async () => { /** This sequence is important to wait for @@ -108,6 +107,7 @@ describe('SidebarDropdownWidget', () => { describe('with mock apollo', () => { let error; + const mockSearchTerm = 'foobar'; beforeEach(() => { jest.spyOn(Sentry, 'captureException'); @@ -155,8 +155,6 @@ describe('SidebarDropdownWidget', () => { let groupEpicsSpy; describe('when a user is searching epics', () => { - const mockSearchTerm = 'foobar'; - beforeEach(async () => { groupEpicsSpy = jest.fn().mockResolvedValueOnce(emptyGroupEpicsResponse); await createComponentWithApollo({ groupEpicsSpy }); @@ -301,15 +299,6 @@ describe('SidebarDropdownWidget', () => { .mockResolvedValue(mockSetWorkItemEpicNullMutationResponse); const groupWorkItemEpicsSpy = jest.fn().mockResolvedValue(mockGroupWorkItemEpicsResponse); - it('search textbox is not displayed', async () => { - await createComponentWithApollo({ - showWorkItemEpics: true, - }); - - await clickEdit(wrapper); - expect(findSearchBox().exists()).toBe(false); - }); - describe('when hasParent is true', () => { beforeEach(async () => { await createComponentWithApollo({ @@ -322,6 +311,20 @@ describe('SidebarDropdownWidget', () => { await clickEdit(wrapper); }); + it('sends a groupEpics query with the entered search term "foo" and in TITLE param', async () => { + await search(wrapper, mockSearchTerm); + + expect(groupWorkItemEpicsSpy).toHaveBeenCalledWith({ + fullPath: mockIssue.groupPath, + sort: 'TITLE_ASC', + state: 'opened', + title: mockSearchTerm, + includeWorkItems: true, + in: 'TITLE', + types: [WORK_ITEM_TYPE_ENUM_EPIC], + }); + }); + it('calls work item query to fetch current work item epic', () => { expect(currentEpicHasParentSpy).toHaveBeenCalled(); expect(currentWorkItemEpicSpy).toHaveBeenCalled();