diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 13:18:24 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 13:18:24 +0000 |
commit | 0653e08efd039a5905f3fa4f6e9cef9f5d2f799c (patch) | |
tree | 4dcc884cf6d81db44adae4aa99f8ec1233a41f55 /app/assets/javascripts/header_search/components/app.vue | |
parent | 744144d28e3e7fddc117924fef88de5d9674fe4c (diff) | |
download | gitlab-ce-0653e08efd039a5905f3fa4f6e9cef9f5d2f799c.tar.gz |
Add latest changes from gitlab-org/gitlab@14-3-stable-eev14.3.0-rc42
Diffstat (limited to 'app/assets/javascripts/header_search/components/app.vue')
-rw-r--r-- | app/assets/javascripts/header_search/components/app.vue | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue new file mode 100644 index 00000000000..580c27f6c61 --- /dev/null +++ b/app/assets/javascripts/header_search/components/app.vue @@ -0,0 +1,83 @@ +<script> +import { GlSearchBoxByType, GlOutsideDirective as Outside } from '@gitlab/ui'; +import { mapState, mapActions, mapGetters } from 'vuex'; +import { visitUrl } from '~/lib/utils/url_utility'; +import { __ } from '~/locale'; +import HeaderSearchDefaultItems from './header_search_default_items.vue'; +import HeaderSearchScopedItems from './header_search_scoped_items.vue'; + +export default { + name: 'HeaderSearchApp', + i18n: { + searchPlaceholder: __('Search or jump to...'), + }, + directives: { Outside }, + components: { + GlSearchBoxByType, + HeaderSearchDefaultItems, + HeaderSearchScopedItems, + }, + data() { + return { + showDropdown: false, + }; + }, + computed: { + ...mapState(['search']), + ...mapGetters(['searchQuery']), + searchText: { + get() { + return this.search; + }, + set(value) { + this.setSearch(value); + }, + }, + showSearchDropdown() { + return this.showDropdown && gon?.current_username; + }, + showDefaultItems() { + return !this.searchText; + }, + }, + methods: { + ...mapActions(['setSearch']), + openDropdown() { + this.showDropdown = true; + }, + closeDropdown() { + this.showDropdown = false; + }, + submitSearch() { + return visitUrl(this.searchQuery); + }, + }, +}; +</script> + +<template> + <section v-outside="closeDropdown" class="header-search gl-relative"> + <gl-search-box-by-type + v-model="searchText" + :debounce="500" + autocomplete="off" + :placeholder="$options.i18n.searchPlaceholder" + @focus="openDropdown" + @click="openDropdown" + @keydown.enter="submitSearch" + @keydown.esc="closeDropdown" + /> + <div + v-if="showSearchDropdown" + data-testid="header-search-dropdown-menu" + class="header-search-dropdown-menu gl-overflow-y-auto gl-absolute gl-left-0 gl-z-index-1 gl-w-full gl-bg-white gl-border-1 gl-rounded-base gl-border-solid gl-border-gray-200 gl-shadow-x0-y2-b4-s0" + > + <div class="header-search-dropdown-content gl-overflow-y-auto gl-py-2"> + <header-search-default-items v-if="showDefaultItems" /> + <template v-else> + <header-search-scoped-items /> + </template> + </div> + </div> + </section> +</template> |