From 77d0f2e436ce6eb5779cf243b11ac8b6f067eb7a Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Tue, 23 Jul 2024 18:59:40 -0600 Subject: [PATCH 1/7] Add Approved By token to the Vue MR list search bar filters --- app/assets/javascripts/issues/list/constants.js | 14 ++++++++++++++ .../list/components/merge_requests_list_app.vue | 16 ++++++++++++++++ .../queries/get_merge_requests.query.graphql | 2 ++ 3 files changed, 32 insertions(+) diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js index 94dbb39a4a4c5f..74c70c96d62ff7 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', + }, + [OPERATOR_NOT]: { + [NORMAL_FILTER]: 'not[approved_by]', + }, + }, + }, [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 907eb85575baad..8de9de7c36c0db 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,20 @@ 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, + unique: true, + }, { 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 037b242aa51b3c..add3cf55f98c0b 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 -- GitLab From 18425d48fb5107051dda40714f6cbd5ee4a81696 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 25 Jul 2024 15:59:58 -0600 Subject: [PATCH 2/7] Add tests for the approved by token --- .../list/components/merge_requests_list_app_spec.js | 5 +++++ 1 file changed, 5 insertions(+) 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 e59fd1debf1121..2232b2b61d212e 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: '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 }, -- GitLab From de2340f6e2b4f3f22be4974ac5fde67c84964f44 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 29 Aug 2024 12:13:50 -0600 Subject: [PATCH 3/7] Remove unique constraint from approved-by MR list filter --- .../merge_requests/list/components/merge_requests_list_app.vue | 1 - 1 file changed, 1 deletion(-) 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 8de9de7c36c0db..de00383ac3fc24 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 @@ -206,7 +206,6 @@ export default { recentSuggestionsStorageKey: `${this.fullPath}-merge_requests-recent-tokens-approved_by`, preloadedUsers, multiSelect: false, - unique: true, }, { type: TOKEN_TYPE_ASSIGNEE, -- GitLab From e5ac7c5d4964d11f15c561b72ee7d5b869397512 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 29 Aug 2024 12:28:11 -0600 Subject: [PATCH 4/7] Allow array of approver usernames --- .../list/queries/get_merge_requests.query.graphql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 add3cf55f98c0b..438d877a45e7c1 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,7 +7,7 @@ query getMergeRequests( $fullPath: ID! $sort: MergeRequestSort $state: MergeRequestState - $approvedBy: String + $approvedBy: [String] $assigneeUsernames: String $assigneeWildcardId: AssigneeWildcardId $reviewerUsername: String -- GitLab From aa5154ffbe336cebf216d9fd09d3229cde84b103 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 29 Aug 2024 12:55:54 -0600 Subject: [PATCH 5/7] Use correct (array) name for approved by URL parameter --- .../list/components/merge_requests_list_app_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2232b2b61d212e..2f558c03c5d0bf 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 @@ -157,7 +157,7 @@ describe('Merge requests list app', () => { describe('when all tokens are available', () => { const urlParams = { - approved_by: 'anthony', + 'approved_by_usernames[]': 'anthony', assignee_username: 'bob', reviewer_username: 'bill', draft: 'yes', -- GitLab From ee7943ebbedcde29ff2d37768aefda65b2e6993f Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 29 Aug 2024 22:54:15 -0600 Subject: [PATCH 6/7] Update specs to use the real parameter used by the token --- app/assets/javascripts/issues/list/constants.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js index 74c70c96d62ff7..45c8991e167cb2 100644 --- a/app/assets/javascripts/issues/list/constants.js +++ b/app/assets/javascripts/issues/list/constants.js @@ -156,10 +156,10 @@ export const filtersMap = { }, [URL_PARAM]: { [OPERATOR_IS]: { - [NORMAL_FILTER]: 'approved_by', + [NORMAL_FILTER]: 'approved_by_usernames[]', }, [OPERATOR_NOT]: { - [NORMAL_FILTER]: 'not[approved_by]', + [NORMAL_FILTER]: 'not[approved_by_usernames][]', }, }, }, -- GitLab From 96e398a5fe9db70603746a40f0c895bd76d7dcf7 Mon Sep 17 00:00:00 2001 From: Thomas Randolph Date: Thu, 29 Aug 2024 23:16:17 -0600 Subject: [PATCH 7/7] Make approved-by usernames not nullable --- .../list/queries/get_merge_requests.query.graphql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 438d877a45e7c1..e483ef97748ae4 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,7 +7,7 @@ query getMergeRequests( $fullPath: ID! $sort: MergeRequestSort $state: MergeRequestState - $approvedBy: [String] + $approvedBy: [String!] $assigneeUsernames: String $assigneeWildcardId: AssigneeWildcardId $reviewerUsername: String -- GitLab