From 0dfb5e6745e5a3c0e495ee16a440554c9270cf18 Mon Sep 17 00:00:00 2001 From: Coung Ngo Date: Wed, 5 May 2021 18:55:30 +0100 Subject: [PATCH 1/4] Add epic filter token to issues page refactor Added behind `vue_issues_list` feature flag defaulted to off, as part of an ongoing refactor from Haml. `epic_token.vue` was also changed to be more in line with the other filtered search tokens: - Before, it received a value that was either an epic iid or a string in the format , and received two separate functions for getting epics - After, it was simplified to receive only an epic id/iid, and receive only one function for getting epics https://gitlab.com/gitlab-org/gitlab/-/issues/322755 --- .../components/issues_list_app.vue | 25 ++++++++ .../javascripts/issues_list/constants.js | 10 +++ app/assets/javascripts/issues_list/index.js | 2 + .../filtered_search_bar/tokens/epic_token.vue | 61 +++++-------------- .../roadmap/mixins/filtered_search_mixin.js | 13 ++-- ee/app/helpers/ee/issues_helper.rb | 4 ++ .../components/roadmap_filters_spec.js | 2 +- ee/spec/helpers/ee/issues_helper_spec.rb | 6 +- .../filtered_search_bar/mock_data.js | 2 +- .../tokens/epic_token_spec.js | 29 --------- 10 files changed, 67 insertions(+), 87 deletions(-) diff --git a/app/assets/javascripts/issues_list/components/issues_list_app.vue b/app/assets/javascripts/issues_list/components/issues_list_app.vue index 142438bec216f1..d443f5b4b1daf7 100644 --- a/app/assets/javascripts/issues_list/components/issues_list_app.vue +++ b/app/assets/javascripts/issues_list/components/issues_list_app.vue @@ -37,6 +37,7 @@ import { __ } from '~/locale'; import { DEFAULT_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants'; import AuthorToken from '~/vue_shared/components/filtered_search_bar/tokens/author_token.vue'; import EmojiToken from '~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue'; +import EpicToken from '~/vue_shared/components/filtered_search_bar/tokens/epic_token.vue'; import IterationToken from '~/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue'; import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue'; import MilestoneToken from '~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue'; @@ -87,6 +88,9 @@ export default { exportCsvPath: { default: '', }, + groupEpicsPath: { + default: '', + }, hasBlockedIssuesFeature: { default: false, }, @@ -241,6 +245,17 @@ export default { }); } + if (this.groupEpicsPath) { + tokens.push({ + type: 'epic_id', + title: __('Epic'), + icon: 'epic', + token: EpicToken, + unique: true, + fetchEpics: this.fetchEpics, + }); + } + if (this.hasIssueWeightsFeature) { tokens.push({ type: 'weight', @@ -306,6 +321,16 @@ export default { fetchEmojis(search) { return this.fetchWithCache(this.autocompleteAwardEmojisPath, 'emojis', 'name', search); }, + async fetchEpics(search) { + const epics = await this.fetchWithCache(this.groupEpicsPath, 'epics'); + if (!search) { + return epics.slice(0, MAX_LIST_SIZE); + } + const number = Number(search); + return Number.isNaN(number) + ? fuzzaldrinPlus.filter(epics, search, { key: 'title' }) + : epics.filter((epic) => epic.id === number); + }, fetchLabels(search) { return this.fetchWithCache(this.projectLabelsPath, 'labels', 'title', search); }, diff --git a/app/assets/javascripts/issues_list/constants.js b/app/assets/javascripts/issues_list/constants.js index 3b01d0df523be6..88820a40d1b2d5 100644 --- a/app/assets/javascripts/issues_list/constants.js +++ b/app/assets/javascripts/issues_list/constants.js @@ -324,6 +324,16 @@ export const filters = { }, }, }, + epic_id: { + apiParam: { + [OPERATOR_IS]: 'epic_id', + [OPERATOR_IS_NOT]: 'not[epic_id]', + }, + urlParam: { + [OPERATOR_IS]: 'epic_id', + [OPERATOR_IS_NOT]: 'not[epic_id]', + }, + }, weight: { apiParam: { [OPERATOR_IS]: { diff --git a/app/assets/javascripts/issues_list/index.js b/app/assets/javascripts/issues_list/index.js index d543643b00333e..c4bd62bce5956d 100644 --- a/app/assets/javascripts/issues_list/index.js +++ b/app/assets/javascripts/issues_list/index.js @@ -85,6 +85,7 @@ export function mountIssuesListApp() { emptyStateSvgPath, endpoint, exportCsvPath, + groupEpicsPath, hasBlockedIssuesFeature, hasIssuableHealthStatusFeature, hasIssues, @@ -121,6 +122,7 @@ export function mountIssuesListApp() { canBulkUpdate: parseBoolean(canBulkUpdate), emptyStateSvgPath, endpoint, + groupEpicsPath, hasBlockedIssuesFeature: parseBoolean(hasBlockedIssuesFeature), hasIssuableHealthStatusFeature: parseBoolean(hasIssuableHealthStatusFeature), hasIssues: parseBoolean(hasIssues), diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue index 101c7150c55f34..ecd83835a21598 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue @@ -1,9 +1,7 @@ -- GitLab From f91d28a06ba5c357b699c81037a8e88082cb4753 Mon Sep 17 00:00:00 2001 From: Coung Ngo Date: Fri, 7 May 2021 14:08:05 +0100 Subject: [PATCH 3/4] Add None/Any to epic token --- .../javascripts/issues_list/constants.js | 18 ++++++++++++---- .../filtered_search_bar/tokens/epic_token.vue | 21 +++++++++++++++++-- .../roadmap/mixins/filtered_search_mixin.js | 1 + .../components/roadmap_filters_spec.js | 1 + spec/frontend/issues_list/mock_data.js | 12 +++++++++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/issues_list/constants.js b/app/assets/javascripts/issues_list/constants.js index 88820a40d1b2d5..c0441758558c9f 100644 --- a/app/assets/javascripts/issues_list/constants.js +++ b/app/assets/javascripts/issues_list/constants.js @@ -326,12 +326,22 @@ export const filters = { }, epic_id: { apiParam: { - [OPERATOR_IS]: 'epic_id', - [OPERATOR_IS_NOT]: 'not[epic_id]', + [OPERATOR_IS]: { + [NORMAL_FILTER]: 'epic_id', + [SPECIAL_FILTER]: 'epic_id', + }, + [OPERATOR_IS_NOT]: { + [NORMAL_FILTER]: 'not[epic_id]', + }, }, urlParam: { - [OPERATOR_IS]: 'epic_id', - [OPERATOR_IS_NOT]: 'not[epic_id]', + [OPERATOR_IS]: { + [NORMAL_FILTER]: 'epic_id', + [SPECIAL_FILTER]: 'epic_id', + }, + [OPERATOR_IS_NOT]: { + [NORMAL_FILTER]: 'not[epic_id]', + }, }, }, weight: { diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue index b5760ca52b9c60..1450807b11dc13 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue @@ -1,12 +1,18 @@