diff options
Diffstat (limited to 'app/helpers/search_helper.rb')
-rw-r--r-- | app/helpers/search_helper.rb | 109 |
1 files changed, 108 insertions, 1 deletions
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 4e3b6aad8cc..1b9876b9a6a 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -3,6 +3,28 @@ module SearchHelper SEARCH_PERMITTED_PARAMS = [:search, :scope, :project_id, :group_id, :repository_ref, :snippets].freeze + def search_autocomplete_opts(term) + return unless current_user + + resources_results = [ + groups_autocomplete(term), + projects_autocomplete(term) + ].flatten + + search_pattern = Regexp.new(Regexp.escape(term), "i") + + generic_results = project_autocomplete + default_autocomplete + help_autocomplete + generic_results.concat(default_autocomplete_admin) if current_user.admin? + generic_results.select! { |result| result[:label] =~ search_pattern } + + [ + resources_results, + generic_results + ].flatten.uniq do |item| + item[:label] + end + end + def search_entries_info(collection, scope, term) return if collection.to_a.empty? @@ -62,7 +84,7 @@ module SearchHelper }).html_safe end - # Overriden in EE + # Overridden in EE def search_blob_title(project, path) path end @@ -73,6 +95,91 @@ module SearchHelper private + # 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 + [ + { category: "Help", label: _("API Help"), url: help_page_path("api/README") }, + { category: "Help", label: _("Markdown Help"), url: help_page_path("user/markdown") }, + { category: "Help", label: _("Permissions Help"), url: help_page_path("user/permissions") }, + { category: "Help", label: _("Public Access Help"), url: help_page_path("public_access/public_access") }, + { category: "Help", label: _("Rake Tasks Help"), url: help_page_path("raketasks/README") }, + { category: "Help", label: _("SSH Keys Help"), url: help_page_path("ssh/README") }, + { category: "Help", label: _("System Hooks Help"), url: help_page_path("system_hooks/system_hooks") }, + { category: "Help", label: _("Webhooks Help"), url: help_page_path("user/project/integrations/webhooks") }, + { category: "Help", label: _("Workflow Help"), url: help_page_path("workflow/README") } + ] + 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 + + [ + { category: "In this project", label: _("Files"), url: project_tree_path(@project, ref) }, + { category: "In this project", label: _("Commits"), url: project_commits_path(@project, ref) }, + { category: "In this project", label: _("Network"), url: project_network_path(@project, ref) }, + { category: "In this project", label: _("Graph"), url: project_graph_path(@project, ref) }, + { 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) } + ] + 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, + label: "#{search_result_sanitize(group.full_name)}", + url: group_path(group), + avatar_url: group.avatar_url || '' + } + end + end + # rubocop: enable CodeReuse/ActiveRecord + + # Autocomplete results for the current user's projects + # rubocop: disable CodeReuse/ActiveRecord + def projects_autocomplete(term, limit = 5) + current_user.authorized_projects.order_id_desc.search_by_title(term) + .sorted_by_stars_desc.non_archived.limit(limit).map do |p| + { + category: "Projects", + id: p.id, + value: "#{search_result_sanitize(p.name)}", + label: "#{search_result_sanitize(p.full_name)}", + url: project_path(p), + avatar_url: p.avatar_url || '' + } + end + end + # rubocop: enable CodeReuse/ActiveRecord + def search_result_sanitize(str) Sanitize.clean(str) end |