Merge branch 'search-repeatedly' of https://github.com/stwf/diaspora into stwf-search-repeatedly

This commit is contained in:
Maxwell Salzberg 2012-03-13 16:41:16 -07:00
commit 2a30e60fe0
10 changed files with 140 additions and 5 deletions

View file

@ -35,6 +35,7 @@ class PeopleController < ApplicationController
if diaspora_id?(search_query) if diaspora_id?(search_query)
@people = Person.where(:diaspora_handle => search_query.downcase) @people = Person.where(:diaspora_handle => search_query.downcase)
Webfinger.in_background(search_query) if @people.empty? Webfinger.in_background(search_query) if @people.empty?
@background_query = search_query.downcase
end end
@people = @people.paginate(:page => params[:page], :per_page => 15) @people = @people.paginate(:page => params[:page], :per_page => 15)
@hashes = hashes_for_people(@people, @aspects) @hashes = hashes_for_people(@people, @aspects)
@ -42,6 +43,20 @@ class PeopleController < ApplicationController
end end
end end
def refresh_search
@aspect = :search
@people = Person.where(:diaspora_handle => search_query.downcase)
@answer_html = ""
unless @people.empty?
@hashes = hashes_for_people(@people, @aspects)
self.formats = self.formats + [:html]
@answer_html = render_to_string :partial => 'people/person', :locals => @hashes.first
end
render :json => { :search_count => @people.count, :search_html => @answer_html }.to_json
end
def tag_index def tag_index
profiles = Profile.tagged_with(params[:name]).where(:searchable => true).select('profiles.id, profiles.person_id') profiles = Profile.tagged_with(params[:name]).where(:searchable => true).select('profiles.id, profiles.person_id')
@people = Person.where(:id => profiles.map{|p| p.person_id}).paginate(:page => params[:page], :per_page => 15) @people = Person.where(:id => profiles.map{|p| p.person_id}).paginate(:page => params[:page], :per_page => 15)

View file

@ -18,9 +18,14 @@
.span-15.append-1 .span-15.append-1
#people_stream.stream #people_stream.stream
- if @hashes.empty? - if @hashes.empty?
%p - if @background_query.present?
=t('.no_one_found') %p
=t('.searching')
:javascript
$(document).ready(function() { List.startSearchDelay('#{@background_query}') } );
- else
%p
=t('.no_one_found')
- else - else
- for hash in @hashes - for hash in @hashes
= render :partial => 'people/person', :locals => hash = render :partial => 'people/person', :locals => hash

View file

@ -536,6 +536,7 @@ en:
no_results: "Hey! You need to search for something." no_results: "Hey! You need to search for something."
couldnt_find_them_send_invite: "Couldn't find them? Send an invite!" couldnt_find_them_send_invite: "Couldn't find them? Send an invite!"
no_one_found: "...and no one was found." no_one_found: "...and no one was found."
searching: "searching, please be patient..."
looking_for: "Looking for posts tagged %{tag_link}?" looking_for: "Looking for posts tagged %{tag_link}?"
webfinger: webfinger:
fail: "Sorry, we couldn't find %{handle}." fail: "Sorry, we couldn't find %{handle}."

View file

@ -29,8 +29,8 @@ en:
my_stream: "Stream" my_stream: "Stream"
videos: videos:
watch: "Watch this video on <%= provider %>" watch: "Watch this video on <%= provider %>"
unknown: "Unknown video type" unknown: "Unknown video type"
search_for: "Search for <%= name %>" search_for: "Search for <%= name %>"
publisher: publisher:
at_least_one_aspect: "You must publish to at least one aspect" at_least_one_aspect: "You must publish to at least one aspect"
@ -73,6 +73,8 @@ en:
looking_good: "OMG, you look awesome!" looking_good: "OMG, you look awesome!"
tags: tags:
wasnt_that_interesting: "OK, I suppose #<%= tagName %> wasn't all that interesting..." wasnt_that_interesting: "OK, I suppose #<%= tagName %> wasn't all that interesting..."
people:
not_found: "and no one was found..."
stream: stream:
hide: "Hide" hide: "Hide"

View file

@ -124,6 +124,7 @@ Diaspora::Application.routes.draw do
get 'community_spotlight' => "contacts#spotlight", :as => 'community_spotlight' get 'community_spotlight' => "contacts#spotlight", :as => 'community_spotlight'
get 'people/refresh_search' => "people#refresh_search"
resources :people, :except => [:edit, :update] do resources :people, :except => [:edit, :update] do
resources :status_messages resources :status_messages
resources :photos resources :photos

View file

@ -32,7 +32,26 @@ var List = {
}; };
} }
}); });
},
runDelayedSearch: function( searchTerm ) {
$.ajax({
dataType: 'json',
url: '/people/refresh_search',
data: { q: searchTerm },
success: List.handleSearchRefresh
});
},
handleSearchRefresh: function( data ) {
if ( data.search_count > 0 ) {
$("#people_stream.stream").html( data.search_html );
} else {
$("#people_stream.stream").html( "<p>" + Diaspora.I18n.t("people.not_found") + "</p>" );
}
},
startSearchDelay: function ( theSearch ) {
setTimeout( "List.runDelayedSearch('" + theSearch + "')", 10000);
} }
}; };
$(document).ready(function() { $(document).ready(function() {

View file

@ -5,4 +5,5 @@ Diaspora.Pages.ContactsIndex = function() {
self.infiniteScroll = self.instantiate("InfiniteScroll"); self.infiniteScroll = self.instantiate("InfiniteScroll");
$('.conversation_button').twipsy({position: 'below'}); $('.conversation_button').twipsy({position: 'below'});
}); });
}; };

View file

@ -0,0 +1,22 @@
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
describe PeopleController do
describe '#index' do
before do
sign_in :user, bob
end
it "generates a jasmine fixture with no query", :fixture => true do
get :index
save_fixture(html_for("body"), "empty_people_search")
end
it "generates a jasmine fixture trying an external search", :fixture => true do
get :index, :q => "sample@diaspor.us"
save_fixture(html_for("body"), "pending_external_people_search")
end
end
end

View file

@ -52,6 +52,11 @@ describe PeopleController do
get :index, :q => "Eugene@Example.ORG" get :index, :q => "Eugene@Example.ORG"
assigns[:people][0].id.should == @unsearchable_eugene.id assigns[:people][0].id.should == @unsearchable_eugene.id
end end
it 'sets the background query task' do
get :index, :q => "Eugene@Example.ORG"
assigns[:background_query].should == "eugene@example.org"
end
end end
context 'query is a tag' do context 'query is a tag' do
@ -77,6 +82,11 @@ describe PeopleController do
assigns[:hashes].should_not be_nil assigns[:hashes].should_not be_nil
end end
it 'does not set the background query task' do
get :index, :q => "Korth"
assigns[:background_query].should_not be_present
end
it "assigns people" do it "assigns people" do
eugene2 = Factory(:person, eugene2 = Factory(:person,
:profile => Factory.build(:profile, :first_name => "Eugene", :profile => Factory.build(:profile, :first_name => "Eugene",
@ -351,6 +361,34 @@ describe PeopleController do
end end
end end
describe '#refresh_search ' do
before(:each)do
@eugene = Factory(:person,
:profile => Factory.build(:profile, :first_name => "Eugene", :last_name => "w"))
@korth = Factory(:person,
:profile => Factory.build(:profile, :first_name => "Evan", :last_name => "Korth"))
end
describe 'via json' do
it 'returns a zero count when a search fails' do
get :refresh_search, :q => "weweweKorth", :format => 'json'
response.body.should == {:search_count=>0, :search_html=>""}.to_json
end
it 'returns with a zero count unless a fully composed name is sent' do
get :refresh_search, :q => "Korth"
response.body.should == {:search_count=>0, :search_html=>""}.to_json
end
it 'returns with a found name' do
get :refresh_search, :q => @korth.diaspora_handle
JSON.parse( response.body )["search_count"].should == 1
end
end
end
describe '#contacts' do describe '#contacts' do
it 'assigns the contacts of a person' do it 'assigns the contacts of a person' do
contact = alice.contact_for(bob.person) contact = alice.contact_for(bob.person)

View file

@ -0,0 +1,31 @@
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
*/
describe("List", function() {
describe("runDelayedSearch", function() {
beforeEach( function(){
});
it('gets called on initialize', function(){
spyOn( List, 'startSearchDelay');
spec.loadFixture('pending_external_people_search');
expect(List.startSearchDelay).toHaveBeenCalled();
});
});
describe("runDelayedSearch", function() {
beforeEach( function(){
spec.loadFixture('empty_people_search');
List.initialize();
});
it('inserts contact html', function(){
List.handleSearchRefresh( { count:1,search_html: '<div class='testing_insert_div'>hello</div>' } );
expect($(".testing_insert_div").text().toEqual( "hello" ));
});
});
});