initSearch: ->
- autocomplete_json = $('.search-autocomplete-json').data('autocomplete-opts')
- new SearchAutocomplete(autocomplete_json)
+ opts = $('.search-autocomplete-opts')
+ path = opts.data('autocomplete-path')
+ project_id = opts.data('autocomplete-project-id')
+ project_ref = opts.data('autocomplete-project-ref')
+
+ new SearchAutocomplete(path, project_id, project_ref)
class SearchAutocomplete
- constructor: (json) ->
+ constructor: (search_autocomplete_path, project_id, project_ref) ->
+ project_id = '' unless project_id
+ project_ref = '' unless project_ref
+ query = "?project_id=" + project_id + "&project_ref=" + project_ref
+
$("#search").autocomplete
- source: json
+ source: search_autocomplete_path + query
+ minLength: 1
select: (event, ui) ->
location.href = ui.item.url
class SearchController < ApplicationController
+ include SearchHelper
+
def show
@project = Project.find_by_id(params[:project_id]) if params[:project_id].present?
@group = Group.find_by_id(params[:group_id]) if params[:group_id].present?
@search_results = Search::GlobalService.new(current_user, params).execute
end
end
+
+ def autocomplete
+ term = params[:term]
+ @project = Project.find(params[:project_id]) if params[:project_id].present?
+ @ref = params[:project_ref] if params[:project_ref].present?
+
+ render json: search_autocomplete_opts(term).to_json
+ end
end
module SearchHelper
- def search_autocomplete_source
+ def search_autocomplete_opts(term)
return unless current_user
+
+ resources_results = [
+ groups_autocomplete(term),
+ projects_autocomplete(term),
+ public_projects_autocomplete(term),
+ ].flatten
+
+ generic_results = project_autocomplete + default_autocomplete + help_autocomplete
+ generic_results.select! { |result| result[:label] =~ Regexp.new(term, "i") }
+
[
- groups_autocomplete,
- projects_autocomplete,
- public_projects_autocomplete,
- default_autocomplete,
- project_autocomplete,
- help_autocomplete
+ resources_results,
+ generic_results
].flatten.uniq do |item|
item[:label]
- end.to_json
+ end
end
private
end
# Autocomplete results for the current user's groups
- def groups_autocomplete
- current_user.authorized_groups.map do |group|
- { label: "group: #{simple_sanitize(group.name)}", url: group_path(group) }
+ def groups_autocomplete(term, limit = 5)
+ current_user.authorized_groups.search(term).limit(limit).map do |group|
+ {
+ label: "group: #{simple_sanitize(group.name)}",
+ url: group_path(group)
+ }
end
end
# Autocomplete results for the current user's projects
- def projects_autocomplete
- current_user.authorized_projects.non_archived.map do |p|
- { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) }
+ def projects_autocomplete(term, limit = 5)
+ current_user.authorized_projects.search_by_title(term).non_archived.limit(limit).map do |p|
+ {
+ label: "project: #{simple_sanitize(p.name_with_namespace)}",
+ url: project_path(p)
+ }
end
end
# Autocomplete results for the current user's projects
- def public_projects_autocomplete
- Project.public_or_internal_only(current_user).non_archived.map do |p|
- { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) }
+ def public_projects_autocomplete(term, limit = 5)
+ Project.public_or_internal_only(current_user).search_by_title(term).non_archived.limit(limit).map do |p|
+ {
+ label: "project: #{simple_sanitize(p.name_with_namespace)}",
+ url: project_path(p)
+ }
end
end
+
+ def simple_sanitize(str)
+ Sanitize.clean(str)
+ end
end
= hidden_field_tag :search_code, true
= hidden_field_tag :repository_ref, @ref
= submit_tag 'Go' if ENV['RAILS_ENV'] == 'test'
- .search-autocomplete-json.hide{:'data-autocomplete-opts' => search_autocomplete_source }
+ .search-autocomplete-opts.hide{:'data-autocomplete-path' => search_autocomplete_path, :'data-autocomplete-project-id' => @project.try(:id), :'data-autocomplete-project-ref' => @ref }