Skip to content
Snippets Groups Projects
Commit ffd9ce0c authored by Dmitry Gruzd's avatar Dmitry Gruzd
Browse files

Add Epics to search

parent 682ec79a
No related branches found
No related tags found
No related merge requests found
Showing
with 135 additions and 19 deletions
Loading
Loading
@@ -36,6 +36,7 @@ class SearchController < ApplicationController
 
@scope = search_service.scope
@show_snippets = search_service.show_snippets?
@show_epics = search_service.show_epics?
@search_results = search_service.search_results
@search_objects = search_service.search_objects(preload_method)
 
Loading
Loading
Loading
Loading
@@ -493,7 +493,8 @@ module ProjectsHelper
commits: :download_code,
merge_requests: :read_merge_request,
notes: [:read_merge_request, :download_code, :read_issue, :read_snippet],
members: :read_project_member
members: :read_project_member,
epics: :read_epic
)
end
 
Loading
Loading
Loading
Loading
@@ -66,6 +66,8 @@ module SearchHelper
ns_('SearchResults|user', 'SearchResults|users', count)
when 'wiki_blobs'
ns_('SearchResults|wiki result', 'SearchResults|wiki results', count)
when 'epics'
ns_('SearchResults|epic', 'SearchResults|epics', count)
else
raise "Unrecognized search scope '#{scope}'"
end
Loading
Loading
Loading
Loading
@@ -25,6 +25,7 @@ module Search
strong_memoize(:allowed_scopes) do
allowed_scopes = %w[issues merge_requests milestones]
allowed_scopes << 'users' if Feature.enabled?(:users_search, default_enabled: true)
allowed_scopes
end
end
 
Loading
Loading
Loading
Loading
@@ -47,6 +47,11 @@ class SearchService
@show_snippets = params[:snippets] == 'true'
end
 
# overriden in EE
def show_epics?
false
end
def valid_query_length?
params[:search].length <= SEARCH_CHAR_LIMIT
end
Loading
Loading
Loading
Loading
@@ -30,5 +30,7 @@
= search_filter_link 'issues', _("Issues")
= search_filter_link 'merge_requests', _("Merge requests")
= search_filter_link 'milestones', _("Milestones")
- if @show_epics
= search_filter_link 'epics', _("Epics")
= render_if_exists 'search/category_elasticsearch'
= users
%div{ class: 'search-result-row gl-pb-3! gl-mt-5 gl-mb-0!' }
%span.gl-display-flex.gl-align-items-center
- if epic.closed?
%span.badge.badge-info.badge-pill.gl-badge.sm= _("Closed")
- else
%span.badge.badge-success.badge-pill.gl-badge.sm= _("Open")
= sprite_icon('eye-slash', css_class: 'gl-text-gray-500 gl-ml-2') if epic.confidential?
= link_to group_epic_path(epic.group, epic), data: { track_event: 'click_text', track_label: 'epic_title', track_property: 'search_result' }, class: 'gl-w-full' do
%span.term.str-truncated.gl-font-weight-bold.gl-ml-2= epic.title
.gl-text-gray-500.gl-my-3
= sprintf(s_(' %{group_name}&%{epic_iid} &middot; opened %{epic_created} by %{author}'), { group_name: epic.group.full_name, epic_iid: epic.iid, epic_created: time_ago_with_tooltip(epic.created_at, placement: 'bottom'), author: link_to_member(@project, epic.author, avatar: false) }).html_safe
- if epic.description.present?
.description.term.col-sm-10.gl-px-0
= truncate(epic.description, length: 200)
---
name: epics_search
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42456
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/250317
group: group::global search
type: development
default_enabled: false
\ No newline at end of file
Loading
Loading
@@ -3,7 +3,7 @@ module EE
module SearchHelper
extend ::Gitlab::Utils::Override
 
SWITCH_TO_BASIC_SEARCHABLE_TABS = %w[projects issues merge_requests milestones users].freeze
SWITCH_TO_BASIC_SEARCHABLE_TABS = %w[projects issues merge_requests milestones users epics].freeze
 
override :search_filter_input_options
def search_filter_input_options(type, placeholder = _('Search or filter results...'))
Loading
Loading
Loading
Loading
@@ -228,6 +228,10 @@ module EE
 
items.where("epic_issues.epic_id": ids)
end
def search(query)
fuzzy_search(query, [:title, :description])
end
end
 
def resource_parent
Loading
Loading
Loading
Loading
@@ -30,14 +30,21 @@ module EE
 
override :allowed_scopes
def allowed_scopes
return super unless use_elasticsearch?
return add_epics_scope(super) unless use_elasticsearch?
 
strong_memoize(:ee_allowed_scopes) do
super.tap do |ce_scopes|
ce_scopes.concat(%w[notes wiki_blobs blobs commits])
add_epics_scope ce_scopes.concat(%w[notes wiki_blobs blobs commits])
end
end
end
private
def add_epics_scope(allowed)
allowed << 'epics' if ::Feature.enabled?(:epics_search) && ::License.feature_available?(:epics)
allowed
end
end
end
end
Loading
Loading
@@ -19,5 +19,12 @@ module EE
 
super
end
def show_epics?
return false unless ::Feature.enabled?(:epics_search)
return false unless ::License.feature_available?(:epics)
true
end
end
end
# frozen_string_literal: true
module EE
module Gitlab
module GroupSearchResults
extend ::Gitlab::Utils::Override
override :epics
def epics
EpicsFinder.new(current_user, issuable_params).execute.search(query)
end
end
end
end
Loading
Loading
@@ -5,12 +5,47 @@ module EE
module SearchResults
extend ::Gitlab::Utils::Override
 
override :formatted_count
def formatted_count(scope)
count = super
return count if count
case scope
when 'epics'
formatted_limited_count(limited_epics_count)
end
end
override :epics
def epics
groups_finder = GroupsFinder.new(current_user)
::Epic.in_selected_groups(groups_finder.execute).search(query)
end
private
 
override :projects
def projects
super.with_compliance_framework_settings
end
override :collection_for
def collection_for(scope)
collection = super
return collection if collection
case scope
when 'epics'
epics
end
end
def limited_epics_count
@limited_epics_count ||= limited_count(epics)
end
end
end
end
Loading
Loading
@@ -8,6 +8,8 @@ module Gitlab
class GroupSearchResults < Gitlab::Elastic::SearchResults
delegate :users, to: :generic_search_results
delegate :limited_users_count, to: :generic_search_results
delegate :epics, to: :generic_search_results
delegate :limited_epics_count, to: :generic_search_results
 
attr_reader :group, :default_project_filter, :filters
 
Loading
Loading
Loading
Loading
@@ -15,6 +15,8 @@ module Gitlab
 
delegate :users, to: :generic_search_results
delegate :limited_users_count, to: :generic_search_results
delegate :epics, to: :generic_search_results
delegate :limited_epics_count, to: :generic_search_results
 
def initialize(current_user, query, limit_projects = nil, public_and_internal_projects: true, filters: {})
@current_user = current_user
Loading
Loading
@@ -46,6 +48,8 @@ module Gitlab
commits(page: page, per_page: per_page, preload_method: preload_method)
when 'users'
users.page(page).per(per_page)
when 'epics'
epics.page(page).per(per_page)
else
Kaminari.paginate_array([])
end
Loading
Loading
@@ -75,6 +79,8 @@ module Gitlab
milestones_count.to_s
when 'users'
generic_search_results.formatted_count('users')
when 'epics'
generic_search_results.formatted_count('epics')
end
end
 
Loading
Loading
Loading
Loading
@@ -38,3 +38,5 @@ module Gitlab
end
end
end
Gitlab::SearchResults.prepend_if_ee('EE::Gitlab::GroupSearchResults')
Loading
Loading
@@ -29,21 +29,12 @@ module Gitlab
 
def objects(scope, page: nil, per_page: DEFAULT_PER_PAGE, without_count: true, preload_method: nil)
should_preload = preload_method.present?
collection = case scope
when 'projects'
projects
when 'issues'
issues
when 'merge_requests'
merge_requests
when 'milestones'
milestones
when 'users'
users
else
should_preload = false
Kaminari.paginate_array([])
end
collection = collection_for(scope)
if collection.nil?
should_preload = false
collection = Kaminari.paginate_array([])
end
 
collection = collection.public_send(preload_method) if should_preload # rubocop:disable GitlabSecurity/PublicSend
collection = collection.page(page).per(per_page)
Loading
Loading
@@ -118,6 +109,21 @@ module Gitlab
 
private
 
def collection_for(scope)
case scope
when 'projects'
projects
when 'issues'
issues
when 'merge_requests'
merge_requests
when 'milestones'
milestones
when 'users'
users
end
end
def projects
limit_projects.search(query)
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment