Select which key entries to show on the client
authorTom Hughes <tom@compton.nu>
Fri, 31 Aug 2012 09:29:32 +0000 (10:29 +0100)
committerTom Hughes <tom@compton.nu>
Fri, 31 Aug 2012 09:29:32 +0000 (10:29 +0100)
Rather than requesting a new key every time the zoom or layer
changes, serve up all the entries initially with appropriate
annotations to allow the client to decide which ones to show.

app/assets/javascripts/key.js
app/views/site/key.html.erb
config/routes.rb
test/functional/site_controller_test.rb

index d22738a..daff6ee 100644 (file)
@@ -4,13 +4,25 @@ $(document).ready(function () {
         title = $(this).text();
 
     function updateMapKey() {
-      $("#sidebar_content").load(url, {
-        layer: map.baseLayer.keyid,
-        zoom: map.getZoom()
+      var mapLayer = map.baseLayer.keyid,
+          mapZoom = map.getZoom();
+
+      $(".mapkey-table-entry").each(function () {
+        var entryLayer = $(this).attr("data-layer"),
+            entryZoomMin = parseInt($(this).attr("data-zoom-min")),
+            entryZoomMax = parseInt($(this).attr("data-zoom-max"));
+
+        if (mapLayer == entryLayer &&
+            mapZoom >= entryZoomMin && mapZoom <= entryZoomMax) {
+          $(this).show();
+        } else {
+          $(this).hide();
+        }
       });
     }
 
-    updateMapKey();
+    $("#sidebar_content").load(url, updateMapKey);
+
     openSidebar({ title: title });
 
     $("#sidebar").one("closed", function () {
index ed36c01..d401b4c 100644 (file)
@@ -1,19 +1,15 @@
 <div id="mapkey">
   <table class="mapkey-table">
     <% YAML.load_file("#{Rails.root}/config/key.yml").each do |name,data| %>
-      <% if params[:layer] == name %>
-        <% data.each do |entry| %>
-          <% if params[:zoom].to_i >= entry['min_zoom'] && params[:zoom].to_i <= entry['max_zoom'] %>
-            <tr>
-              <td class="mapkey-table-key">
-                <%= image_tag "key/#{name}/#{entry['image']}" %>
-              </td>
-              <td class="mapkey-table-value">
-                <%= [*t("site.key.table.entry.#{entry['name']}")].to_sentence %>
-              </td>
-            </tr>
-          <% end %>
-        <% end %>
+      <% data.each do |entry| %>
+        <tr class="mapkey-table-entry" data-layer="<%= name %>" data-zoom-min="<%= entry['min_zoom'] %>" data-zoom-max="<%= entry['max_zoom'] %>">
+          <td class="mapkey-table-key">
+            <%= image_tag "key/#{name}/#{entry['image']}" %>
+          </td>
+          <td class="mapkey-table-value">
+            <%= [*t("site.key.table.entry.#{entry['name']}")].to_sentence %>
+          </td>
+        </tr>
       <% end %>
     <% end %>
   </table>
index 1ef0c31..955c570 100644 (file)
@@ -106,7 +106,7 @@ OpenStreetMap::Application.routes.draw do
   match '/login' => 'user#login', :via => [:get, :post]
   match '/logout' => 'user#logout', :via => [:get, :post]
   match '/offline' => 'site#offline', :via => :get
-  match '/key' => 'site#key', :via => :post
+  match '/key' => 'site#key', :via => :get
   match '/user/new' => 'user#new', :via => :get
   match '/user/terms' => 'user#terms', :via => [:get, :post]
   match '/user/save' => 'user#save', :via => :post
index 86445e5..55dff2d 100644 (file)
@@ -47,7 +47,7 @@ class SiteControllerTest < ActionController::TestCase
       { :controller => "site", :action => "offline" }
     )
     assert_routing(
-      { :path => "/key", :method => :post },
+      { :path => "/key", :method => :get },
       { :controller => "site", :action => "key" }
     )
     assert_routing(