Convert search to pushState

This commit is contained in:
John Firebaugh 2013-10-04 14:24:25 -07:00
parent 60170d7069
commit 35458c0096
7 changed files with 57 additions and 54 deletions

View file

@ -210,7 +210,6 @@ $(document).ready(function () {
}); });
} }
initializeSearch(map);
initializeBrowse(map, params); initializeBrowse(map, params);
initializeNotes(map, params); initializeNotes(map, params);
@ -249,6 +248,7 @@ $(document).ready(function () {
var router = OSM.Router({ var router = OSM.Router({
"/": OSM.Index(map), "/": OSM.Index(map),
"/search": OSM.Search(map),
"/export": OSM.Export(map), "/export": OSM.Export(map),
"/browse/changesets": OSM.ChangesetList(map), "/browse/changesets": OSM.ChangesetList(map),
"/browse/:type/:id(/history)": OSM.Browse(map) "/browse/:type/:id(/history)": OSM.Browse(map)
@ -257,4 +257,14 @@ $(document).ready(function () {
$(document).on("click", "a", function(e) { $(document).on("click", "a", function(e) {
if (router(this.pathname + this.search + this.hash)) e.preventDefault(); 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));
});
}); });

View file

@ -1,11 +1,4 @@
function initializeSearch(map) { OSM.Search = function(map) {
$("#search_form").submit(submitSearch);
$("#describe_location").click(describeLocation);
if ($("#query").val()) {
$("#search_form").submit();
}
$("#query") $("#query")
.on("focus", function() { .on("focus", function() {
$("#describe_location").fadeOut(100); $("#describe_location").fadeOut(100);
@ -16,28 +9,6 @@ function initializeSearch(map) {
$("#sidebar_content").on("click", ".search_results_entry a.set_position", clickSearchResult); $("#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) { function clickSearchResult(e) {
e.preventDefault(); e.preventDefault();
@ -46,7 +17,7 @@ function initializeSearch(map) {
if (data.minLon && data.minLat && data.maxLon && data.maxLat) { if (data.minLon && data.minLat && data.maxLon && data.maxLat) {
map.fitBounds([[data.minLat, data.minLon], map.fitBounds([[data.minLat, data.minLon],
[data.maxLat, data.maxLon]]); [data.maxLat, data.maxLon]]);
} else { } else {
map.setView(center, data.zoom); map.setView(center, data.zoom);
} }
@ -60,16 +31,41 @@ function initializeSearch(map) {
} }
} }
function describeLocation(e) { var marker = L.marker([0, 0], {icon: getUserIcon()});
e.preventDefault();
var center = map.getCenter(), var page = {};
zoom = map.getZoom();
$("#sidebar_content").load($(this).attr("href"), { page.pushstate = page.popstate = function(path) {
lat: center.lat, var params = querystring.parse(path.substring(path.indexOf('?') + 1));
lon: center.lng, $("#query").val(params.query);
zoom: zoom $("#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;
};

View file

@ -11,7 +11,7 @@ OSM.Router = function(rts) {
.replace(namedParam, function(match, optional){ .replace(namedParam, function(match, optional){
return optional ? match : '([^\/]+)'; return optional ? match : '([^\/]+)';
}) })
.replace(splatParam, '(.*?)') + '(?:$|[?#])'); .replace(splatParam, '(.*?)') + '(?:\\?.*)?$');
var route = {}; 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 = routes.recognize(currentPath);
currentRoute.run('load', currentPath); currentRoute.run('load', currentPath);
if (window.history && window.history.pushState) { if (window.history && window.history.pushState) {
$(window).on('popstate', function() { $(window).on('popstate', function() {
var path = window.location.pathname; var path = window.location.pathname + window.location.search;
if (path === currentPath) return; if (path === currentPath) return;
currentRoute.run('unload'); currentRoute.run('unload');
currentPath = path; currentPath = path;

View file

@ -28,6 +28,8 @@ class GeocoderController < ApplicationController
@sources.push "osm_nominatim" @sources.push "osm_nominatim"
@sources.push "geonames" if defined?(GEONAMES_USERNAME) @sources.push "geonames" if defined?(GEONAMES_USERNAME)
end end
render :layout => map_layout
end end
def search_us_postcode def search_us_postcode

View file

@ -1,10 +1,7 @@
<h2><%= t('site.sidebar.search_results') %></h2> <h2><%= t('site.sidebar.search_results') %></h2>
<% @sources.each do |source| %> <% @sources.each do |source| %>
<h4><%= raw(t "geocoder.search.title.#{source}") %></h4> <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" %> <%= image_tag "searching.gif", :class => "search_searching" %>
</div> </div>
<script type="text/javascript">
$("#search_<%= source %>").load("<%= raw url_for params.merge(:action => "search_#{source}") %>");
</script>
<% end %> <% end %>

View file

@ -6,14 +6,12 @@
<% content_for :content do %> <% content_for :content do %>
<div id="sidebar"> <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') %> <%= submit_tag t('site.search.submit_text') %>
<div id='query_wrapper'> <div id='query_wrapper'>
<%= text_field_tag :query, params[:query], <%= text_field_tag :query, params[:query],
:placeholder => t('site.search.search') %> :placeholder => t('site.search.search') %>
<%= link_to t('site.search.where_am_i'), <%= link_to t('site.search.where_am_i'), '#', { :id => "describe_location", :title => t('site.search.where_am_i_title') } %>
{ :controller => :geocoder, :action => :description },
{ :id => "describe_location", :title => t('site.search.where_am_i_title') } %>
</div> </div>
<% end %> <% end %>

View file

@ -215,7 +215,7 @@ OpenStreetMap::Application.routes.draw do
match '/users/:status' => 'user#list', :via => [:get, :post] match '/users/:status' => 'user#list', :via => [:get, :post]
# geocoder # 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_us_postcode' => 'geocoder#search_us_postcode', :via => :get
match '/geocoder/search_uk_postcode' => 'geocoder#search_uk_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 match '/geocoder/search_ca_postcode' => 'geocoder#search_ca_postcode', :via => :get