From 034982a12fa025af8c1d381cd09483c97fb29dbe Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 24 Aug 2007 17:38:36 +0000 Subject: [PATCH] If a search only finds one result then jump straight to it instead of opening a list of results. --- app/controllers/geocoder_controller.rb | 44 ++++++++++++++----- .../geocoder/{search.rhtml => _results.rhtml} | 2 +- app/views/site/_search.rhtml | 24 +++++++--- public/stylesheets/site.css | 10 +++++ 4 files changed, 63 insertions(+), 17 deletions(-) rename app/views/geocoder/{search.rhtml => _results.rhtml} (93%) diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index 69c35e0e3..f557668b6 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -4,18 +4,30 @@ class GeocoderController < ApplicationController require 'rexml/document' def search - @query = params[:query] - @results = Array.new - - if @query.match(/^\d{5}(-\d{4})?$/) - @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) - @results.push search_uk_postcode(@query) - elsif @query.match(/[A-Z]\d[A-Z]\s*\d[A-Z]\d/i) - @results.push search_ca_postcode(@query) + query = params[:query] + results = Array.new + + if query.match(/^\d{5}(-\d{4})?$/) + 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) + results.push search_uk_postcode(query) + elsif query.match(/[A-Z]\d[A-Z]\s*\d[A-Z]\d/i) + results.push search_ca_postcode(query) else - @results.push search_osm_namefinder(@query) - @results.push search_geonames(@query) + results.push search_osm_namefinder(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 @@ -162,4 +174,14 @@ private return "north-west" if bearing >= 292.5 and bearing < 337.5 return "west" end + + def count_results(results) + count = 0 + + results.each do |source| + count += source[:results].length if source[:results] + end + + return count + end end diff --git a/app/views/geocoder/search.rhtml b/app/views/geocoder/_results.rhtml similarity index 93% rename from app/views/geocoder/search.rhtml rename to app/views/geocoder/_results.rhtml index 7ffde3194..477f2a0bc 100644 --- a/app/views/geocoder/search.rhtml +++ b/app/views/geocoder/_results.rhtml @@ -1,4 +1,4 @@ -<% @results.each do |source| %> +<% results.each do |source| %>

Results from <%= link_to source[:source], source[:url] %>

<% if source[:results] %> <% if source[:results].empty? %> diff --git a/app/views/site/_search.rhtml b/app/views/site/_search.rhtml index a9a3385c3..aa9294236 100644 --- a/app/views/site/_search.rhtml +++ b/app/views/site/_search.rhtml @@ -11,9 +11,18 @@