From b76ae638462ab0f673e5915986070518dd3f9ad3 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 19 Aug 2021 09:08:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-2-stable-ee --- .../dropdown_widget/dropdown_widget.stories.js | 27 +++ .../dropdown/dropdown_widget/dropdown_widget.vue | 165 +++++++++++++ .../components/filtered_search_bar/constants.js | 12 +- .../filtered_search_bar_root.vue | 9 +- .../filtered_search_bar/filtered_search_utils.js | 9 + .../filtered_search_bar/tokens/author_token.vue | 22 +- .../filtered_search_bar/tokens/base_token.vue | 63 +++-- .../filtered_search_bar/tokens/branch_token.vue | 100 +++----- .../filtered_search_bar/tokens/emoji_token.vue | 109 ++++----- .../filtered_search_bar/tokens/epic_token.vue | 16 +- .../filtered_search_bar/tokens/iteration_token.vue | 99 +++----- .../filtered_search_bar/tokens/label_token.vue | 18 +- .../filtered_search_bar/tokens/milestone_token.vue | 97 +++----- .../filtered_search_bar/tokens/weight_token.vue | 56 +++-- .../vue_shared/components/markdown/header.vue | 235 ++++++++++--------- .../components/markdown/toolbar_button.vue | 17 +- .../paginated_table_with_search_and_tabs.vue | 4 +- .../vue_shared/components/papa_parse_alert.vue | 44 ++++ .../project_selector/project_selector.vue | 7 +- .../vue_shared/components/remove_member_modal.vue | 116 --------- .../dropdown_contents_labels_view.vue | 3 + .../sidebar/labels_select_vue/dropdown_title.vue | 5 +- .../labels_select_vue/labels_select_root.vue | 5 +- .../sidebar/labels_select_vue/store/actions.js | 9 +- .../labels_select_vue/store/mutation_types.js | 2 + .../sidebar/labels_select_vue/store/mutations.js | 20 +- .../sidebar/labels_select_vue/store/state.js | 1 + .../labels_select_widget/dropdown_contents.vue | 34 ++- .../dropdown_contents_labels_view.vue | 260 +++++++++++++-------- .../labels_select_widget/dropdown_title.vue | 5 +- .../graphql/project_labels.query.graphql | 12 + .../labels_select_widget/labels_select_root.vue | 34 ++- .../sidebar/labels_select_widget/store/actions.js | 22 -- .../labels_select_widget/store/mutation_types.js | 8 - .../labels_select_widget/store/mutations.js | 21 -- .../components/sidebar/todo_toggle/todo_button.vue | 18 +- .../components/sidebar/todo_toggle/utils.js | 16 ++ .../components/user_avatar/user_avatar_link.vue | 6 + .../vue_shared/components/user_date.vue | 10 +- .../vue_shared/components/web_ide_link.vue | 36 ++- 40 files changed, 963 insertions(+), 789 deletions(-) create mode 100644 app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.stories.js create mode 100644 app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue create mode 100644 app/assets/javascripts/vue_shared/components/papa_parse_alert.vue delete mode 100644 app/assets/javascripts/vue_shared/components/remove_member_modal.vue create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/project_labels.query.graphql (limited to 'app/assets/javascripts/vue_shared/components') diff --git a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.stories.js b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.stories.js new file mode 100644 index 00000000000..eeed5e9dc3a --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.stories.js @@ -0,0 +1,27 @@ +/* eslint-disable @gitlab/require-i18n-strings */ + +import { __ } from '~/locale'; +import DropdownWidget from './dropdown_widget.vue'; + +export default { + component: DropdownWidget, + title: 'vue_shared/components/dropdown/dropdown_widget/dropdown_widget', +}; + +const Template = (args, { argTypes }) => ({ + components: { DropdownWidget }, + props: Object.keys(argTypes), + template: '', +}); + +export const Default = Template.bind({}); +Default.args = { + options: [ + { id: 'gid://gitlab/Milestone/-1', title: __('Any Milestone') }, + { id: 'gid://gitlab/Milestone/0', title: __('No Milestone') }, + { id: 'gid://gitlab/Milestone/-2', title: __('Upcoming') }, + { id: 'gid://gitlab/Milestone/-3', title: __('Started') }, + ], + selectText: 'Select', + searchText: 'Search', +}; diff --git a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue new file mode 100644 index 00000000000..7859ef85dd8 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue @@ -0,0 +1,165 @@ + + + diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js index 994ce6a762a..2e9634819a0 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js @@ -2,10 +2,14 @@ import { __ } from '~/locale'; export const DEBOUNCE_DELAY = 200; export const MAX_RECENT_TOKENS_SIZE = 3; +export const WEIGHT_TOKEN_SUGGESTIONS_SIZE = 21; export const FILTER_NONE = 'None'; export const FILTER_ANY = 'Any'; export const FILTER_CURRENT = 'Current'; +export const FILTER_UPCOMING = 'Upcoming'; +export const FILTER_STARTED = 'Started'; +export const FILTER_NONE_ANY = [FILTER_NONE, FILTER_ANY]; export const OPERATOR_IS = '='; export const OPERATOR_IS_TEXT = __('is'); @@ -24,11 +28,9 @@ export const DEFAULT_ITERATIONS = DEFAULT_NONE_ANY.concat([ { value: FILTER_CURRENT, text: __(FILTER_CURRENT) }, ]); -export const DEFAULT_LABELS = [DEFAULT_LABEL_NONE, DEFAULT_LABEL_ANY]; - export const DEFAULT_MILESTONES = DEFAULT_NONE_ANY.concat([ - { value: 'Upcoming', text: __('Upcoming') }, // eslint-disable-line @gitlab/require-i18n-strings - { value: 'Started', text: __('Started') }, // eslint-disable-line @gitlab/require-i18n-strings + { value: FILTER_UPCOMING, text: __(FILTER_UPCOMING) }, + { value: FILTER_STARTED, text: __(FILTER_STARTED) }, ]); export const SortDirection = { @@ -36,12 +38,14 @@ export const SortDirection = { ascending: 'ascending', }; +export const FILTERED_SEARCH_LABELS = 'labels'; export const FILTERED_SEARCH_TERM = 'filtered-search-term'; export const TOKEN_TITLE_AUTHOR = __('Author'); export const TOKEN_TITLE_ASSIGNEE = __('Assignee'); export const TOKEN_TITLE_MILESTONE = __('Milestone'); export const TOKEN_TITLE_LABEL = __('Label'); +export const TOKEN_TITLE_TYPE = __('Type'); export const TOKEN_TITLE_MY_REACTION = __('My-Reaction'); export const TOKEN_TITLE_CONFIDENTIAL = __('Confidential'); export const TOKEN_TITLE_ITERATION = __('Iteration'); diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue index 5ab287150f2..9dc5c5db276 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue @@ -16,7 +16,7 @@ import createFlash from '~/flash'; import { __ } from '~/locale'; import { SortDirection } from './constants'; -import { stripQuotes, uniqueTokens } from './filtered_search_utils'; +import { filterEmptySearchTerm, stripQuotes, uniqueTokens } from './filtered_search_utils'; export default { components: { @@ -223,9 +223,14 @@ export default { // Put any searches that may have come in before // we fetched the saved searches ahead of the already saved ones - const resultantSearches = this.recentSearchesStore.setRecentSearches( + let resultantSearches = this.recentSearchesStore.setRecentSearches( this.recentSearchesStore.state.recentSearches.concat(searches), ); + // If visited URL has search params, add them to recent search store + if (filterEmptySearchTerm(this.filterValue).length) { + resultantSearches = this.recentSearchesStore.addRecentSearch(this.filterValue); + } + this.recentSearchesService.save(resultantSearches); this.recentSearches = resultantSearches; }); diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js index 571d24b50cf..6573f366b52 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js @@ -247,3 +247,12 @@ export function setTokenValueToRecentlyUsed(recentSuggestionsStorageKey, tokenVa ); } } + +/** + * Removes `FILTERED_SEARCH_TERM` tokens with empty data + * + * @param filterTokens array of filtered search tokens + * @return {Array} array of filtered search tokens + */ +export const filterEmptySearchTerm = (filterTokens = []) => + filterTokens.filter((token) => token.type === FILTERED_SEARCH_TERM && token.value.data); diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue index a25a19a006c..ae5d3965de1 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue @@ -31,19 +31,25 @@ export default { data() { return { authors: this.config.initialAuthors || [], - defaultAuthors: this.config.defaultAuthors || [DEFAULT_LABEL_ANY], - preloadedAuthors: this.config.preloadedAuthors || [], loading: false, }; }, + computed: { + defaultAuthors() { + return this.config.defaultAuthors || [DEFAULT_LABEL_ANY]; + }, + preloadedAuthors() { + return this.config.preloadedAuthors || []; + }, + }, methods: { - getActiveAuthor(authors, currentValue) { - return authors.find((author) => author.username.toLowerCase() === currentValue); + getActiveAuthor(authors, data) { + return authors.find((author) => author.username.toLowerCase() === data.toLowerCase()); }, getAvatarUrl(author) { return author.avatarUrl || author.avatar_url; }, - fetchAuthorBySearchTerm(searchTerm) { + fetchAuthors(searchTerm) { this.loading = true; const fetchPromise = this.config.fetchPath ? this.config.fetchAuthors(this.config.fetchPath, searchTerm) @@ -76,11 +82,11 @@ export default { :active="active" :suggestions-loading="loading" :suggestions="authors" - :fn-active-token-value="getActiveAuthor" + :get-active-token-value="getActiveAuthor" :default-suggestions="defaultAuthors" :preloaded-suggestions="preloadedAuthors" :recent-suggestions-storage-key="config.recentSuggestionsStorageKey" - @fetch-suggestions="fetchAuthorBySearchTerm" + @fetch-suggestions="fetchAuthors" v-on="$listeners" >