diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-11-16 00:07:25 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-11-16 00:07:25 +0300 |
commit | a7d47330045c163760517a49f5fd35854e089c6e (patch) | |
tree | 57b7695720db8c461c2ef82841ae9571c1e2b9dc /app | |
parent | a46bff51d5262a5c05c460f0c7c43a5f2405cd5d (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/search/index.js | 9 | ||||
-rw-r--r-- | app/assets/javascripts/search/store/state.js | 3 | ||||
-rw-r--r-- | app/assets/javascripts/search/topbar/components/app.vue | 83 | ||||
-rw-r--r-- | app/assets/javascripts/search/topbar/components/search_type_indicator.vue | 115 | ||||
-rw-r--r-- | app/assets/javascripts/search/topbar/constants.js | 6 | ||||
-rw-r--r-- | app/assets/javascripts/search/topbar/index.js | 3 | ||||
-rw-r--r-- | app/models/integrations/irker.rb | 8 | ||||
-rw-r--r-- | app/views/search/show.html.haml | 3 |
8 files changed, 183 insertions, 47 deletions
diff --git a/app/assets/javascripts/search/index.js b/app/assets/javascripts/search/index.js index dfb2c519c28..5879735d0f6 100644 --- a/app/assets/javascripts/search/index.js +++ b/app/assets/javascripts/search/index.js @@ -7,15 +7,24 @@ import createStore from './store'; import { initTopbar } from './topbar'; import { initBlobRefSwitcher } from './under_topbar'; +const topbarInitState = () => { + const el = document.getElementById('js-search-topbar'); + if (!el) return {}; + const { defaultBranchName } = el.dataset; + return { defaultBranchName }; +}; + export const initSearchApp = () => { syntaxHighlight(document.querySelectorAll('.js-search-results')); const query = queryToObject(window.location.search, { gatherArrays: true }); const { navigationJsonParsed: navigation, searchType } = sidebarInitState() || {}; + const { defaultBranchName } = topbarInitState() || {}; const store = createStore({ query, navigation, searchType, + defaultBranchName, }); initTopbar(store); diff --git a/app/assets/javascripts/search/store/state.js b/app/assets/javascripts/search/store/state.js index 9c38a230343..a0e4d8c5596 100644 --- a/app/assets/javascripts/search/store/state.js +++ b/app/assets/javascripts/search/store/state.js @@ -1,7 +1,7 @@ import { cloneDeep } from 'lodash'; import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from './constants'; -const createState = ({ query, navigation, searchType }) => ({ +const createState = ({ query, navigation, defaultBranchName, searchType }) => ({ urlQuery: cloneDeep(query), query, groups: [], @@ -21,6 +21,7 @@ const createState = ({ query, navigation, searchType }) => ({ }, searchLabelString: '', searchType, + defaultBranchName, }); export default createState; diff --git a/app/assets/javascripts/search/topbar/components/app.vue b/app/assets/javascripts/search/topbar/components/app.vue index 49e66492519..d9f824b6e18 100644 --- a/app/assets/javascripts/search/topbar/components/app.vue +++ b/app/assets/javascripts/search/topbar/components/app.vue @@ -7,6 +7,7 @@ import { parseBoolean } from '~/lib/utils/common_utils'; import MarkdownDrawer from '~/vue_shared/components/markdown_drawer/markdown_drawer.vue'; import { ZOEKT_SEARCH_TYPE, ADVANCED_SEARCH_TYPE } from '~/search/store/constants'; import { SYNTAX_OPTIONS_ADVANCED_DOCUMENT, SYNTAX_OPTIONS_ZOEKT_DOCUMENT } from '../constants'; +import SearchTypeIndicator from './search_type_indicator.vue'; import GroupFilter from './group_filter.vue'; import ProjectFilter from './project_filter.vue'; @@ -31,6 +32,7 @@ export default { GroupFilter, ProjectFilter, MarkdownDrawer, + SearchTypeIndicator, }, props: { groupInitialJson: { @@ -90,45 +92,50 @@ export default { </script> <template> - <section class="gl-p-5 gl-bg-gray-10 gl-border-b gl-border-t"> - <div class="search-page-form gl-lg-display-flex gl-flex-direction-column"> - <div class="gl-lg-display-flex gl-flex-direction-row gl-align-items-flex-end"> - <div class="gl-flex-grow-1 gl-mb-4 gl-lg-mb-0 gl-lg-mr-2"> - <div - class="gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-mb-0 gl-md-mb-4" - > - <label class="gl-mb-1 gl-md-pb-2">{{ $options.i18n.searchLabel }}</label> - <template v-if="showSyntaxOptions"> - <gl-button - category="tertiary" - variant="link" - size="small" - button-text-classes="gl-font-sm!" - @click="onToggleDrawer" - >{{ $options.i18n.syntaxOptionsLabel }} - </gl-button> - <markdown-drawer ref="markdownDrawer" :document-path="documentBasedOnSearchType" /> - </template> + <section> + <div class="gl-display-flex gl-flex-wrap gl-justify-content-end gl-pt-6 gl-pb-5"> + <search-type-indicator /> + </div> + <div class="gl-p-5 gl-bg-gray-10 gl-border-b gl-border-t"> + <div class="search-page-form gl-lg-display-flex gl-flex-direction-column"> + <div class="gl-lg-display-flex gl-flex-direction-row gl-align-items-flex-end"> + <div class="gl-flex-grow-1 gl-mb-4 gl-lg-mb-0 gl-lg-mr-2"> + <div + class="gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-mb-0 gl-md-mb-4" + > + <label class="gl-mb-1 gl-md-pb-2">{{ $options.i18n.searchLabel }}</label> + <template v-if="showSyntaxOptions"> + <gl-button + category="tertiary" + variant="link" + size="small" + button-text-classes="gl-font-sm!" + @click="onToggleDrawer" + >{{ $options.i18n.syntaxOptionsLabel }} + </gl-button> + <markdown-drawer ref="markdownDrawer" :document-path="documentBasedOnSearchType" /> + </template> + </div> + <gl-search-box-by-click + id="dashboard_search" + v-model="search" + name="search" + :placeholder="$options.i18n.searchPlaceholder" + @submit="applyQuery" + /> + </div> + <div v-if="showFilters" class="gl-mb-4 gl-lg-mb-0 gl-lg-mx-3"> + <label class="gl-display-block gl-mb-1 gl-md-pb-2">{{ + $options.i18n.groupFieldLabel + }}</label> + <group-filter :initial-data="groupInitialJson" /> + </div> + <div v-if="showFilters" class="gl-mb-4 gl-lg-mb-0 gl-lg-ml-3"> + <label class="gl-display-block gl-mb-1 gl-md-pb-2">{{ + $options.i18n.projectFieldLabel + }}</label> + <project-filter :initial-data="projectInitialJson" /> </div> - <gl-search-box-by-click - id="dashboard_search" - v-model="search" - name="search" - :placeholder="$options.i18n.searchPlaceholder" - @submit="applyQuery" - /> - </div> - <div v-if="showFilters" class="gl-mb-4 gl-lg-mb-0 gl-lg-mx-3"> - <label class="gl-display-block gl-mb-1 gl-md-pb-2">{{ - $options.i18n.groupFieldLabel - }}</label> - <group-filter :initial-data="groupInitialJson" /> - </div> - <div v-if="showFilters" class="gl-mb-4 gl-lg-mb-0 gl-lg-ml-3"> - <label class="gl-display-block gl-mb-1 gl-md-pb-2">{{ - $options.i18n.projectFieldLabel - }}</label> - <project-filter :initial-data="projectInitialJson" /> </div> </div> </div> diff --git a/app/assets/javascripts/search/topbar/components/search_type_indicator.vue b/app/assets/javascripts/search/topbar/components/search_type_indicator.vue new file mode 100644 index 00000000000..7520a878452 --- /dev/null +++ b/app/assets/javascripts/search/topbar/components/search_type_indicator.vue @@ -0,0 +1,115 @@ +<script> +// eslint-disable-next-line no-restricted-imports +import { mapState } from 'vuex'; +import { GlSprintf, GlLink, GlTooltipDirective } from '@gitlab/ui'; +import { s__, __ } from '~/locale'; +import { helpPagePath } from '~/helpers/help_page_helper'; +import { + ZOEKT_SEARCH_TYPE, + ADVANCED_SEARCH_TYPE, + BASIC_SEARCH_TYPE, +} from '~/search/store/constants'; +import { + ZOEKT_HELP_PAGE, + ADVANCED_SEARCH_HELP_PAGE, + ADVANCED_SEARCH_SYNTAX_HELP_ANCHOR, + ZOEKT_HELP_PAGE_SYNTAX_ANCHOR, +} from '../constants'; + +export default { + name: 'SearchTypeIndicator', + directives: { + GlTooltip: GlTooltipDirective, + }, + i18n: { + zoekt_enabled: s__( + 'GlobalSearch|%{linkStart}Exact code search (powered by Zoekt)%{linkEnd} is enabled', + ), + zoekt_disabled: s__( + 'GlobalSearch|%{linkStart}Exact code search (powered by Zoekt)%{linkEnd} is disabled since %{ref_elem} is not the default branch. %{docs_link}', + ), + advanced_enabled: __('%{linkStart}Advanced search%{linkEnd} is enabled.'), + advanced_disabled: __( + '%{linkStart}Exact code search (powered by Zoekt)%{linkEnd} is disabled since %{ref_elem} is not the default branch. %{docs_link}', + ), + more: __('Learn more.'), + }, + components: { + GlSprintf, + GlLink, + }, + computed: { + ...mapState(['searchType', 'defaultBranchName', 'query']), + zoektHelpUrl() { + return helpPagePath(ZOEKT_HELP_PAGE); + }, + zoektSyntaxHelpUrl() { + return helpPagePath(ZOEKT_HELP_PAGE, { + anchor: ZOEKT_HELP_PAGE_SYNTAX_ANCHOR, + }); + }, + advancedSearchHelpUrl() { + return helpPagePath(ADVANCED_SEARCH_HELP_PAGE); + }, + advancedSearchSyntaxHelpUrl() { + return helpPagePath(ADVANCED_SEARCH_HELP_PAGE, { + anchor: ADVANCED_SEARCH_SYNTAX_HELP_ANCHOR, + }); + }, + isZoekt() { + return this.searchType === ZOEKT_SEARCH_TYPE; + }, + isAdvancedSearch() { + return this.searchType === ADVANCED_SEARCH_TYPE; + }, + isEnabled() { + return !this.query.repository_ref || this.query.repository_ref === this.defaultBranchName; + }, + isBasicSearch() { + return this.searchType === BASIC_SEARCH_TYPE; + }, + disabledMessage() { + return this.isZoekt + ? this.$options.i18n.zoekt_disabled + : this.$options.i18n.advanced_disabled; + }, + helpUrl() { + return this.isZoekt ? this.zoektHelpUrl : this.advancedSearchHelpUrl; + }, + enabledMessage() { + return this.isZoekt ? this.$options.i18n.zoekt_enabled : this.$options.i18n.advanced_enabled; + }, + syntaxHelpUrl() { + return this.isZoekt ? this.zoektSyntaxHelpUrl : this.advancedSearchSyntaxHelpUrl; + }, + }, +}; +</script> + +<template> + <div class="gl-text-gray-600"> + <div v-if="isBasicSearch" data-testid="basic"> </div> + <div v-else-if="isEnabled" :data-testid="`${searchType}-enabled`"> + <gl-sprintf :message="enabledMessage"> + <template #link="{ content }"> + <gl-link :href="helpUrl" target="_blank" data-testid="docs-link">{{ content }} </gl-link> + </template> + </gl-sprintf> + </div> + <div v-else :data-testid="`${searchType}-disabled`"> + <gl-sprintf :message="disabledMessage"> + <template #link="{ content }"> + <gl-link :href="helpUrl" target="_blank" data-testid="docs-link">{{ content }} </gl-link> + </template> + <template #ref_elem> + <code v-gl-tooltip :title="query.repository_ref">{{ query.repository_ref }}</code> + </template> + <template #docs_link> + <gl-link :href="syntaxHelpUrl" target="_blank" data-testid="syntax-docs-link" + >{{ $options.i18n.more }} + </gl-link> + </template> + </gl-sprintf> + </div> + </div> +</template> diff --git a/app/assets/javascripts/search/topbar/constants.js b/app/assets/javascripts/search/topbar/constants.js index 1ad40fbe3db..279f315f89f 100644 --- a/app/assets/javascripts/search/topbar/constants.js +++ b/app/assets/javascripts/search/topbar/constants.js @@ -22,3 +22,9 @@ export const PROJECT_DATA = { export const SYNTAX_OPTIONS_ADVANCED_DOCUMENT = 'drawers/drawers/advanced_search_syntax.md'; export const SYNTAX_OPTIONS_ZOEKT_DOCUMENT = 'drawers/drawers/exact_code_search_syntax.md'; + +export const ZOEKT_HELP_PAGE = 'user/search/exact_code_search'; +export const ADVANCED_SEARCH_HELP_PAGE = 'user/search/advanced_search'; + +export const ADVANCED_SEARCH_SYNTAX_HELP_ANCHOR = 'use-the-advanced-search-syntax'; +export const ZOEKT_HELP_PAGE_SYNTAX_ANCHOR = 'syntax'; diff --git a/app/assets/javascripts/search/topbar/index.js b/app/assets/javascripts/search/topbar/index.js index aad7445ebdc..95e15afd597 100644 --- a/app/assets/javascripts/search/topbar/index.js +++ b/app/assets/javascripts/search/topbar/index.js @@ -11,7 +11,7 @@ export const initTopbar = (store) => { return false; } - const { groupInitialJson, projectInitialJson, defaultBranchName } = el.dataset; + const { groupInitialJson, projectInitialJson } = el.dataset; const groupInitialJsonParsed = JSON.parse(groupInitialJson); const projectInitialJsonParsed = JSON.parse(projectInitialJson); @@ -24,7 +24,6 @@ export const initTopbar = (store) => { props: { groupInitialJson: groupInitialJsonParsed, projectInitialJson: projectInitialJsonParsed, - defaultBranchName, }, }); }, diff --git a/app/models/integrations/irker.rb b/app/models/integrations/irker.rb index a1ce0877957..f441ef25015 100644 --- a/app/models/integrations/irker.rb +++ b/app/models/integrations/irker.rb @@ -89,16 +89,18 @@ module Integrations def execute(data) return unless supported_events.include?(data[:object_kind]) + serialized_data = data.deep_stringify_keys + Integrations::IrkerWorker.perform_async( project_id, channels, - colorize_messages, data, settings + colorize_messages, serialized_data, settings ) end def settings { - server_host: server_host.presence || 'localhost', - server_port: server_port.presence || 6659 + 'server_host' => server_host.presence || 'localhost', + 'server_port' => server_port.presence || 6659 } end diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml index 55d7a4ed041..4ddeca64c7d 100644 --- a/app/views/search/show.html.haml +++ b/app/views/search/show.html.haml @@ -16,9 +16,6 @@ - page_description(_("%{count} %{scope} for term '%{term}'") % { count: @search_results.formatted_count(@scope), scope: @scope, term: @search_term }) - page_card_attributes("Namespace" => @group&.full_path, "Project" => @project&.full_path) -.gl-display-flex.gl-flex-wrap.gl-justify-content-end.gl-pt-6.gl-pb-5 - = render_if_exists 'search/form_elasticsearch' - #js-search-topbar{ data: { "group-initial-json": group_attributes.to_json, "project-initial-json": project_attributes.to_json, "default-branch-name": @project&.default_branch } } .results.gl-lg-display-flex.gl-mt-0 #js-search-sidebar{ data: { navigation_json: search_navigation_json, search_type: search_service.search_type } } |