diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb index f8b12284bb..594094d24b 100644 --- a/app/controllers/autocomplete_controller.rb +++ b/app/controllers/autocomplete_controller.rb @@ -138,7 +138,13 @@ def open_collection_names # For creating collections, autocomplete the name of a parent collection owned by the user only def collection_parent_name - render_output(current_user.maintained_collections.top_level.with_name_like(params[:term]).pluck(:name).sort) + results = current_user.maintained_collections.top_level + .with_name_or_title_like(params[:term]) + .limit(10) + .order(:title) + .pluck(:name, :title) + .map { |name, title| { id: name, name: "#{title} (#{name})" } } + respond_with(results) end # for looking up existing urls for external works to avoid duplication diff --git a/app/models/collection.rb b/app/models/collection.rb index ed78ea4ce3..09b50eef1d 100755 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -176,13 +176,8 @@ def cleanup_url end end - scope :with_name_like, lambda { |name| - where("collections.name LIKE ?", "%#{name}%") - .limit(10) - } - - scope :with_title_like, lambda { |title| - where("collections.title LIKE ?", "%#{title}%") + scope :with_name_or_title_like, lambda { |term| + where("collections.name LIKE ? OR collections.title LIKE ?", "%#{term}%", "%#{term}%") } scope :with_item_count, lambda { diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb index 97d8109d11..68459a7688 100644 --- a/spec/controllers/autocomplete_controller_spec.rb +++ b/spec/controllers/autocomplete_controller_spec.rb @@ -1,6 +1,8 @@ require "spec_helper" describe AutocompleteController do + include LoginMacros + describe "tag" do let!(:tag1) { create(:canonical_fandom, name: "Match") } let!(:tag2) { create(:canonical_fandom, name: "Blargh") } @@ -41,4 +43,20 @@ end end end + + describe "GET #collection_parent_name" do + let!(:user) { create(:user) } + let!(:collection1) { create(:collection, name: "some_name", title: "Unrelated Title", owner: user.default_pseud) } + let!(:collection2) { create(:collection, name: "unrelated_name", title: "Some Title", owner: user.default_pseud) } + + before { fake_login_known_user(user) } + + it "matches by name or title and formats suggestions as 'Title (name)'" do + get :collection_parent_name, params: { term: "some", format: :json } + expect(JSON.parse(response.body)).to contain_exactly( + { "id" => "some_name", "name" => "Unrelated Title (some_name)" }, + { "id" => "unrelated_name", "name" => "Some Title (unrelated_name)" } + ) + end + end end