Only one pane visible at a time
authorJohn Firebaugh <john.firebaugh@gmail.com>
Wed, 12 Jun 2013 21:11:38 +0000 (14:11 -0700)
committerJohn Firebaugh <john.firebaugh@gmail.com>
Thu, 18 Jul 2013 17:45:15 +0000 (10:45 -0700)
app/assets/javascripts/index.js
app/assets/javascripts/leaflet.key.js
app/assets/javascripts/leaflet.layers.js
app/assets/javascripts/leaflet.share.js
app/assets/javascripts/leaflet.sidebar.js [new file with mode: 0644]

index 9a975c11c1d4884c7f3adf2e00e7961e7c2bdd99..ffe12ecc6a6169783a10cf698e1e258a0dab7b5b 100644 (file)
@@ -1,4 +1,5 @@
 //= require_self
+//= require leaflet.sidebar
 //= require leaflet.customzoom
 //= require leaflet.locate
 //= require leaflet.layers
@@ -61,27 +62,27 @@ $(document).ready(function () {
   L.control.locate({position: 'topright'})
     .addTo(map);
 
-  var uiPane = $('#map-ui')[0];
+  var sidebar = L.OSM.sidebar('#map-ui');
 
   L.OSM.layers({
     position: 'topright',
     layers: layers,
-    uiPane: uiPane
+    sidebar: sidebar
   }).addTo(map);
 
   L.OSM.key({
     position: 'topright',
-    uiPane: uiPane
+    sidebar: sidebar
   }).addTo(map);
 
   L.OSM.note({
     position: 'topright',
-    uiPane: uiPane
+    sidebar: sidebar
   }).addTo(map);
 
   L.OSM.share({
     getUrl: getShortUrl,
-    uiPane: uiPane
+    sidebar: sidebar
   }).addTo(map);
 
   L.control.scale()
index 4906cfcff67d8ae874c1e2fc5f92d027289ebfeb..9fe457851f35dad9ed907a36a1fe65bb44875e19 100644 (file)
@@ -8,14 +8,13 @@ L.OSM.key = function (options) {
     $('<a>')
       .attr('class', 'control-button')
       .attr('href', '#')
-      .attr('title', I18n.t("javascripts.key.tooltip"))
+      .attr('title', I18n.t('javascripts.key.tooltip'))
       .html('<span class="icon key"></span>')
       .on('click', toggle)
       .appendTo($container);
 
     var $ui = $('<div>')
-      .attr('class', 'layers-ui')
-      .appendTo(options.uiPane);
+      .attr('class', 'layers-ui');
 
     $('<h2>')
       .text(I18n.t('javascripts.key.title'))
@@ -24,32 +23,34 @@ L.OSM.key = function (options) {
     var $section = $('<section>')
       .appendTo($ui);
 
+    options.sidebar.addPane($ui);
+
+    $ui
+      .on('show', shown)
+      .on('hide', hidden);
+
+    function shown() {
+      map.on('zoomend baselayerchange', update);
+      $section.load('/key', update);
+    }
+
+    function hidden() {
+      map.off('zoomend baselayerchange', update);
+    }
+
     function toggle(e) {
       e.stopPropagation();
       e.preventDefault();
-
-      var controlContainer = $('.leaflet-control-container .leaflet-top.leaflet-right');
-
-      if ($ui.is(':visible')) {
-        $(options.uiPane).hide();
-        controlContainer.css({paddingRight: '0'});
-        map.off("zoomend baselayerchange", update);
-      } else {
-        $(options.uiPane).show();
-        controlContainer.css({paddingRight: '200px'});
-        map.on("zoomend baselayerchange", update);
-        $section.load('/key', update);
-      }
+      options.sidebar.togglePane($ui);
     }
 
     function update() {
-      var mapLayer = getMapBaseLayerId(map),
-        mapZoom = map.getZoom();
+      var layer = getMapBaseLayerId(map),
+        zoom = map.getZoom();
 
-      $(".mapkey-table-entry").each(function () {
+      $('.mapkey-table-entry').each(function () {
         var data = $(this).data();
-
-        if (mapLayer == data.layer && mapZoom >= data.zoomMin && mapZoom <= data.zoomMax) {
+        if (layer == data.layer && zoom >= data.zoomMin && zoom <= data.zoomMax) {
           $(this).show();
         } else {
           $(this).hide();
index bbc84701cfa7a36f405db7e6250e985c1b2d3300..2bc53879838a492fb710356581a48296116e2315 100644 (file)
@@ -16,8 +16,7 @@ L.OSM.layers = function(options) {
       .appendTo($container);
 
     var $ui = $('<div>')
-      .attr('class', 'layers-ui')
-      .appendTo(options.uiPane);
+      .attr('class', 'layers-ui');
 
     $('<h2>')
       .text(I18n.t('javascripts.map.layers.header'))
@@ -124,25 +123,23 @@ L.OSM.layers = function(options) {
       });
     });
 
-    function toggle(e) {
-      e.stopPropagation();
-      e.preventDefault();
+    options.sidebar.addPane($ui);
 
-      var controlContainer = $('.leaflet-control-container .leaflet-top.leaflet-right');
-
-      if ($ui.is(':visible')) {
-        $(control.options.uiPane).hide();
-        controlContainer.css({paddingRight: '0'});
-      } else {
-        $(control.options.uiPane).show();
-        controlContainer.css({paddingRight: '230px'});
-      }
+    $ui
+      .on('show', shown);
 
+    function shown() {
       $ui.find('.base-layers .leaflet-container').each(function() {
         $(this).data('map').invalidateSize();
       });
     }
 
+    function toggle(e) {
+      e.stopPropagation();
+      e.preventDefault();
+      options.sidebar.togglePane($ui);
+    }
+
     return $container[0];
   };
 
index 548be3fccbaf4b2378575e105a84f2d381ac4ac2..6653a5b92019874deb31cab8406f23009bff2de1 100644 (file)
@@ -14,8 +14,7 @@ L.OSM.share = function (options) {
       .appendTo($container);
 
     var $ui = $('<div>')
-      .attr('class', 'share-ui')
-      .appendTo(options.uiPane);
+      .attr('class', 'share-ui');
 
     $('<h2>')
       .text(I18n.t('javascripts.share.title'))
@@ -26,19 +25,12 @@ L.OSM.share = function (options) {
 
     map.on('moveend layeradd layerremove', update);
 
+    options.sidebar.addPane($ui);
+
     function toggle(e) {
       e.stopPropagation();
       e.preventDefault();
-
-      var controlContainer = $('.leaflet-control-container .leaflet-top.leaflet-right');
-
-      if ($ui.is(':visible')) {
-        $(control.options.uiPane).hide();
-        controlContainer.css({paddingRight: '0'});
-      } else {
-        $(control.options.uiPane).show();
-        controlContainer.css({paddingRight: '200px'});
-      }
+      options.sidebar.togglePane($ui);
     }
 
     function update() {
diff --git a/app/assets/javascripts/leaflet.sidebar.js b/app/assets/javascripts/leaflet.sidebar.js
new file mode 100644 (file)
index 0000000..a6529ad
--- /dev/null
@@ -0,0 +1,35 @@
+L.OSM.sidebar = function(selector) {
+  var control = {},
+    sidebar = $(selector),
+    current = $();
+
+  control.addPane = function(pane) {
+    pane
+      .hide()
+      .appendTo(sidebar);
+  };
+
+  control.togglePane = function(pane) {
+    var controlContainer = $('.leaflet-control-container .leaflet-top.leaflet-right');
+
+    current
+      .hide()
+      .trigger('hide');
+
+    if (current === pane) {
+      $(sidebar).hide();
+      controlContainer.css({paddingRight: '0'});
+      current = $();
+    } else {
+      $(sidebar).show();
+      controlContainer.css({paddingRight: '200px'});
+      current = pane;
+    }
+
+    current
+      .show()
+      .trigger('show');
+  };
+
+  return control;
+};