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 e77d011b98b6762be6e51f83d5d0e84458ee9fe0..65cfdb79a9eadf1f77ec63494a2f1ab634724439 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 @@ -5,6 +5,7 @@ import { createAlert } from '~/alert'; import Api from '~/api'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; import { STATUS_ALL, STATUS_CLOSED, STATUS_OPEN, STATUS_MERGED } from '~/issues/constants'; +import axios from '~/lib/utils/axios_utils'; import { fetchPolicies } from '~/lib/graphql'; import { isPositiveInteger } from '~/lib/utils/number_utils'; import { scrollUp } from '~/lib/utils/scroll_utils'; @@ -30,6 +31,8 @@ import { TOKEN_TYPE_REVIEWER, TOKEN_TITLE_MILESTONE, TOKEN_TYPE_MILESTONE, + TOKEN_TITLE_MY_REACTION, + TOKEN_TYPE_MY_REACTION, TOKEN_TITLE_LABEL, TOKEN_TYPE_LABEL, TOKEN_TITLE_RELEASE, @@ -70,6 +73,8 @@ const MilestoneToken = () => const LabelToken = () => import('~/vue_shared/components/filtered_search_bar/tokens/label_token.vue'); const ReleaseToken = () => import('./tokens/release_client_search_token.vue'); +const EmojiToken = () => + import('~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue'); export default { name: 'MergeRequestsListApp', @@ -83,6 +88,7 @@ export default { MergeRequestMoreActionsDropdown, }, inject: [ + 'autocompleteAwardEmojisPath', 'fullPath', 'hasAnyMergeRequests', 'hasScopedLabelsFeature', @@ -180,17 +186,7 @@ export default { }, searchTokens() { const preloadedUsers = []; - - if (gon.current_user_id) { - preloadedUsers.push({ - id: convertToGraphQLId(TYPENAME_USER, gon.current_user_id), - name: gon.current_user_fullname, - username: gon.current_username, - avatar_url: gon.current_user_avatar_url, - }); - } - - return [ + const tokens = [ { type: TOKEN_TYPE_ASSIGNEE, title: TOKEN_TITLE_ASSIGNEE, @@ -299,6 +295,30 @@ export default { releasesEndpoint: this.releasesEndpoint, }, ]; + + if (gon.current_user_id) { + preloadedUsers.push({ + id: convertToGraphQLId(TYPENAME_USER, gon.current_user_id), + name: gon.current_user_fullname, + username: gon.current_username, + avatar_url: gon.current_user_avatar_url, + }); + } + + if (this.isSignedIn) { + tokens.push({ + type: TOKEN_TYPE_MY_REACTION, + title: TOKEN_TITLE_MY_REACTION, + icon: 'thumb-up', + token: EmojiToken, + operators: OPERATORS_IS_NOT, + unique: true, + fetchEmojis: this.fetchEmojis, + recentSuggestionsStorageKey: `${this.fullPath}-merge_requests-recent-tokens-my_reaction`, + }); + } + + return tokens; }, showPaginationControls() { return ( @@ -355,6 +375,9 @@ export default { }); }); }, + fetchEmojis() { + return axios.get(this.autocompleteAwardEmojisPath); + }, fetchLabelsWithFetchPolicy(search, fetchPolicy = fetchPolicies.CACHE_FIRST) { return this.$apollo .query({ diff --git a/app/assets/javascripts/merge_requests/list/index.js b/app/assets/javascripts/merge_requests/list/index.js index b702b99429db73920fb8b3166124f03a891f7ad1..71804416078078bf614bc8b7512eca9b615a6940 100644 --- a/app/assets/javascripts/merge_requests/list/index.js +++ b/app/assets/javascripts/merge_requests/list/index.js @@ -17,6 +17,7 @@ export async function mountMergeRequestListsApp() { Vue.use(VueRouter); const { + autocompleteAwardEmojisPath, fullPath, hasAnyMergeRequests, hasScopedLabelsFeature, @@ -46,6 +47,7 @@ export async function mountMergeRequestListsApp() { }), provide: { fullPath, + autocompleteAwardEmojisPath, hasAnyMergeRequests: parseBoolean(hasAnyMergeRequests), hasScopedLabelsFeature: parseBoolean(hasScopedLabelsFeature), initialSort, 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 3af02862e76061d9af68e6b276babd56314f4d92..037b242aa51b3cf6d0817fe23a36b97da631558e 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 @@ -17,6 +17,7 @@ query getMergeRequests( $releaseTag: String $milestoneTitle: String $milestoneWildcardId: MilestoneWildcardId + $myReactionEmoji: String $sourceBranches: [String!] $targetBranches: [String!] $not: MergeRequestsResolverNegatedParams @@ -40,6 +41,7 @@ query getMergeRequests( releaseTag: $releaseTag milestoneTitle: $milestoneTitle milestoneWildcardId: $milestoneWildcardId + myReactionEmoji: $myReactionEmoji sourceBranches: $sourceBranches targetBranches: $targetBranches not: $not 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 745c6fe250dc38f9ab47d4350203e323ff66b00c..5802462f258c9c18ea491b4e84a94184e4ea1768 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 @@ -13,6 +13,7 @@ import { TOKEN_TYPE_DRAFT, TOKEN_TYPE_LABEL, TOKEN_TYPE_MILESTONE, + TOKEN_TYPE_MY_REACTION, TOKEN_TYPE_SOURCE_BRANCH, TOKEN_TYPE_TARGET_BRANCH, TOKEN_TYPE_ASSIGNEE, @@ -51,6 +52,7 @@ function createComponent({ provide = {} } = {}) { wrapper = shallowMountExtended(MergeRequestsListApp, { provide: { + autocompleteAwardEmojisPath: 'pathy/pathface', fullPath: 'gitlab-org/gitlab', hasAnyMergeRequests: true, hasScopedLabelsFeature: false, @@ -136,6 +138,7 @@ describe('Merge requests list app', () => { { type: TOKEN_TYPE_SOURCE_BRANCH }, { type: TOKEN_TYPE_LABEL }, { type: TOKEN_TYPE_RELEASE }, + { type: TOKEN_TYPE_MY_REACTION }, ]); }); }); @@ -147,6 +150,7 @@ describe('Merge requests list app', () => { draft: 'yes', 'label_name[]': 'fluff', milestone_title: 'milestone', + my_reaction_emoji: '🔥', 'target_branches[]': 'branch-a', 'source_branches[]': 'branch-b', }; @@ -185,6 +189,7 @@ describe('Merge requests list app', () => { { type: TOKEN_TYPE_SOURCE_BRANCH }, { type: TOKEN_TYPE_LABEL }, { type: TOKEN_TYPE_RELEASE }, + { type: TOKEN_TYPE_MY_REACTION }, ]); }); @@ -195,6 +200,7 @@ describe('Merge requests list app', () => { { type: TOKEN_TYPE_DRAFT }, { type: TOKEN_TYPE_LABEL }, { type: TOKEN_TYPE_MILESTONE }, + { type: TOKEN_TYPE_MY_REACTION }, { type: TOKEN_TYPE_TARGET_BRANCH }, { type: TOKEN_TYPE_SOURCE_BRANCH }, ]);