If a search only finds one result then jump straight to it instead of

opening a list of results.
This commit is contained in:
Tom Hughes 2007-08-24 17:38:36 +00:00
parent 4f26daaa10
commit 034982a12f
4 changed files with 62 additions and 16 deletions

View file

@ -4,18 +4,30 @@ class GeocoderController < ApplicationController
require 'rexml/document' require 'rexml/document'
def search def search
@query = params[:query] query = params[:query]
@results = Array.new results = Array.new
if @query.match(/^\d{5}(-\d{4})?$/) if query.match(/^\d{5}(-\d{4})?$/)
@results.push search_us_postcode(@query) results.push search_us_postcode(query)
elsif @query.match(/(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})/i) elsif query.match(/(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})/i)
@results.push search_uk_postcode(@query) results.push search_uk_postcode(query)
elsif @query.match(/[A-Z]\d[A-Z]\s*\d[A-Z]\d/i) elsif query.match(/[A-Z]\d[A-Z]\s*\d[A-Z]\d/i)
@results.push search_ca_postcode(@query) results.push search_ca_postcode(query)
else else
@results.push search_osm_namefinder(@query) results.push search_osm_namefinder(query)
@results.push search_geonames(@query) results.push search_geonames(query)
end
results_count = count_results(results)
render :update do |page|
if results_count == 1
position = results.collect { |s| s[:results] }.compact.flatten[0]
page.call "setPosition", position[:lat], position[:lon], position[:zoom]
else
page.replace_html :search_results_content, :partial => 'results', :object => results
page.call "openSearchResults"
end
end end
end end
@ -162,4 +174,14 @@ private
return "north-west" if bearing >= 292.5 and bearing < 337.5 return "north-west" if bearing >= 292.5 and bearing < 337.5
return "west" return "west"
end end
def count_results(results)
count = 0
results.each do |source|
count += source[:results].length if source[:results]
end
return count
end
end end

View file

@ -1,4 +1,4 @@
<% @results.each do |source| %> <% results.each do |source| %>
<p class="search_results_heading">Results from <%= link_to source[:source], source[:url] %></p> <p class="search_results_heading">Results from <%= link_to source[:source], source[:url] %></p>
<% if source[:results] %> <% if source[:results] %>
<% if source[:results].empty? %> <% if source[:results].empty? %>

View file

@ -11,9 +11,18 @@
<script type="text/javascript"> <script type="text/javascript">
<!-- <!--
function startSearch() {
$("search_field").style.display = "none";
$("search_active").style.display = "inline";
}
function endSearch() {
$("search_field").style.display = "inline";
$("search_active").style.display = "none";
}
function openSearchResults() { function openSearchResults() {
$("search_results").style.display = "block"; $("search_results").style.display = "block";
$("search_results_content").innerHTML = "<p class='search_results_entry'>Searching...</p>";
<%= onopen %> <%= onopen %>
} }
@ -23,8 +32,8 @@
} }
<% if params[:query] %> <% if params[:query] %>
<%= remote_function(:update => :search_results_content, <%= remote_function(:loading => "startSearch()",
:loading => "openSearchResults()", :complete => "endSearch()",
:url => { :controller => :geocoder, :action => :search, :query => params[:query] }) %> :url => { :controller => :geocoder, :action => :search, :query => params[:query] }) %>
<% end %> <% end %>
// --> // -->
@ -33,11 +42,16 @@
<% content_for "optionals" do %> <% content_for "optionals" do %>
<div class="optionalbox"> <div class="optionalbox">
<span class="oboxheader">Search</span> <span class="oboxheader">Search</span>
<% form_remote_tag(:update => :search_results_content, <div class="search_form">
:loading => "openSearchResults()", <span id="search_field">
<% form_remote_tag(:loading => "startSearch()",
:complete => "endSearch()",
:url => { :controller => :geocoder, :action => :search }) do %> :url => { :controller => :geocoder, :action => :search }) do %>
<%= text_field_tag :query, params[:query] %> <%= text_field_tag :query, params[:query] %>
<% end %> <% end %>
</span>
<p id="search_active">Searching...</p>
</div>
<p class="search_help"> <p class="search_help">
examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ',
or 'post offices near Lünen' or 'post offices near Lünen'

View file

@ -351,6 +351,16 @@ hides rule from IE5-Mac \*/
width: 100%; width: 100%;
} }
.search_form {
height: 16px;
padding-bottom: 2px;
}
#search_active {
display: none;
color: red;
}
.rsssmall { .rsssmall {
position: relative; position: relative;
top: 4px; top: 4px;