No hash on browse pages, closes #35
authorAaron Lidman <aaronlidman@gmail.com>
Fri, 15 Nov 2013 01:41:12 +0000 (17:41 -0800)
committerAaron Lidman <aaronlidman@gmail.com>
Fri, 15 Nov 2013 01:41:20 +0000 (17:41 -0800)
app/assets/javascripts/index.js
app/assets/javascripts/index/export.js
app/assets/javascripts/index/new_note.js.erb
app/assets/javascripts/index/note.js.erb
app/assets/javascripts/index/search.js
app/assets/javascripts/leaflet.map.js.erb
app/assets/javascripts/osm.js.erb
app/assets/javascripts/router.js

index 9514fd5f026e4ffda57e5e0e1e46da41cb428b57..6e60d5666de6a472e955898e2c7c1eab0a497658 100644 (file)
@@ -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();
index 851dbb9aef522c7cddf9f67ca21997293ec55e96..3d1dd3ce32aa2421f74c4611d6fa60847c2efe71 100644 (file)
@@ -64,6 +64,7 @@ OSM.Export = function(map) {
     $("#sidebar_content .close").on("click", page.minimizeSidebar);
 
     update();
+    return map.getState();
   };
 
   page.unload = function() {
index 780bccbca1958abe25bcc91badebc0095719a505..580d7a79b969a41ec1a71586250af2ab31d47dd1 100644 (file)
@@ -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 () {
index 5022cfb809b0740f657513af6e8ef96df310047e..a98cea307a4aa39c097410ff1244933b569be55a 100644 (file)
@@ -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);
     }
 
index 43142959b074d6c9586c238ea0bafc953e80063b..6efba746e54985ca4916bdc16ffdd96d1ae9cdab 100644 (file)
@@ -70,6 +70,8 @@ OSM.Search = function(map) {
         }
       });
     });
+
+    return map.getState();
   };
 
   page.unload = function() {
index f598a48393c9d0d8be108602a1b7c7bd814deb1a..dec544d336b133beb2e2d86b33d4025c15565663 100644 (file)
@@ -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()
+    }
   }
 });
 
index cb37373518341fb44807973da75bf0732dc53fff..4c5faa8293d959eff71b7d0e2a6abf3cb4d8915f 100644 (file)
@@ -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 || '';
     }
index 33182c2924b5758cd91ee8fff2fe72d94a52b6c2..cbd41889590b32114b9f8134511687278339ee90 100644 (file)
@@ -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);