diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index dec2524ba..c733e5106 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -13,15 +13,16 @@ class PeopleController < ApplicationController @people = Person.search(params[:q]).paginate :page => params[:page], :per_page => 25, :order => 'created_at DESC' - - # dont do it@people.first.diaspora_handle == params[:q] - #only do it if it is an email address if params[:q].try(:match, Devise.email_regexp) webfinger(params[:q]) end - respond_with @people + if @people.count == 1 + redirect_to @people.first + else + respond_with @people + end end def show diff --git a/config/assets.yml b/config/assets.yml index 00225e26b..266ec6276 100644 --- a/config/assets.yml +++ b/config/assets.yml @@ -8,6 +8,7 @@ javascripts: - public/javascripts/rails.js - public/javascripts/vendor/jquery.infieldlabel.js - public/javascripts/vendor/jquery.tipsy.js + - public/javascripts/vendor/jquery.hotkeys.js - public/javascripts/vendor/fancybox/jquery.fancybox-1.3.1.pack.js - public/javascripts/vendor/fileuploader.js - public/javascripts/view.js diff --git a/public/javascripts/vendor/jquery.hotkeys.js b/public/javascripts/vendor/jquery.hotkeys.js new file mode 100644 index 000000000..5c9d557fd --- /dev/null +++ b/public/javascripts/vendor/jquery.hotkeys.js @@ -0,0 +1,99 @@ +/* + * jQuery Hotkeys Plugin + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Based upon the plugin by Tzury Bar Yochay: + * http://github.com/tzuryby/hotkeys + * + * Original idea by: + * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ +*/ + +(function(jQuery){ + + jQuery.hotkeys = { + version: "0.8", + + specialKeys: { + 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", + 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", + 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", + 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", + 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", + 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", + 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" + }, + + shiftNums: { + "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", + "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", + ".": ">", "/": "?", "\\": "|" + } + }; + + function keyHandler( handleObj ) { + // Only care when a possible input has been specified + if ( typeof handleObj.data !== "string" ) { + return; + } + + var origHandler = handleObj.handler, + keys = handleObj.data.toLowerCase().split(" "); + + handleObj.handler = function( event ) { + // Don't fire in text-accepting inputs that we didn't directly bind to + if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || + event.target.type === "text") ) { + return; + } + + // Keypress represents characters, not special keys + var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], + character = String.fromCharCode( event.which ).toLowerCase(), + key, modif = "", possible = {}; + + // check combinations (alt|ctrl|shift+anything) + if ( event.altKey && special !== "alt" ) { + modif += "alt+"; + } + + if ( event.ctrlKey && special !== "ctrl" ) { + modif += "ctrl+"; + } + + // TODO: Need to make sure this works consistently across platforms + if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { + modif += "meta+"; + } + + if ( event.shiftKey && special !== "shift" ) { + modif += "shift+"; + } + + if ( special ) { + possible[ modif + special ] = true; + + } else { + possible[ modif + character ] = true; + possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; + + // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" + if ( modif === "shift+" ) { + possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; + } + } + + for ( var i = 0, l = keys.length; i < l; i++ ) { + if ( possible[ keys[i] ] ) { + return origHandler.apply( this, arguments ); + } + } + }; + } + + jQuery.each([ "keydown", "keyup", "keypress" ], function() { + jQuery.event.special[ this ] = { add: keyHandler }; + }); + +})( jQuery ); diff --git a/public/javascripts/view.js b/public/javascripts/view.js index ec99c7793..2e0d51ae4 100644 --- a/public/javascripts/view.js +++ b/public/javascripts/view.js @@ -31,12 +31,15 @@ $(document).ready(function(){ $(this).fadeIn("slow"); }); - $("#global_search").hover( + $("#q").focus( function() { - $(this).fadeTo('fast', '1'); - }, + $(this).addClass('active'); + } + ); + + $("#q").blur( function() { - $(this).fadeTo('fast', '0.5'); + $(this).removeClass('active'); } ); @@ -77,6 +80,12 @@ $(document).ready(function(){ form.siblings('.spinner').show(); $('#request_result li:first').hide(); }); + + // hotkeys + $(window).bind('keyup', 'ctrl+f', function(){ + $("#q").focus(); + }); + });//end document ready @@ -142,3 +151,4 @@ $(".getting_started_box").live("click",function(evt){ 0 },function(evt){ $(this).css('left', '1000px')}); }); + diff --git a/public/stylesheets/sass/application.sass b/public/stylesheets/sass/application.sass index 3637fd008..e444e9b45 100644 --- a/public/stylesheets/sass/application.sass +++ b/public/stylesheets/sass/application.sass @@ -948,7 +948,6 @@ h1.big_text #global_search :display inline :position relative - :opacity 0.5 form :display inline @@ -960,6 +959,14 @@ h1.big_text :border none :background-color #fff + :opacity 0.5 + + &:hover + :opacity 0.8 + + &.active + :opacity 1 + input[type='text'] :width 200px :padding 2px diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb index b2d699a70..d73963caf 100644 --- a/spec/controllers/people_controller_spec.rb +++ b/spec/controllers/people_controller_spec.rb @@ -15,10 +15,14 @@ describe PeopleController do end describe '#index' do + before do + @eugene = Factory.create(:person, :profile => {:first_name => "Eugene", :last_name => "w"}) + @korth = Factory.create(:person, :profile => {:first_name => "Evan", :last_name => "Korth"}) + end + it "yields search results for substring of person name" do - eugene = Factory.create(:person, :profile => {:first_name => "Eugene", :last_name => "w"}) get :index, :q => "Eu" - assigns[:people].should include eugene + assigns[:people].should include @eugene end it 'shows a contact' do @@ -37,6 +41,16 @@ describe PeopleController do assigns[:people].should include user2.person response.should be_success end + + it "redirects to person page if there is exactly one match" do + get :index, :q => "Korth" + response.should redirect_to @korth + end + + it "does not redirect if there are no matches" do + get :index, :q => "Korthsauce" + response.should_not be_redirect + end end describe '#show' do