Convert search to pushState
authorJohn Firebaugh <john.firebaugh@gmail.com>
Fri, 4 Oct 2013 21:24:25 +0000 (14:24 -0700)
committerJohn Firebaugh <john.firebaugh@gmail.com>
Sun, 13 Oct 2013 21:46:08 +0000 (14:46 -0700)
app/assets/javascripts/index.js
app/assets/javascripts/index/search.js
app/assets/javascripts/router.js
app/controllers/geocoder_controller.rb
app/views/geocoder/search.html.erb
app/views/layouts/map.html.erb
config/routes.rb

index 62d47a3afc6de7093a51227f2edb6cd810750c1e..91855f823c295407dd9dce453f9e0c1cfc55db71 100644 (file)
@@ -210,7 +210,6 @@ $(document).ready(function () {
     });
   }
 
-  initializeSearch(map);
   initializeBrowse(map, params);
   initializeNotes(map, params);
 
@@ -249,6 +248,7 @@ $(document).ready(function () {
 
   var router = OSM.Router({
     "/":                           OSM.Index(map),
+    "/search":                     OSM.Search(map),
     "/export":                     OSM.Export(map),
     "/browse/changesets":          OSM.ChangesetList(map),
     "/browse/:type/:id(/history)": OSM.Browse(map)
@@ -257,4 +257,14 @@ $(document).ready(function () {
   $(document).on("click", "a", function(e) {
     if (router(this.pathname + this.search + this.hash)) e.preventDefault();
   });
+
+  $("#search_form").on("submit", function(e) {
+    e.preventDefault();
+    router("/search?query=" + encodeURIComponent($("#query").val()) + OSM.formatHash(map));
+  });
+
+  $("#describe_location").on("click", function(e) {
+    e.preventDefault();
+    router("/search?query=" + encodeURIComponent(map.getCenter().lat + "," + map.getCenter().lng));
+  });
 });
index c546469db941a258ee72694481872f546d30b028..d881facbcc94e046ea425d571c9e81e8cfdbbeef 100644 (file)
@@ -1,11 +1,4 @@
-function initializeSearch(map) {
-  $("#search_form").submit(submitSearch);
-  $("#describe_location").click(describeLocation);
-
-  if ($("#query").val()) {
-    $("#search_form").submit();
-  }
-
+OSM.Search = function(map) {
   $("#query")
     .on("focus", function() {
       $("#describe_location").fadeOut(100);
@@ -16,28 +9,6 @@ function initializeSearch(map) {
 
   $("#sidebar_content").on("click", ".search_results_entry a.set_position", clickSearchResult);
 
-  var marker = L.marker([0, 0], {icon: getUserIcon()});
-
-  function submitSearch(e) {
-    e.preventDefault();
-
-    var bounds = map.getBounds();
-
-    $("#sidebar_content").load($(this).attr("action"), {
-      query: $("#query").val(),
-      zoom: map.getZoom(),
-      minlon: bounds.getWest(),
-      minlat: bounds.getSouth(),
-      maxlon: bounds.getEast(),
-      maxlat: bounds.getNorth()
-    });
-
-    $("#sidebar").one("closed", function () {
-      map.removeLayer(marker);
-      map.removeObject();
-    });
-  }
-
   function clickSearchResult(e) {
     e.preventDefault();
 
@@ -46,7 +17,7 @@ function initializeSearch(map) {
 
     if (data.minLon && data.minLat && data.maxLon && data.maxLat) {
       map.fitBounds([[data.minLat, data.minLon],
-                     [data.maxLat, data.maxLon]]);
+        [data.maxLat, data.maxLon]]);
     } else {
       map.setView(center, data.zoom);
     }
@@ -60,16 +31,41 @@ function initializeSearch(map) {
     }
   }
 
-  function describeLocation(e) {
-    e.preventDefault();
-
-    var center = map.getCenter(),
-      zoom = map.getZoom();
+  var marker = L.marker([0, 0], {icon: getUserIcon()});
 
-    $("#sidebar_content").load($(this).attr("href"), {
-      lat: center.lat,
-      lon: center.lng,
-      zoom: zoom
+  var page = {};
+
+  page.pushstate = page.popstate = function(path) {
+    var params = querystring.parse(path.substring(path.indexOf('?') + 1));
+    $("#query").val(params.query);
+    $("#sidebar_content").load(path, page.load);
+  };
+
+  page.load = function() {
+    $(".search_results_entry").each(function() {
+      var entry = $(this);
+      $.ajax({
+        url: entry.data("href"),
+        method: 'GET',
+        data: {
+          zoom: map.getZoom(),
+          minlon: map.getBounds().getWest(),
+          minlat: map.getBounds().getSouth(),
+          maxlon: map.getBounds().getEast(),
+          maxlat: map.getBounds().getNorth()
+        },
+        success: function(html) {
+          entry.html(html);
+        }
+      });
     });
-  }
-}
+  };
+
+  page.unload = function() {
+    map.removeLayer(marker);
+    map.removeObject();
+    $("#query").val("");
+  };
+
+  return page;
+};
index 7b2e9954622d40255298a839c177354ea1fb2578..654ec860b549b2483d2a8fea51a46edc9bc5eec7 100644 (file)
@@ -11,7 +11,7 @@ OSM.Router = function(rts) {
         .replace(namedParam, function(match, optional){
           return optional ? match : '([^\/]+)';
         })
-        .replace(splatParam, '(.*?)') + '(?:$|[?#])');
+        .replace(splatParam, '(.*?)') + '(?:\\?.*)?$');
 
     var route = {};
 
@@ -44,14 +44,14 @@ OSM.Router = function(rts) {
     }
   };
 
-  var currentPath = window.location.pathname,
+  var currentPath = window.location.pathname + window.location.search,
     currentRoute = routes.recognize(currentPath);
 
   currentRoute.run('load', currentPath);
 
   if (window.history && window.history.pushState) {
     $(window).on('popstate', function() {
-      var path = window.location.pathname;
+      var path = window.location.pathname + window.location.search;
       if (path === currentPath) return;
       currentRoute.run('unload');
       currentPath = path;
index ac6a2013ccdb62a926a6f85d4f5d023014cffbaf..592ff020abd2e9e4852de984aea25bb4f29cd18d 100644 (file)
@@ -28,6 +28,8 @@ class GeocoderController < ApplicationController
       @sources.push "osm_nominatim"
       @sources.push "geonames" if defined?(GEONAMES_USERNAME)
     end
+
+    render :layout => map_layout
   end
 
   def search_us_postcode
index 007516dd6cb1e8fda435c5f5d51160eb666a1572..b030dc71a70f6eb9d404afce9ba540d66e024c0b 100644 (file)
@@ -1,10 +1,7 @@
 <h2><%= t('site.sidebar.search_results') %></h2>
 <% @sources.each do |source| %>
   <h4><%= raw(t "geocoder.search.title.#{source}") %></h4>
-  <div class="search_results_entry" id="<%= "search_#{source}" %>">
+  <div class="search_results_entry" data-href="<%= url_for params.merge(:action => "search_#{source}") %>">
     <%= image_tag "searching.gif", :class => "search_searching" %>
   </div>
-  <script type="text/javascript">
-    $("#search_<%= source %>").load("<%= raw url_for params.merge(:action => "search_#{source}") %>");
-  </script>
 <% end %>
index 6e6caf95c6360cb98da014f713d9262a1af96f62..a8a15a30f0cbe4a0fbf07ad3e7b0aa423660b9ef 100644 (file)
@@ -6,14 +6,12 @@
 
 <% content_for :content do %>
   <div id="sidebar">
-    <%= form_tag url_for(:controller => :geocoder, :action => :search), :id => "search_form" do %>
+    <%= form_tag search_path, :id => "search_form" do %>
       <%= submit_tag t('site.search.submit_text') %>
       <div id='query_wrapper'>
         <%= text_field_tag :query, params[:query],
                            :placeholder => t('site.search.search') %>
-        <%= link_to t('site.search.where_am_i'),
-                    { :controller => :geocoder, :action => :description },
-                    { :id => "describe_location", :title => t('site.search.where_am_i_title') } %>
+        <%= link_to t('site.search.where_am_i'), '#', { :id => "describe_location", :title => t('site.search.where_am_i_title') } %>
       </div>
     <% end %>
 
index 1e0f508a1ae1a1e070b16a358d22b805af7ba358..231be4f43c93d44f924b4bb8b6e5ce15d0176e35 100644 (file)
@@ -215,7 +215,7 @@ OpenStreetMap::Application.routes.draw do
   match '/users/:status' => 'user#list', :via => [:get, :post]
 
   # geocoder
-  match '/geocoder/search' => 'geocoder#search', :via => :post
+  match '/search' => 'geocoder#search', :via => :get, :as => :search
   match '/geocoder/search_us_postcode' => 'geocoder#search_us_postcode', :via => :get
   match '/geocoder/search_uk_postcode' => 'geocoder#search_uk_postcode', :via => :get
   match '/geocoder/search_ca_postcode' => 'geocoder#search_ca_postcode', :via => :get