Add 'history' tab + Move 'recent changes' changeset list to re-use the same _changese...
authorHarry Wood <mail@harrywood.co.uk>
Mon, 23 Mar 2009 16:39:59 +0000 (16:39 +0000)
committerHarry Wood <mail@harrywood.co.uk>
Mon, 23 Mar 2009 16:39:59 +0000 (16:39 +0000)
12 files changed:
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/controllers/export_controller.rb
app/views/browse/index.rhtml [deleted file]
app/views/changeset/_changeset.rhtml
app/views/changeset/_changeset_paging_nav.rhtml
app/views/changeset/list.rhtml
app/views/changeset/list_bbox.rhtml [new file with mode: 0644]
app/views/changeset/list_user.rhtml [new file with mode: 0644]
app/views/layouts/site.rhtml
app/views/site/index.rhtml
app/views/user/view.rhtml

index 237c57ab232db987f1b385100f01acf91289263f..10145a50a2d93c5e02d9626155ca7060b3dd8160 100644 (file)
@@ -7,9 +7,7 @@ class BrowseController < ApplicationController
   def start 
   end
   
-  def index
-    @changesets = Changeset.find(:all, :order => "closed_at DESC", :conditions => ['closed_at < ?', DateTime.now], :limit=> 20)
-  end
+  
   
   def relation 
     begin
index b2ff42711db55a59f35056993647417494252be5..ebad59aa038a6e6145e034cd850c79817285ca45 100644 (file)
@@ -238,6 +238,7 @@ class ChangesetController < ApplicationController
     conditions = cond_merge conditions, conditions_user(params['user'])
     conditions = cond_merge conditions, conditions_time(params['time'])
     conditions = cond_merge conditions, conditions_open(params['open'])
+    conditions = cond_merge conditions, conditions_closed(params['closed'])
 
     # create the results document
     results = OSM::API.new.get_xml_doc
@@ -291,21 +292,71 @@ class ChangesetController < ApplicationController
     render ex.render_opts
   end
 
+  
+  
   ##
-  # list edits belonging to a user
+  # list edits (open changesets) in reverse chronological order
   def list
+    conditions = conditions_nonempty
+    
+    
+   # @changesets = Changeset.find(:all, :order => "closed_at DESC", :conditions => ['closed_at < ?', DateTime.now], :limit=> 20)
+   
+   
+   #@edit_pages, @edits = paginate(:changesets,
+   #                                :include => [:user, :changeset_tags],
+   #                                :conditions => conditions,
+   #                                :order => "changesets.created_at DESC",
+   #                                :per_page => 20)
+   #
+    
+   @edits =  Changeset.find(:all,
+                                   :order => "changesets.created_at DESC",
+                                   :conditions => conditions,
+                                   :limit => 20)
+    
+  end
+  
+  ##
+  # list edits (changesets) belonging to a user
+  def list_user
+    #find user by display name   
     user = User.find(:first, :conditions => [ "visible = ? and display_name = ?", true, params[:display_name]])
+    
+    conditions = conditions_user(user.id);
+    conditions = cond_merge conditions, conditions_nonempty
     @edit_pages, @edits = paginate(:changesets,
                                    :include => [:user, :changeset_tags],
-                                   :conditions => ["changesets.user_id = ? AND min_lat IS NOT NULL", user.id],
+                                   :conditions => conditions,
                                    :order => "changesets.created_at DESC",
                                    :per_page => 20)
     
-    @action = 'list'
     @display_name = user.display_name
     # FIXME needs rescues in here
   end
-
+  
+  ##
+  # list changesets in a bbox
+  def list_bbox
+    # support 'bbox' param or alternatively 'minlon', 'minlat' etc       
+    if params['bbox']
+       bbox = params['bbox']
+    elsif params['minlon'] and params['minlat'] and params['maxlon'] and params['maxlat']          
+       bbox = params['minlon'] + ',' + params['minlat'] + ',' + params['maxlon'] + ',' + params['maxlat']
+    end
+       
+    conditions = conditions_bbox(bbox);
+    conditions = cond_merge conditions, conditions_nonempty
+    
+    @edit_pages, @edits = paginate(:changesets,
+                                   :include => [:user, :changeset_tags],
+                                   :conditions => conditions,
+                                   :order => "changesets.created_at DESC",
+                                   :per_page => 20)
+                                   
+    @bbox = sanitise_boundaries(bbox.split(/,/)) unless bbox==nil
+  end
+  
 private
   #------------------------------------------------------------
   # utility functions below.
@@ -317,7 +368,7 @@ private
     if a and b
       a_str = a.shift
       b_str = b.shift
-      return [ a_str + " and " + b_str ] + a + b
+      return [ a_str + " AND " + b_str ] + a + b
     elsif a 
       return a
     else b
@@ -366,7 +417,7 @@ private
   end
 
   ##
-  # restrict changes to those during a particular time period
+  # restrict changes to those closed during a particular time period
   def conditions_time(time) 
     unless time.nil?
       # if there is a range, i.e: comma separated, then the first is 
@@ -394,15 +445,28 @@ private
   end
 
   ##
-  # restrict changes to those which are open
-  #
-  # at the moment this code assumes we're only interested in open
-  # changesets and gives no facility to query closed changesets. this
-  # would be reasonably simple to implement if anyone actually wants
-  # it?
+  # return changesets which are open (haven't been closed yet)
+  # we do this by seeing if the 'closed at' time is in the future. Also if we've
+  # hit the maximum number of changes then it counts as no longer open.
+  # if parameter 'open' is nill then open and closed changsets are returned
   def conditions_open(open)
     return open.nil? ? nil : ['closed_at >= ? and num_changes <= ?', 
                               DateTime.now, Changeset::MAX_ELEMENTS]
   end
+  
+  ##
+  # query changesets which are closed
+  # ('closed at' time has passed or changes limit is hit)
+  def conditions_closed(closed)
+    return closed.nil? ? nil : ['closed_at < ? and num_changes > ?', 
+                              DateTime.now, Changeset::MAX_ELEMENTS]
+  end
 
+  ##
+  # eliminate empty changesets (where the bbox has not been set)
+  # this should be applied to all changeset list displays
+  def conditions_nonempty()
+    return ['min_lat IS NOT NULL']
+  end
+  
 end
index a773d4b72d2c177cadad071b0de2a77777f3f8f0..754cc4b8216b15acd900d3646cdb399c31d6faba 100644 (file)
@@ -2,18 +2,24 @@ class ExportController < ApplicationController
   def start
   end
 
+  #When the user clicks 'Export' we redirect to a URL which generates the export download
   def finish
     bbox = BoundingBox.new(params[:minlon], params[:minlat], params[:maxlon], params[:maxlat])
     format = params[:format]
 
     if format == "osm"
+      #redirect to API map get
       redirect_to "http://api.openstreetmap.org/api/#{API_VERSION}/map?bbox=#{bbox}"
+      
     elsif format == "mapnik"
+      #redirect to a special 'export' cgi script
       format = params[:mapnik_format]
       scale = params[:mapnik_scale]
 
       redirect_to "http://tile.openstreetmap.org/cgi-bin/export?bbox=#{bbox}&scale=#{scale}&format=#{format}"
+      
     elsif format == "osmarender"
+      #redirect to the t@h 'MapOf' service
       format = params[:osmarender_format]
       zoom = params[:osmarender_zoom].to_i
       width = bbox.slippy_width(zoom).to_i
diff --git a/app/views/browse/index.rhtml b/app/views/browse/index.rhtml
deleted file mode 100644 (file)
index fa7e13a..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<h2><%= @changesets.length %> Recently Closed Changesets</h2> 
-<ul id="recently_changed">
-<% @changesets.each do |changeset|
-   if changeset.user.data_public?
-     user = changeset.user.display_name
-   else
-     user = "(anonymous)"
-   end
-   
-   cmt = changeset.tags_as_hash['comment'].to_s
-   cmt = "(no comment)" if cmt.length == 0
-   text = "#{changeset.id} by #{user} - #{cmt}"
-%>
-   <li><%= link_to h(text), :action => "changeset", :id => changeset.id %></li>
-<% end %>
-</ul>
index 69d8933f650b630acb4f21d4e950fef329c1f7c5..67f3e72bb5a29c6f502af56246ba2ad42d51dff4 100644 (file)
@@ -8,9 +8,19 @@
     <% if changeset.closed_at > DateTime.now %> (still editing)
     <% else %><%= changeset.closed_at.strftime("%d %b %Y %H:%M") %><% end %>
 
+    
+  <%if showusername==true %>  
+         <td class="<%= cl %>">
+         <% if changeset.user.data_public? %>
+               <%= link_to h(changeset.user.display_name), :controller => "user", :action => "view", :display_name => changeset.user.display_name %>
+         <% else %>
+               <i>annon</i>
+         <% end %>
+  <% end %>
+    
   <td class="<%= cl %>">
     <% if changeset.tags['comment'] %>
-      <%= changeset.tags['comment'] %>
+      <%= h(changeset.tags['comment']) %>
     <% else %>
       (none)
     <% end %>
index df84a39306627cf1e34f396ecf9219e0e21ba0d6..7be15305df77a462b992731bd8c1c973992ff459 100644 (file)
@@ -7,6 +7,12 @@ if (current_page.first_item < current_page.last_item) # if more than 1 changeset
 end %>
 of <%= @edit_pages.item_count %>)
 
-<% if @edit_pages.page_count > 1 %>
- | <%= pagination_links_each(@edit_pages, {}) { |n| link_to(n, :display_name => @display_name, :page => n) }  %>
-<% end %>
+<%
+if @edit_pages.page_count > 1 
+       bboxparam = h(params['bbox'])
+       bboxparam = nil if bboxparam==""
+%>
+ | <%= pagination_links_each(@edit_pages, {}) { |n| link_to(n,  :display_name => @display_name, :bbox => bboxparam , :page => n) }  %>
+<%
+end
+%>
index cea15632086db50f7c9fcbaf7f6b6ae96ede2a4e..0edd951ce8c51810f1e126f8766b1464b204b6f4 100644 (file)
@@ -1,15 +1,19 @@
-<h1>Edits by <%= link_to(@display_name, {:controller=>'user', :action=>'view', :display_name=>@display_name}) %></h1>
-<%= render :partial => 'changeset_paging_nav' %>
+<h1>Recent Changes</h1>
 
+Recently closed changesets:
 <table id="keyvalue" cellpadding="3">
   <tr>
     <th>ID</th>
     <th>Saved at</th>
+    <th>User</th>
     <th>Comment</th>
     <th>Area</th>
     <th></th>
   </tr>
-  <%= render :partial => 'changeset', :collection => @edits unless @edits.nil? %>
+  <%= render :partial => 'changeset', :locals => {:showusername => true},  :collection => @edits unless @edits.nil?  %>
 </table>
 
-<%= render :partial => 'changeset_paging_nav' %>
+<p>
+For more changesets, select a user and view their edits, or see the editing 'history' of a specific area.
+</p>
+<br>   
diff --git a/app/views/changeset/list_bbox.rhtml b/app/views/changeset/list_bbox.rhtml
new file mode 100644 (file)
index 0000000..f1d8633
--- /dev/null
@@ -0,0 +1,50 @@
+<h1>History</h1>
+<%
+if @bbox!=nil
+       lon1 = @bbox[0] 
+       lat1 = @bbox[1] 
+       lon2 = @bbox[2]
+       lat2 = @bbox[3] 
+
+       %>
+<p>
+Changsets within the area: 
+(<a href='/?lat=<%= lat1 %>&lon=<%= lon1 %>&zoom=14'><%= format("%0.3f",lat1) -%>,<%= format("%0.3f",lon1) -%></a>) to 
+(<a href='/?lat=<%= lat2 %>&lon=<%= lon2 %>&zoom=14'><%= format("%0.3f",lat2) -%>,<%= format("%0.3f",lon2) -%></a>)   
+</p>
+
+<%     if @edits.nil? or @edits.empty? %>
+<p><b>No changesets</b></p>
+<%     else %>
+
+<%= render :partial => 'changeset_paging_nav' %>
+
+<table id="keyvalue" cellpadding="3">
+  <tr>
+    <th>ID</th>
+    <th>Saved at</th>
+    <th>User</th>
+    <th>Comment</th>
+    <th>Area</th>
+    <th></th>
+  </tr>
+  <%= render :partial => 'changeset', :locals => {:showusername => true}, :collection => @edits unless @edits.nil? %>
+</table>
+
+<%= render :partial => 'changeset_paging_nav' %>
+
+<%
+       end
+
+else 
+       #bbox is nil. happens if the user surfs to this page directly.
+%>
+
+<p>No area specified</p>
+<p>First use the <a href="/" title="view the map">view tab</a> to pan and zoom to an area of interest, then click the history tab</p>
+
+<%
+end
+%>
+<br>
+<br>
diff --git a/app/views/changeset/list_user.rhtml b/app/views/changeset/list_user.rhtml
new file mode 100644 (file)
index 0000000..a2096ad
--- /dev/null
@@ -0,0 +1,15 @@
+<h1>Edits by <%= link_to(@display_name, {:controller=>'user', :action=>'view', :display_name=>@display_name}) %></h1>
+<%= render :partial => 'changeset_paging_nav' %>
+
+<table id="keyvalue" cellpadding="3">
+  <tr>
+    <th>ID</th>
+    <th>Saved at</th>
+    <th>Comment</th>
+    <th>Area</th>
+    <th></th>
+  </tr>
+  <%= render :partial => 'changeset', :locals => {:showusername => false},  :collection => @edits unless @edits.nil?  %>
+</table>
+
+<%= render :partial => 'changeset_paging_nav' %>
index cc8f7192d6953c06be92ae39af19114badfdca1a..49c0ae3769f4bd0ca7b3f7e625a30931baf3aeeb 100644 (file)
         <%
         viewclass = ''
         editclass = ''
+        historyclass = ''
         exportclass = ''
         traceclass = ''
         viewclass = 'active' if params['controller'] == 'site' and params['action'] == 'index' 
         editclass = 'active' if params['controller'] == 'site' and params['action'] == 'edit' 
+        historyclass = 'active' if params['controller'] == 'changeset' and params['action'] == 'list_bbox' 
         exportclass = 'active' if params['controller'] == 'site' and params['action'] == 'export'
         traceclass = 'active' if params['controller'] == 'trace'
         diaryclass = 'active' if params['controller'] == 'diary_entry'
         %>
         <li><%= link_to 'View', {:controller => 'site', :action => 'index'}, {:id => 'viewanchor', :title => 'view maps', :class => viewclass} %></li>
         <li><%= link_to 'Edit', {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => 'edit maps', :class => editclass} %></li>
+        <li><%= link_to 'History', {:controller => 'history' }, {:id => 'historyanchor', :title => 'changeset history', :class => historyclass} %></li>
         <% if params['controller'] == 'site' and (params['action'] == 'index' or params['action'] == 'export') %>
         <li><%= link_to_remote 'Export', {:url => {:controller => 'export', :action => 'start'}}, {:id => 'exportanchor', :title => 'export map data', :class => exportclass, :href => url_for(:controller => 'site', :action => 'export')} %></li>
         <% else %>
index 99024f176589009088d3d5fb02782d2946f48ab3..35509f4e0c071d994a6407401cf45cc52f7e6e17 100644 (file)
@@ -164,8 +164,9 @@ end
     var lonlat = getMapCenter();
     var zoom = map.getZoom();
     var layers = getMapLayers();
+    var extents = getMapExtent();
 
-    updatelinks(lonlat.lon, lonlat.lat, zoom, layers);
+    updatelinks(lonlat.lon, lonlat.lat, zoom, layers, extents);
 
     document.cookie = "_osm_location=" + lonlat.lon + "|" + lonlat.lat + "|" + zoom + "|" + layers;
   }
index 4f2a168a141aba8d073c284bc20432d0619d693c..d12198ca8004f1de8d6eff0f65bca1cf7f00285d 100644 (file)
@@ -5,7 +5,7 @@
 <!-- Displaying user's own profile page -->
 <%= link_to 'my diary', :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
 | <%= link_to 'new diary entry', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %>
-| <%= link_to 'my edits', :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
+| <%= link_to 'my edits', :controller => 'changeset', :action => 'list_user', :display_name => @user.display_name %>
 | <%= link_to 'my traces', :controller => 'trace', :action=>'mine' %>
 | <%= link_to 'my settings', :controller => 'user', :action => 'account', :display_name => @user.display_name %>
 <% else %>