2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
2014-09-02 18:07:02 +05:30
module SearchHelper
2022-08-13 15:12:31 +05:30
# params which should persist when a new tab is selected
2021-01-29 00:20:46 +05:30
SEARCH_GENERIC_PARAMS = [
:search ,
:scope ,
:project_id ,
:group_id ,
:repository_ref ,
:snippets ,
:sort ,
2021-09-04 01:27:46 +05:30
:force_search_results ,
:project_ids
2021-01-29 00:20:46 +05:30
] . freeze
2019-12-26 22:10:19 +05:30
2022-08-27 11:52:29 +05:30
def search_autocomplete_opts ( term , filter : nil )
2020-07-28 23:09:34 +05:30
return unless current_user
2022-08-27 11:52:29 +05:30
results = case filter & . to_sym
when :search
resource_results ( term )
when :generic
[
recent_items_autocomplete ( term ) ,
generic_results ( term )
]
else
[
recent_items_autocomplete ( term ) ,
resource_results ( term ) ,
generic_results ( term )
]
end
results . flatten { | item | item [ :label ] }
end
def resource_results ( term )
[
2020-07-28 23:09:34 +05:30
groups_autocomplete ( term ) ,
2021-01-29 00:20:46 +05:30
projects_autocomplete ( term ) ,
2023-03-04 22:38:38 +05:30
users_autocomplete ( term ) ,
2021-01-29 00:20:46 +05:30
issue_autocomplete ( term )
2020-07-28 23:09:34 +05:30
] . flatten
2022-08-27 11:52:29 +05:30
end
2020-07-28 23:09:34 +05:30
2022-08-27 11:52:29 +05:30
def generic_results ( term )
2020-07-28 23:09:34 +05:30
search_pattern = Regexp . new ( Regexp . escape ( term ) , " i " )
generic_results = project_autocomplete + default_autocomplete + help_autocomplete
2023-03-17 16:20:25 +05:30
generic_results . concat ( default_autocomplete_admin ) if current_user . can_read_all_resources?
2022-08-27 11:52:29 +05:30
generic_results . select { | result | result [ :label ] =~ search_pattern }
2020-07-28 23:09:34 +05:30
end
2021-01-03 14:25:43 +05:30
def recent_items_autocomplete ( term )
recent_merge_requests_autocomplete ( term ) + recent_issues_autocomplete ( term )
end
2016-06-02 11:05:42 +05:30
def search_entries_info ( collection , scope , term )
2019-02-15 15:39:39 +05:30
return if collection . to_a . empty?
2016-06-02 11:05:42 +05:30
from = collection . offset_value + 1
2019-02-15 15:39:39 +05:30
to = collection . offset_value + collection . to_a . size
2016-06-02 11:05:42 +05:30
count = collection . total_count
2020-01-01 13:55:28 +05:30
term_element = " <span> <code> #{ h ( term ) } </code> </span> " . html_safe
2016-06-02 11:05:42 +05:30
2019-12-04 20:38:33 +05:30
search_entries_info_template ( collection ) % {
from : from ,
to : to ,
count : count ,
2019-12-21 20:55:43 +05:30
scope : search_entries_scope_label ( scope , count ) ,
2020-01-01 13:55:28 +05:30
term_element : term_element
2019-12-04 20:38:33 +05:30
}
end
2019-12-21 20:55:43 +05:30
def search_entries_scope_label ( scope , count )
2019-12-04 20:38:33 +05:30
case scope
2019-12-21 20:55:43 +05:30
when 'blobs'
ns_ ( 'SearchResults|code result' , 'SearchResults|code results' , count )
2019-12-04 20:38:33 +05:30
when 'commits'
ns_ ( 'SearchResults|commit' , 'SearchResults|commits' , count )
when 'issues'
ns_ ( 'SearchResults|issue' , 'SearchResults|issues' , count )
when 'merge_requests'
ns_ ( 'SearchResults|merge request' , 'SearchResults|merge requests' , count )
when 'milestones'
ns_ ( 'SearchResults|milestone' , 'SearchResults|milestones' , count )
when 'notes'
ns_ ( 'SearchResults|comment' , 'SearchResults|comments' , count )
when 'projects'
ns_ ( 'SearchResults|project' , 'SearchResults|projects' , count )
when 'snippet_titles'
ns_ ( 'SearchResults|snippet' , 'SearchResults|snippets' , count )
when 'users'
ns_ ( 'SearchResults|user' , 'SearchResults|users' , count )
2019-12-21 20:55:43 +05:30
when 'wiki_blobs'
ns_ ( 'SearchResults|wiki result' , 'SearchResults|wiki results' , count )
2019-12-04 20:38:33 +05:30
else
raise " Unrecognized search scope ' #{ scope } ' "
end
end
def search_entries_info_template ( collection )
if collection . total_pages > 1
2021-11-18 22:05:49 +05:30
s_ ( " SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} " ) . html_safe
2019-12-04 20:38:33 +05:30
else
2021-11-18 22:05:49 +05:30
s_ ( " SearchResults|Showing %{count} %{scope} for %{term_element} " ) . html_safe
2019-12-04 20:38:33 +05:30
end
2016-06-02 11:05:42 +05:30
end
2021-01-29 00:20:46 +05:30
def search_entries_empty_message ( scope , term , group , project )
options = {
2019-12-21 20:55:43 +05:30
scope : search_entries_scope_label ( scope , 0 ) ,
2021-01-29 00:20:46 +05:30
term : " <code> #{ h ( term ) } </code> " . html_safe
}
# We check project first because we have 3 possible combinations here:
# - group && project
# - group
# - group: nil, project: nil
if project
html_escape ( _ ( " We couldn't find any %{scope} matching %{term} in project %{project} " ) ) % options . merge (
project : link_to ( project . full_name , project_path ( project ) , target : '_blank' , rel : 'noopener noreferrer' ) . html_safe
)
elsif group
html_escape ( _ ( " We couldn't find any %{scope} matching %{term} in group %{group} " ) ) % options . merge (
group : link_to ( group . full_name , group_path ( group ) , target : '_blank' , rel : 'noopener noreferrer' ) . html_safe
)
else
html_escape ( _ ( " We couldn't find any %{scope} matching %{term} " ) ) % options
end
2019-12-21 20:55:43 +05:30
end
2021-01-03 14:25:43 +05:30
def repository_ref ( project )
2022-07-23 23:45:48 +05:30
return project . default_branch unless params [ :project_id ]
2021-01-03 14:25:43 +05:30
# Always #to_s the repository_ref param in case the value is also a number
params [ :repository_ref ] . to_s . presence || project . default_branch
end
2020-07-28 23:09:34 +05:30
# Overridden in EE
2019-12-26 22:10:19 +05:30
def search_blob_title ( project , path )
path
2016-09-29 09:46:39 +05:30
end
2019-07-07 11:18:12 +05:30
def search_service
2022-08-13 15:12:31 +05:30
@search_service || = :: SearchService . new ( current_user , sanitized_search_params )
2019-07-07 11:18:12 +05:30
end
2021-03-11 19:13:27 +05:30
def search_sort_options
2021-09-30 23:02:18 +05:30
options = [
2021-03-11 19:13:27 +05:30
{
title : _ ( 'Created date' ) ,
sortable : true ,
sortParam : {
asc : 'created_asc' ,
desc : 'created_desc'
}
} ,
{
2022-03-02 08:16:31 +05:30
title : _ ( 'Updated date' ) ,
2021-03-11 19:13:27 +05:30
sortable : true ,
sortParam : {
asc : 'updated_asc' ,
desc : 'updated_desc'
}
}
]
2021-09-30 23:02:18 +05:30
2021-10-27 15:23:28 +05:30
if search_service . scope == 'issues'
2021-09-30 23:02:18 +05:30
options << {
title : _ ( 'Popularity' ) ,
sortable : true ,
sortParam : {
asc : 'popularity_asc' ,
desc : 'popularity_desc'
}
}
end
options
2021-03-11 19:13:27 +05:30
end
2023-01-13 00:05:48 +05:30
def search_group
# group gets derived from the Project in the project's scope
@group || @project & . group
end
def search_has_group?
search_group & . present? && search_group & . persisted?
end
def search_has_project?
@project & . present? && @project & . persisted?
end
2022-04-04 11:22:00 +05:30
def header_search_context
{ } . tap do | hash |
2023-01-13 00:05:48 +05:30
if search_has_group?
hash [ :group ] = { id : search_group . id , name : search_group . name , full_name : search_group . full_name }
hash [ :group_metadata ] = { issues_path : issues_group_path ( search_group ) , mr_path : merge_requests_group_path ( search_group ) }
end
2022-04-04 11:22:00 +05:30
2023-01-13 00:05:48 +05:30
if search_has_project?
hash [ :project ] = { id : @project . id , name : @project . name }
2023-05-27 22:25:52 +05:30
hash [ :project_metadata ] = { mr_path : project_merge_requests_path ( @project ) }
hash [ :project_metadata ] [ :issues_path ] = project_issues_path ( @project ) if @project . feature_available? ( :issues , current_user )
2023-01-13 00:05:48 +05:30
hash [ :code_search ] = search_scope . nil?
hash [ :ref ] = @ref if @ref && can? ( current_user , :read_code , @project )
end
2022-04-04 11:22:00 +05:30
2023-01-13 00:05:48 +05:30
hash [ :scope ] = search_scope if search_has_project? || search_has_group?
hash [ :for_snippets ] = @snippet & . present? || @snippets & . any?
end
end
2022-04-04 11:22:00 +05:30
2023-01-13 00:05:48 +05:30
def search_scope
if current_controller? ( :issues )
'issues'
elsif current_controller? ( :merge_requests )
'merge_requests'
elsif current_controller? ( :wikis )
'wiki_blobs'
elsif current_controller? ( :commits )
'commits'
elsif current_controller? ( :groups )
if %w( issues merge_requests ) . include? ( controller . action_name )
controller . action_name
end
2022-04-04 11:22:00 +05:30
end
end
2014-09-02 18:07:02 +05:30
private
2020-07-28 23:09:34 +05:30
# Autocomplete results for various settings pages
def default_autocomplete
[
{ category : " Settings " , label : _ ( " User settings " ) , url : profile_path } ,
{ category : " Settings " , label : _ ( " SSH Keys " ) , url : profile_keys_path } ,
{ category : " Settings " , label : _ ( " Dashboard " ) , url : root_path }
]
end
# Autocomplete results for settings pages, for admins
def default_autocomplete_admin
[
{ category : " Settings " , label : _ ( " Admin Section " ) , url : admin_root_path }
]
end
# Autocomplete results for internal help pages
def help_autocomplete
[
2021-09-30 23:02:18 +05:30
{ category : " Help " , label : _ ( " API Help " ) , url : help_page_path ( " api/index " ) } ,
2020-07-28 23:09:34 +05:30
{ category : " Help " , label : _ ( " Markdown Help " ) , url : help_page_path ( " user/markdown " ) } ,
{ category : " Help " , label : _ ( " Permissions Help " ) , url : help_page_path ( " user/permissions " ) } ,
2022-08-13 15:12:31 +05:30
{ category : " Help " , label : _ ( " Public Access Help " ) , url : help_page_path ( " user/public_access " ) } ,
2021-10-27 15:23:28 +05:30
{ category : " Help " , label : _ ( " Rake Tasks Help " ) , url : help_page_path ( " raketasks/index " ) } ,
2022-08-13 15:12:31 +05:30
{ category : " Help " , label : _ ( " SSH Keys Help " ) , url : help_page_path ( " user/ssh " ) } ,
{ category : " Help " , label : _ ( " System Hooks Help " ) , url : help_page_path ( " administration/system_hooks " ) } ,
2021-01-03 14:25:43 +05:30
{ category : " Help " , label : _ ( " Webhooks Help " ) , url : help_page_path ( " user/project/integrations/webhooks " ) }
2020-07-28 23:09:34 +05:30
]
end
# Autocomplete results for the current project, if it's defined
def project_autocomplete
if @project && @project . repository . root_ref
ref = @ref || @project . repository . root_ref
2021-12-07 22:27:20 +05:30
result = [ ]
2023-01-13 00:05:48 +05:30
if can? ( current_user , :read_code , @project )
2021-12-07 22:27:20 +05:30
result . concat ( [
2022-10-11 01:57:18 +05:30
{ category : " In this project " , label : _ ( " Files " ) , url : project_tree_path ( @project , ref ) } ,
{ category : " In this project " , label : _ ( " Commits " ) , url : project_commits_path ( @project , ref ) }
] )
2021-12-07 22:27:20 +05:30
end
if can? ( current_user , :read_repository_graphs , @project )
result . concat ( [
2022-10-11 01:57:18 +05:30
{ category : " In this project " , label : _ ( " Network " ) , url : project_network_path ( @project , ref ) } ,
{ category : " In this project " , label : _ ( " Graph " ) , url : project_graph_path ( @project , ref ) }
] )
2021-12-07 22:27:20 +05:30
end
result . concat ( [
2022-10-11 01:57:18 +05:30
{ category : " In this project " , label : _ ( " Issues " ) , url : project_issues_path ( @project ) } ,
{ category : " In this project " , label : _ ( " Merge requests " ) , url : project_merge_requests_path ( @project ) } ,
{ category : " In this project " , label : _ ( " Milestones " ) , url : project_milestones_path ( @project ) } ,
{ category : " In this project " , label : _ ( " Snippets " ) , url : project_snippets_path ( @project ) } ,
{ category : " In this project " , label : _ ( " Members " ) , url : project_project_members_path ( @project ) } ,
{ category : " In this project " , label : _ ( " Wiki " ) , url : project_wikis_path ( @project ) }
] )
2021-01-29 00:20:46 +05:30
if can? ( current_user , :read_feature_flag , @project )
result << { category : " In this project " , label : _ ( " Feature Flags " ) , url : project_feature_flags_path ( @project ) }
end
result
2020-07-28 23:09:34 +05:30
else
[ ]
end
end
# Autocomplete results for the current user's groups
# rubocop: disable CodeReuse/ActiveRecord
def groups_autocomplete ( term , limit = 5 )
current_user . authorized_groups . order_id_desc . search ( term ) . limit ( limit ) . map do | group |
{
category : " Groups " ,
id : group . id ,
2023-03-04 22:38:38 +05:30
value : search_result_sanitize ( group . name ) ,
label : search_result_sanitize ( group . full_name ) ,
2020-07-28 23:09:34 +05:30
url : group_path ( group ) ,
avatar_url : group . avatar_url || ''
}
end
end
# rubocop: enable CodeReuse/ActiveRecord
2021-01-29 00:20:46 +05:30
def issue_autocomplete ( term )
return [ ] unless @project . present? && current_user && term =~ / \ A #{ Issue . reference_prefix } \ d+ \ z /
iid = term . sub ( Issue . reference_prefix , '' ) . to_i
issue = @project . issues . find_by_iid ( iid )
return [ ] unless issue && Ability . allowed? ( current_user , :read_issue , issue )
[
2022-10-11 01:57:18 +05:30
{
category : 'In this project' ,
id : issue . id ,
label : search_result_sanitize ( " #{ issue . title } ( #{ issue . to_reference } ) " ) ,
url : issue_path ( issue ) ,
avatar_url : issue . project . avatar_url || ''
}
2021-01-29 00:20:46 +05:30
]
end
2020-07-28 23:09:34 +05:30
# Autocomplete results for the current user's projects
# rubocop: disable CodeReuse/ActiveRecord
def projects_autocomplete ( term , limit = 5 )
2023-06-20 00:43:36 +05:30
current_user . authorized_projects . order_id_desc . search ( term , include_namespace : true )
2020-07-28 23:09:34 +05:30
. sorted_by_stars_desc . non_archived . limit ( limit ) . map do | p |
{
category : " Projects " ,
id : p . id ,
2023-03-04 22:38:38 +05:30
value : search_result_sanitize ( p . name ) ,
label : search_result_sanitize ( p . full_name ) ,
2020-07-28 23:09:34 +05:30
url : project_path ( p ) ,
avatar_url : p . avatar_url || ''
}
end
end
2020-11-24 15:15:51 +05:30
2023-03-04 22:38:38 +05:30
def users_autocomplete ( term , limit = 5 )
return [ ] unless current_user && Ability . allowed? ( current_user , :read_users_list )
SearchService
. new ( current_user , { scope : 'users' , per_page : limit , search : term } )
. search_objects
. map do | user |
{
category : " Users " ,
id : user . id ,
value : search_result_sanitize ( user . name ) ,
label : search_result_sanitize ( user . username ) ,
url : user_path ( user ) ,
avatar_url : user . avatar_url || ''
}
end
end
2021-01-03 14:25:43 +05:30
def recent_merge_requests_autocomplete ( term )
2020-11-24 15:15:51 +05:30
return [ ] unless current_user
2021-01-03 14:25:43 +05:30
:: Gitlab :: Search :: RecentMergeRequests . new ( user : current_user ) . search ( term ) . map do | mr |
2020-11-24 15:15:51 +05:30
{
category : " Recent merge requests " ,
id : mr . id ,
label : search_result_sanitize ( mr . title ) ,
url : merge_request_path ( mr ) ,
2022-06-21 17:19:12 +05:30
avatar_url : mr . project . avatar_url || '' ,
project_id : mr . target_project_id ,
project_name : mr . target_project . name
2020-11-24 15:15:51 +05:30
}
end
end
2021-01-03 14:25:43 +05:30
def recent_issues_autocomplete ( term )
2020-11-24 15:15:51 +05:30
return [ ] unless current_user
2021-01-03 14:25:43 +05:30
:: Gitlab :: Search :: RecentIssues . new ( user : current_user ) . search ( term ) . map do | i |
2020-11-24 15:15:51 +05:30
{
category : " Recent issues " ,
id : i . id ,
label : search_result_sanitize ( i . title ) ,
url : issue_path ( i ) ,
2022-06-21 17:19:12 +05:30
avatar_url : i . project . avatar_url || '' ,
project_id : i . project_id ,
project_name : i . project . name
2020-11-24 15:15:51 +05:30
}
end
end
2020-07-28 23:09:34 +05:30
# rubocop: enable CodeReuse/ActiveRecord
2014-09-02 18:07:02 +05:30
def search_result_sanitize ( str )
Sanitize . clean ( str )
end
2015-04-26 12:48:37 +05:30
2019-10-12 21:52:04 +05:30
def search_filter_link ( scope , label , data : { } , search : { } )
search_params = params
. merge ( search )
. merge ( { scope : scope } )
2021-01-29 00:20:46 +05:30
. permit ( SEARCH_GENERIC_PARAMS )
2019-10-12 21:52:04 +05:30
if @scope == scope
li_class = 'active'
2021-09-30 23:02:18 +05:30
count = @timeout ? 0 : @search_results . formatted_count ( scope )
2019-10-12 21:52:04 +05:30
else
badge_class = 'js-search-count hidden'
badge_data = { url : search_count_path ( search_params ) }
end
2015-04-26 12:48:37 +05:30
2019-10-12 21:52:04 +05:30
content_tag :li , class : li_class , data : data do
link_to search_path ( search_params ) do
concat label
concat ' '
2022-03-02 08:16:31 +05:30
concat gl_badge_tag ( count , { size : :sm } , { class : badge_class , data : badge_data } )
2019-10-12 21:52:04 +05:30
end
end
2015-04-26 12:48:37 +05:30
end
2022-11-25 23:54:43 +05:30
def search_filter_link_json ( scope , label , data , search )
scope_name = scope . to_s
search_params = params . merge ( search ) . merge ( { scope : scope_name } ) . permit ( SEARCH_GENERIC_PARAMS )
active_scope = @scope == scope_name
result = { label : label , scope : scope_name , data : data , link : search_path ( search_params ) , active : active_scope }
2023-01-13 00:05:48 +05:30
if active_scope
result [ :count ] = ! @timeout ? @search_results . formatted_count ( scope_name ) : " 0 "
end
2022-11-25 23:54:43 +05:30
result [ :count_link ] = search_count_path ( search_params ) unless active_scope
result
end
2023-03-04 22:38:38 +05:30
def code_tab_condition
return true if project_search_tabs? ( :blobs )
@project . nil? && search_service . show_elasticsearch_tabs? && feature_flag_tab_enabled? ( :global_search_code_tab )
end
def wiki_tab_condition
return true if project_search_tabs? ( :wiki )
@project . nil? && search_service . show_elasticsearch_tabs? && feature_flag_tab_enabled? ( :global_search_wiki_tab )
end
def commits_tab_condition
return true if project_search_tabs? ( :commits )
@project . nil? && search_service . show_elasticsearch_tabs? && feature_flag_tab_enabled? ( :global_search_commits_tab )
end
2022-11-25 23:54:43 +05:30
# search page scope navigation
def search_navigation
{
2023-01-13 00:05:48 +05:30
projects : { sort : 1 , label : _ ( " Projects " ) , data : { qa_selector : 'projects_tab' } , condition : @project . nil? } ,
2023-03-04 22:38:38 +05:30
blobs : { sort : 2 , label : _ ( " Code " ) , data : { qa_selector : 'code_tab' } , condition : code_tab_condition } ,
2023-01-13 00:05:48 +05:30
# sort: 3 is reserved for EE items
issues : { sort : 4 , label : _ ( " Issues " ) , condition : project_search_tabs? ( :issues ) || feature_flag_tab_enabled? ( :global_search_issues_tab ) } ,
merge_requests : { sort : 5 , label : _ ( " Merge requests " ) , condition : project_search_tabs? ( :merge_requests ) || feature_flag_tab_enabled? ( :global_search_merge_requests_tab ) } ,
2023-03-04 22:38:38 +05:30
wiki_blobs : { sort : 6 , label : _ ( " Wiki " ) , condition : wiki_tab_condition } ,
commits : { sort : 7 , label : _ ( " Commits " ) , condition : commits_tab_condition } ,
2023-01-13 00:05:48 +05:30
notes : { sort : 8 , label : _ ( " Comments " ) , condition : project_search_tabs? ( :notes ) || search_service . show_elasticsearch_tabs? } ,
milestones : { sort : 9 , label : _ ( " Milestones " ) , condition : project_search_tabs? ( :milestones ) || @project . nil? } ,
2023-03-04 22:38:38 +05:30
users : { sort : 10 , label : _ ( " Users " ) , condition : show_user_search_tab? } ,
snippet_titles : { sort : 11 , label : _ ( " Titles and Descriptions " ) , search : { snippets : true , group_id : nil , project_id : nil } , condition : search_service . show_snippets? && @project . nil? }
2022-11-25 23:54:43 +05:30
}
end
def search_navigation_json
2023-01-13 00:05:48 +05:30
sorted_navigation = search_navigation . sort_by { | _ , h | h [ :sort ] }
sorted_navigation . each_with_object ( { } ) do | ( key , value ) , hash |
2022-11-25 23:54:43 +05:30
hash [ key ] = search_filter_link_json ( key , value [ :label ] , value [ :data ] , value [ :search ] ) if value [ :condition ]
end . to_json
end
2020-05-24 23:13:21 +05:30
def search_filter_input_options ( type , placeholder = _ ( 'Search or filter results...' ) )
2018-03-17 18:26:18 +05:30
opts =
{
id : " filtered-search- #{ type } " ,
2020-05-24 23:13:21 +05:30
placeholder : placeholder ,
2018-03-17 18:26:18 +05:30
data : {
'username-params' = > UserSerializer . new . represent ( @users )
} ,
autocomplete : 'off'
2017-09-10 17:25:29 +05:30
}
if @project . present?
opts [ :data ] [ 'project-id' ] = @project . id
2019-09-04 21:01:54 +05:30
opts [ :data ] [ 'labels-endpoint' ] = project_labels_path ( @project )
opts [ :data ] [ 'milestones-endpoint' ] = project_milestones_path ( @project )
2019-12-26 22:10:19 +05:30
opts [ :data ] [ 'releases-endpoint' ] = project_releases_path ( @project )
2021-01-03 14:25:43 +05:30
opts [ :data ] [ 'environments-endpoint' ] =
unfoldered_environment_names_project_path ( @project )
2019-02-15 15:39:39 +05:30
elsif @group . present?
2018-03-17 18:26:18 +05:30
opts [ :data ] [ 'group-id' ] = @group . id
2019-09-04 21:01:54 +05:30
opts [ :data ] [ 'labels-endpoint' ] = group_labels_path ( @group )
opts [ :data ] [ 'milestones-endpoint' ] = group_milestones_path ( @group )
2020-10-24 23:57:45 +05:30
opts [ :data ] [ 'releases-endpoint' ] = group_releases_path ( @group )
2021-01-03 14:25:43 +05:30
opts [ :data ] [ 'environments-endpoint' ] =
unfoldered_environment_names_group_path ( @group )
2019-02-15 15:39:39 +05:30
else
2019-09-04 21:01:54 +05:30
opts [ :data ] [ 'labels-endpoint' ] = dashboard_labels_path
opts [ :data ] [ 'milestones-endpoint' ] = dashboard_milestones_path
2017-09-10 17:25:29 +05:30
end
opts
end
2019-02-15 15:39:39 +05:30
def search_history_storage_prefix
if @project . present?
@project . full_path
elsif @group . present?
@group . full_path
else
'dashboard'
end
end
2021-04-17 20:07:23 +05:30
def search_md_sanitize ( source )
search_sanitize ( markdown ( search_truncate ( source ) ) )
end
def simple_search_highlight_and_truncate ( text , phrase , options = { } )
highlight ( search_sanitize ( search_truncate ( text ) ) , phrase . split , options )
end
2016-11-03 12:29:30 +05:30
# Sanitize a HTML field for search display. Most tags are stripped out and the
# maximum length is set to 200 characters.
2021-04-17 20:07:23 +05:30
def search_truncate ( source )
Truncato . truncate (
2020-11-24 15:15:51 +05:30
source ,
2016-11-03 12:29:30 +05:30
count_tags : false ,
count_tail : false ,
2021-04-17 20:07:23 +05:30
filtered_tags : %w( img ) ,
2016-11-03 12:29:30 +05:30
max_length : 200
)
2021-04-17 20:07:23 +05:30
end
2016-11-03 12:29:30 +05:30
2021-04-17 20:07:23 +05:30
def search_sanitize ( html )
2016-11-03 12:29:30 +05:30
# Truncato's filtered_tags and filtered_attributes are not quite the same
2015-04-26 12:48:37 +05:30
sanitize ( html , tags : %w( a p ol ul li pre code ) )
end
2018-03-17 18:26:18 +05:30
2021-01-03 14:25:43 +05:30
# _search_highlight is used in EE override
2021-01-29 00:20:46 +05:30
def highlight_and_truncate_issuable ( issuable , search_term , _search_highlight )
return unless issuable . description . present?
2019-07-07 11:18:12 +05:30
2021-02-22 17:27:13 +05:30
simple_search_highlight_and_truncate ( issuable . description , search_term , highlighter : '<span class="gl-text-gray-900 gl-font-weight-bold">\1</span>' )
2021-01-03 14:25:43 +05:30
end
def show_user_search_tab?
2022-06-21 17:19:12 +05:30
return project_search_tabs? ( :members ) if @project
return false unless can? ( current_user , :read_users_list )
return true if @group
2022-07-16 23:28:13 +05:30
Feature . enabled? ( :global_search_users_tab , current_user , type : :ops )
2019-07-07 11:18:12 +05:30
end
2021-01-29 00:20:46 +05:30
def issuable_state_to_badge_class ( issuable )
# Closed is considered "danger" for MR so we need to handle separately
if issuable . is_a? ( :: MergeRequest )
if issuable . merged?
2021-04-17 20:07:23 +05:30
:info
2021-01-29 00:20:46 +05:30
elsif issuable . closed?
:danger
else
:success
end
2023-03-04 22:38:38 +05:30
elsif issuable . closed?
:info
2021-01-29 00:20:46 +05:30
else
2023-03-04 22:38:38 +05:30
:success
2021-01-29 00:20:46 +05:30
end
end
def issuable_state_text ( issuable )
case issuable . state
when 'merged'
_ ( " Merged " )
when 'closed'
_ ( " Closed " )
else
_ ( " Open " )
end
end
2021-11-11 11:23:49 +05:30
def feature_flag_tab_enabled? ( flag )
2023-03-04 22:38:38 +05:30
@group . present? || Feature . enabled? ( flag , current_user , type : :ops )
2021-11-11 11:23:49 +05:30
end
2022-08-13 15:12:31 +05:30
def sanitized_search_params
sanitized_params = params . dup
sanitized_params [ :confidential ] = Gitlab :: Utils . to_boolean ( sanitized_params [ :confidential ] ) if sanitized_params . key? ( :confidential )
sanitized_params
end
2014-09-02 18:07:02 +05:30
end
2019-12-04 20:38:33 +05:30
2021-06-08 01:23:25 +05:30
SearchHelper . prepend_mod_with ( 'SearchHelper' )