If a search only finds one result then jump straight to it instead of
opening a list of results.
This commit is contained in:
parent
4f26daaa10
commit
034982a12f
4 changed files with 62 additions and 16 deletions
|
@ -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
|
||||||
|
|
|
@ -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? %>
|
|
@ -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'
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue