From fec9dc84c05a496141d4e7fedd21765ddcceba06 Mon Sep 17 00:00:00 2001 From: Aaron Lidman Date: Thu, 14 Nov 2013 17:41:12 -0800 Subject: [PATCH] No hash on browse pages, closes #35 --- app/assets/javascripts/index.js | 7 +++ app/assets/javascripts/index/export.js | 1 + app/assets/javascripts/index/new_note.js.erb | 2 + app/assets/javascripts/index/note.js.erb | 3 ++ app/assets/javascripts/index/search.js | 2 + app/assets/javascripts/leaflet.map.js.erb | 11 +++++ app/assets/javascripts/osm.js.erb | 2 +- app/assets/javascripts/router.js | 47 ++++++++++++-------- 8 files changed, 56 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 9514fd5f0..6e60d5666 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -203,6 +203,11 @@ $(document).ready(function () { map.invalidateSize({pan: false}) .panBy([-300, 0], {animate: false}); OSM.loadSidebarContent(path); + page.load(); + }; + + page.load = function() { + return map.getState(); }; page.popstate = function(path) { @@ -256,6 +261,8 @@ $(document).ready(function () { "/browse/:type/:id(/history)": OSM.Browse(map) }); + OSM.route.load(); + $(document).on("click", "a", function(e) { if (e.isDefaultPrevented() || e.isPropagationStopped()) return; if (this.host === window.location.host && OSM.route(this.pathname + this.search + this.hash)) e.preventDefault(); diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index 851dbb9ae..3d1dd3ce3 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -64,6 +64,7 @@ OSM.Export = function(map) { $("#sidebar_content .close").on("click", page.minimizeSidebar); update(); + return map.getState(); }; page.unload = function() { diff --git a/app/assets/javascripts/index/new_note.js.erb b/app/assets/javascripts/index/new_note.js.erb index 780bccbca..580d7a79b 100644 --- a/app/assets/javascripts/index/new_note.js.erb +++ b/app/assets/javascripts/index/new_note.js.erb @@ -149,6 +149,8 @@ OSM.NewNote = function(map) { e.preventDefault(); createNote(newNote, e.target.form, '/api/0.6/notes.json'); }); + + return map.getState(); }; page.unload = function () { diff --git a/app/assets/javascripts/index/note.js.erb b/app/assets/javascripts/index/note.js.erb index 5022cfb80..a98cea307 100644 --- a/app/assets/javascripts/index/note.js.erb +++ b/app/assets/javascripts/index/note.js.erb @@ -72,6 +72,9 @@ OSM.Note = function (map) { if (!noteState) map.addLayer(noteLayer); if (window.location.hash == "") { var coords = data.coordinates.split(','); + OSM.route.moveListenerOff(); + map.once('moveend', OSM.route.moveListenerOn); + map.getZoom() > 15 ? map.panTo(coords) : map.setView(coords, 16); } diff --git a/app/assets/javascripts/index/search.js b/app/assets/javascripts/index/search.js index 43142959b..6efba746e 100644 --- a/app/assets/javascripts/index/search.js +++ b/app/assets/javascripts/index/search.js @@ -70,6 +70,8 @@ OSM.Search = function(map) { } }); }); + + return map.getState(); }; page.unload = function() { diff --git a/app/assets/javascripts/leaflet.map.js.erb b/app/assets/javascripts/leaflet.map.js.erb index f598a4839..dec544d33 100644 --- a/app/assets/javascripts/leaflet.map.js.erb +++ b/app/assets/javascripts/leaflet.map.js.erb @@ -220,6 +220,9 @@ L.OSM.Map = L.Map.extend({ var bounds = map._objectLayer.getBounds(); if (bounds.isValid()) { + OSM.route.moveListenerOff(); + map.once('moveend', OSM.route.moveListenerOn); + map.fitBounds(bounds); } } @@ -230,6 +233,14 @@ L.OSM.Map = L.Map.extend({ this._object = null; if (this._objectLoader) this._objectLoader.abort(); if (this._objectLayer) this.removeLayer(this._objectLayer); + }, + + getState: function() { + return { + center: this.getCenter().wrap(), + zoom: this.getZoom(), + layers: this.getLayersCode() + } } }); diff --git a/app/assets/javascripts/osm.js.erb b/app/assets/javascripts/osm.js.erb index cb3737351..4c5faa829 100644 --- a/app/assets/javascripts/osm.js.erb +++ b/app/assets/javascripts/osm.js.erb @@ -147,7 +147,7 @@ OSM = { zoom = args.getZoom(); layers = args.getLayersCode(); } else { - center = L.latLng(args.lat, args.lon); + center = args.center || L.latLng(args.lat, args.lon); zoom = args.zoom; layers = args.layers || ''; } diff --git a/app/assets/javascripts/router.js b/app/assets/javascripts/router.js index 33182c292..cbd418895 100644 --- a/app/assets/javascripts/router.js +++ b/app/assets/javascripts/router.js @@ -28,7 +28,7 @@ OSM.Router = function(map, rts) { }); } - (controller[action] || $.noop).apply(controller, params); + return (controller[action] || $.noop).apply(controller, params); }; return route; @@ -48,19 +48,9 @@ OSM.Router = function(map, rts) { currentRoute = routes.recognize(currentPath), currentHash = location.hash || OSM.formatHash(map); - currentRoute.run('load', currentPath); - var router, stateChange; if (window.history && window.history.pushState) { - stateChange = function(state, hash) { - window.history.replaceState(state, document.title, hash); - }; - - // Set a non-null initial state, so that the e.originalEvent.state - // check below works correctly when going back to the initial page. - stateChange(OSM.parseHash(currentHash), currentPath + currentHash); - $(window).on('popstate', function(e) { if (!e.originalEvent.state) return; // Is it a real popstate event or just a hash change? var path = window.location.pathname + window.location.search; @@ -86,22 +76,30 @@ OSM.Router = function(map, rts) { currentRoute = route; currentRoute.run('pushstate', currentPath); return true; - } - } else { - stateChange = function(state, hash) { - window.location.replace(hash); }; + router.stateChange = function(state) { + if (state.center) { + window.history.replaceState(state, document.title, OSM.formatHash(state)); + } else { + window.history.replaceState(state, document.title, window.location); + } + }; + } else { router = function (url) { window.location.assign(url); - } + }; + + router.stateChange = function(state) { + if (state.center) window.location.replace(OSM.formatHash(state)); + }; } router.updateHash = function() { var hash = OSM.formatHash(map); if (hash === currentHash) return; currentHash = hash; - stateChange(OSM.parseHash(hash), hash); + router.stateChange(OSM.parseHash(hash)); }; router.hashUpdated = function() { @@ -112,7 +110,20 @@ OSM.Router = function(map, rts) { if (!state) return; map.setView(state.center, state.zoom); map.updateLayers(state.layers); - stateChange(state, hash); + router.stateChange(state, hash); + }; + + router.moveListenerOn = function() { + map.on('moveend', router.updateHash); + }; + + router.moveListenerOff = function() { + map.off('moveend', router.updateHash); + }; + + router.load = function() { + var loadState = currentRoute.run('load', currentPath); + router.stateChange(loadState || {}); }; map.on('moveend baselayerchange overlaylayerchange', router.updateHash); -- 2.43.2