Convert search to pushState
This commit is contained in:
parent
60170d7069
commit
35458c0096
7 changed files with 57 additions and 54 deletions
|
@ -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));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 %>
|
||||||
|
|
|
@ -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 %>
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue