diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js index 94dbb39a4a4c5f1da0fec48848fd20a12fafc760..45c8991e167cb28d3dea46924054cb94c1102bba 100644 --- a/app/assets/javascripts/issues/list/constants.js +++ b/app/assets/javascripts/issues/list/constants.js @@ -11,6 +11,7 @@ import { OPERATOR_OR, OPERATOR_AFTER, OPERATOR_BEFORE, + TOKEN_TYPE_APPROVED_BY, TOKEN_TYPE_ASSIGNEE, TOKEN_TYPE_REVIEWER, TOKEN_TYPE_AUTHOR, @@ -149,6 +150,19 @@ export const filtersMap = { }, }, }, + [TOKEN_TYPE_APPROVED_BY]: { + [API_PARAM]: { + [NORMAL_FILTER]: 'approvedBy', + }, + [URL_PARAM]: { + [OPERATOR_IS]: { + [NORMAL_FILTER]: 'approved_by_usernames[]', + }, + [OPERATOR_NOT]: { + [NORMAL_FILTER]: 'not[approved_by_usernames][]', + }, + }, + }, [TOKEN_TYPE_AUTHOR]: { [API_PARAM]: { [NORMAL_FILTER]: 'authorUsername', diff --git a/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue b/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue index 907eb85575baad6372442d1bc444d28cfc1d28f3..de00383ac3fc24231598d1cb3e0dcb5f5ef8c8f8 100644 --- a/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue +++ b/app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue @@ -17,6 +17,8 @@ import { DEFAULT_PAGE_SIZE, mergeRequestListTabs } from '~/vue_shared/issuable/l import { OPERATORS_IS, OPERATORS_IS_NOT, + TOKEN_TITLE_APPROVED_BY, + TOKEN_TYPE_APPROVED_BY, TOKEN_TITLE_AUTHOR, TOKEN_TYPE_AUTHOR, TOKEN_TITLE_DRAFT, @@ -192,6 +194,19 @@ export default { searchTokens() { const preloadedUsers = []; const tokens = [ + { + type: TOKEN_TYPE_APPROVED_BY, + title: TOKEN_TITLE_APPROVED_BY, + icon: 'approval', + token: UserToken, + dataType: 'user', + operators: OPERATORS_IS_NOT, + fullPath: this.fullPath, + isProject: true, + recentSuggestionsStorageKey: `${this.fullPath}-merge_requests-recent-tokens-approved_by`, + preloadedUsers, + multiSelect: false, + }, { type: TOKEN_TYPE_ASSIGNEE, title: TOKEN_TITLE_ASSIGNEE, diff --git a/app/assets/javascripts/merge_requests/list/queries/get_merge_requests.query.graphql b/app/assets/javascripts/merge_requests/list/queries/get_merge_requests.query.graphql index 037b242aa51b3cf6d0817fe23a36b97da631558e..e483ef97748ae4a500be9942ac09c8386dd682eb 100644 --- a/app/assets/javascripts/merge_requests/list/queries/get_merge_requests.query.graphql +++ b/app/assets/javascripts/merge_requests/list/queries/get_merge_requests.query.graphql @@ -7,6 +7,7 @@ query getMergeRequests( $fullPath: ID! $sort: MergeRequestSort $state: MergeRequestState + $approvedBy: [String!] $assigneeUsernames: String $assigneeWildcardId: AssigneeWildcardId $reviewerUsername: String @@ -31,6 +32,7 @@ query getMergeRequests( mergeRequests( sort: $sort state: $state + approvedBy: $approvedBy assigneeUsername: $assigneeUsernames assigneeWildcardId: $assigneeWildcardId reviewerUsername: $reviewerUsername diff --git a/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js b/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js index e59fd1debf11216f5f4cbaead744ec94de9a81c9..2f558c03c5d0bf7f819bb6ddd73a06bc45d5cf36 100644 --- a/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js +++ b/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js @@ -10,6 +10,7 @@ import { STATUS_CLOSED, STATUS_OPEN, STATUS_MERGED } from '~/issues/constants'; import { TYPENAME_USER } from '~/graphql_shared/constants'; import { convertToGraphQLId } from '~/graphql_shared/utils'; import { + TOKEN_TYPE_APPROVED_BY, TOKEN_TYPE_AUTHOR, TOKEN_TYPE_DRAFT, TOKEN_TYPE_LABEL, @@ -139,6 +140,7 @@ describe('Merge requests list app', () => { it('does not have preloaded users when gon.current_user_id does not exist', () => { expect(findIssuableList().props('searchTokens')).toMatchObject([ + { type: TOKEN_TYPE_APPROVED_BY, preloadedUsers: [] }, { type: TOKEN_TYPE_ASSIGNEE }, { type: TOKEN_TYPE_REVIEWER, preloadedUsers: [] }, { type: TOKEN_TYPE_AUTHOR, preloadedUsers: [] }, @@ -155,6 +157,7 @@ describe('Merge requests list app', () => { describe('when all tokens are available', () => { const urlParams = { + 'approved_by_usernames[]': 'anthony', assignee_username: 'bob', reviewer_username: 'bill', draft: 'yes', @@ -190,6 +193,7 @@ describe('Merge requests list app', () => { ]; expect(findIssuableList().props('searchTokens')).toMatchObject([ + { type: TOKEN_TYPE_APPROVED_BY, preloadedUsers }, { type: TOKEN_TYPE_ASSIGNEE }, { type: TOKEN_TYPE_REVIEWER, preloadedUsers }, { type: TOKEN_TYPE_AUTHOR, preloadedUsers }, @@ -205,6 +209,7 @@ describe('Merge requests list app', () => { it('pre-displays tokens that are in the url search parameters', () => { expect(findIssuableList().props('initialFilterValue')).toMatchObject([ + { type: TOKEN_TYPE_APPROVED_BY }, { type: TOKEN_TYPE_ASSIGNEE }, { type: TOKEN_TYPE_REVIEWER }, { type: TOKEN_TYPE_DRAFT },