Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-11-16 00:07:25 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-11-16 00:07:25 +0300
commita7d47330045c163760517a49f5fd35854e089c6e (patch)
tree57b7695720db8c461c2ef82841ae9571c1e2b9dc /app
parenta46bff51d5262a5c05c460f0c7c43a5f2405cd5d (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/search/index.js9
-rw-r--r--app/assets/javascripts/search/store/state.js3
-rw-r--r--app/assets/javascripts/search/topbar/components/app.vue83
-rw-r--r--app/assets/javascripts/search/topbar/components/search_type_indicator.vue115
-rw-r--r--app/assets/javascripts/search/topbar/constants.js6
-rw-r--r--app/assets/javascripts/search/topbar/index.js3
-rw-r--r--app/models/integrations/irker.rb8
-rw-r--r--app/views/search/show.html.haml3
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">&nbsp;</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 } }