From 093aea72bde2d615c993fa6ef5db12287f9aa2f3 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 20 Apr 2008 12:10:26 +0000 Subject: [PATCH 001/100] Make a branch of the rails code for crschmidt's data browser. From db30a423a8f923bbcae709e1c8f6e337f637bc9a Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 20 Apr 2008 12:20:23 +0000 Subject: [PATCH 002/100] Commit crschmdt's data browser patch. --- app/controllers/browse_controller.rb | 34 ++++++++++++++++++++++++++++ app/views/browse/_common.rhtml | 9 ++++++++ app/views/browse/_map.rhtml | 32 ++++++++++++++++++++++++++ app/views/browse/_tag.rhtml | 4 ++++ app/views/browse/_tag_table.rhtml | 9 ++++++++ app/views/browse/node_view.rhtml | 3 +++ app/views/browse/way_view.rhtml | 3 +++ config/routes.rb | 4 ++++ public/javascripts/map.js | 5 ++-- 9 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 app/controllers/browse_controller.rb create mode 100644 app/views/browse/_common.rhtml create mode 100644 app/views/browse/_map.rhtml create mode 100644 app/views/browse/_tag.rhtml create mode 100644 app/views/browse/_tag_table.rhtml create mode 100644 app/views/browse/node_view.rhtml create mode 100644 app/views/browse/way_view.rhtml diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb new file mode 100644 index 000000000..dcc4cd3f3 --- /dev/null +++ b/app/controllers/browse_controller.rb @@ -0,0 +1,34 @@ +class BrowseController < ApplicationController + before_filter :authorize_web + layout 'site' + def way_view + begin + way = Way.find(params[:id]) + + @way = way + @name = @way.tags['name'].to_s + if @name.length == 0: + @name = "#" + @way.id.to_s + end + @title = 'Way | ' + (@name) + + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + end + end + def node_view + begin + node = Node.find(params[:id]) + + @node = node + @name = @node.tags_as_hash['name'].to_s + if @name.length == 0: + @name = "#" + @node.id.to_s + end + @title = 'Node | ' + (@name) + + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + end + end +end diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml new file mode 100644 index 000000000..70b96590b --- /dev/null +++ b/app/views/browse/_common.rhtml @@ -0,0 +1,9 @@ +<%= render :partial => 'map', :locals => { :type => type, :id => obj.id } %> + +Last edited: <%= h(obj.timestamp) %><% if obj.user.data_public %>, + by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %> +<% end %> + diff --git a/app/views/browse/_map.rhtml b/app/views/browse/_map.rhtml new file mode 100644 index 000000000..3128108d9 --- /dev/null +++ b/app/views/browse/_map.rhtml @@ -0,0 +1,32 @@ +<%= javascript_include_tag '/openlayers/OpenLayers.js' %> +<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> +<%= javascript_include_tag 'map.js' %> +
+
+
+ +Loading... + +
diff --git a/app/views/browse/_tag.rhtml b/app/views/browse/_tag.rhtml new file mode 100644 index 000000000..009d39e79 --- /dev/null +++ b/app/views/browse/_tag.rhtml @@ -0,0 +1,4 @@ + + <%= h(tag[0]) %><%= h(tag[1]) %> + + diff --git a/app/views/browse/_tag_table.rhtml b/app/views/browse/_tag_table.rhtml new file mode 100644 index 000000000..9b87234cd --- /dev/null +++ b/app/views/browse/_tag_table.rhtml @@ -0,0 +1,9 @@ +<% if tags.length != 0 %> + + + + + + <%= render :partial => 'tag', :collection => tags %> +
KeyValue
+<% end %> diff --git a/app/views/browse/node_view.rhtml b/app/views/browse/node_view.rhtml new file mode 100644 index 000000000..2a8fd56d9 --- /dev/null +++ b/app/views/browse/node_view.rhtml @@ -0,0 +1,3 @@ +

Node Browser: <%= h(@name) %>

+<%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %> +<%= render :partial => 'tag_table', :locals => { :tags => @node.tags_as_hash } %> diff --git a/app/views/browse/way_view.rhtml b/app/views/browse/way_view.rhtml new file mode 100644 index 000000000..b1c26f478 --- /dev/null +++ b/app/views/browse/way_view.rhtml @@ -0,0 +1,3 @@ +

Way Browser: <%= h(@name) %>

+<%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %> +<%= render :partial => 'tag_table', :locals => { :tags => @way.tags } %> diff --git a/config/routes.rb b/config/routes.rb index 0a0396251..77a8dd8c2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -54,6 +54,10 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/amf", :controller =>'amf', :action =>'talk' map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' + # Data browsing + map.connect '/way/:id', :controller => 'browse', :action => 'way_view', :id => /\d+/ + map.connect '/node/:id', :controller => 'browse', :action => 'node_view', :id => /\d+/ + # web site map.connect '/', :controller => 'site', :action => 'index' diff --git a/public/javascripts/map.js b/public/javascripts/map.js index b3d964b5b..0dadbb9d3 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -7,9 +7,10 @@ OpenLayers._getScriptLocation = function () { return "/openlayers/"; } -function createMap(divName) { +function createMap(divName, options) { + if (!options) { options = {} } map = new OpenLayers.Map(divName, { - controls: [ + controls: options.controls || [ new OpenLayers.Control.ArgParser(), new OpenLayers.Control.Attribution(), new OpenLayers.Control.LayerSwitcher(), From b909dc4ab80599ac093c5fc1ef21016be1577170 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 20 Apr 2008 12:21:07 +0000 Subject: [PATCH 003/100] Add a stub helper for the browse controller. --- app/helpers/browse_helper.rb | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/helpers/browse_helper.rb diff --git a/app/helpers/browse_helper.rb b/app/helpers/browse_helper.rb new file mode 100644 index 000000000..c86ad5b71 --- /dev/null +++ b/app/helpers/browse_helper.rb @@ -0,0 +1,2 @@ +module BrowseHelper +end From 0c480e05f0f11c881c5c0f2d47cc5c3328a4a3a4 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 20 Apr 2008 12:29:50 +0000 Subject: [PATCH 004/100] Tidy up a few details. --- app/controllers/browse_controller.rb | 16 ++++++++-------- app/views/browse/_common.rhtml | 6 +++--- app/views/browse/_map.rhtml | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index dcc4cd3f3..c35bb821a 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -1,32 +1,32 @@ class BrowseController < ApplicationController before_filter :authorize_web layout 'site' + def way_view begin - way = Way.find(params[:id]) + @way = Way.find(params[:id]) - @way = way @name = @way.tags['name'].to_s if @name.length == 0: @name = "#" + @way.id.to_s - end + end + @title = 'Way | ' + (@name) - rescue ActiveRecord::RecordNotFound render :nothing => true, :status => :not_found end end + def node_view begin - node = Node.find(params[:id]) + @node = Node.find(params[:id]) - @node = node @name = @node.tags_as_hash['name'].to_s if @name.length == 0: @name = "#" + @node.id.to_s - end + end + @title = 'Node | ' + (@name) - rescue ActiveRecord::RecordNotFound render :nothing => true, :status => :not_found end diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml index 70b96590b..d400405c3 100644 --- a/app/views/browse/_common.rhtml +++ b/app/views/browse/_common.rhtml @@ -3,7 +3,7 @@
  • <%= link_to h("API"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id %>
  • <%= link_to h("History"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id, :action => "history" %>
  • -Last edited: <%= h(obj.timestamp) %><% if obj.user.data_public %>, - by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %> +Last edited: <%= h(obj.timestamp) %> +<% if obj.user.data_public %> +by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %> <% end %> - diff --git a/app/views/browse/_map.rhtml b/app/views/browse/_map.rhtml index 3128108d9..a90a3fffd 100644 --- a/app/views/browse/_map.rhtml +++ b/app/views/browse/_map.rhtml @@ -16,8 +16,8 @@ var osm_layer = new OpenLayers.Layer.GML("OSM", url, {format: OpenLayers.Format.OSM, projection: new OpenLayers.Projection("EPSG:4326")}); osm_layer.events.register("loadend", osm_layer, function() { $("loading").innerHTML = ""; - this.map.zoomToExtent( this.features[0].geometry.getBounds()); - var center = map.getCenter().clone().transform(this.map.getProjectionObject(), new OpenLayers.Projection("EPSG:4326")); + this.map.zoomToExtent(this.features[0].geometry.getBounds()); + var center = getMapCenter(); $("larger_map").href = '/?lat='+center.lat+'&lon='+center.lon+'&zoom='+this.map.getZoom(); $("larger_map").innerHTML = "View Larger Map"; }) From e03605929bcd7fe864c0b0c38c4ec8c80f865c39 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 13:16:29 +0000 Subject: [PATCH 005/100] Fix offset when laying in vectors on top of the OSM tiles. --- public/javascripts/map.js | 2 +- public/openlayers/OpenStreetMap.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/javascripts/map.js b/public/javascripts/map.js index 0dadbb9d3..bc2e90863 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -19,7 +19,7 @@ function createMap(divName, options) { new OpenLayers.Control.ScaleLine() ], units: "m", - maxResolution: 156543, + maxResolution: 156543.0339, numZoomLevels: 20 }); diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index c2acf2e0c..d6bc397d1 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -48,8 +48,8 @@ OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.TMS, { initialize: function(name, url, options) { options = OpenLayers.Util.extend({ attribution: "Data by OpenStreetMap", - maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508), - maxResolution: 156543, + maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), + maxResolution: 156543.0339, units: "m", projection: "EPSG:900913", transitionEffect: "resize" From e414d10aa10815b07e0ab334db4d96c4b3ac9b6b Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 14:24:42 +0000 Subject: [PATCH 006/100] Add relation browsing: * Improve map to also work for relations * Add display of relations (view) * Add relation members display * add new view to browse_controller --- app/controllers/browse_controller.rb | 15 +++++++++++++++ app/views/browse/_map.rhtml | 20 ++++++++++++++------ app/views/browse/_member.rhtml | 7 +++++++ app/views/browse/_relation_members.rhtml | 11 +++++++++++ app/views/browse/_tag_table.rhtml | 1 + app/views/browse/relation_view.rhtml | 4 ++++ 6 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 app/views/browse/_member.rhtml create mode 100644 app/views/browse/_relation_members.rhtml create mode 100644 app/views/browse/relation_view.rhtml diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index c35bb821a..1806558f2 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -2,6 +2,21 @@ class BrowseController < ApplicationController before_filter :authorize_web layout 'site' + def relation_view + begin + @relation = Relation.find(params[:id]) + + @name = @relation.tags['name'].to_s + if @name.length == 0: + @name = "#" + @relation.id.to_s + end + + @title = 'Relation | ' + (@name) + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + end + end + def way_view begin @way = Way.find(params[:id]) diff --git a/app/views/browse/_map.rhtml b/app/views/browse/_map.rhtml index a90a3fffd..466c9b6cc 100644 --- a/app/views/browse/_map.rhtml +++ b/app/views/browse/_map.rhtml @@ -9,17 +9,25 @@ var obj_type = '<%= type %>'; var obj_id = <%= id %>; var url = "/api/<%= "#{API_VERSION}" %>/<%= type %>/<%= id %>"; - if (obj_type == "way") { + if (obj_type != "node") { url += "/full"; } var map = createMap('small_map', {controls: [new OpenLayers.Control.Navigation()]}); var osm_layer = new OpenLayers.Layer.GML("OSM", url, {format: OpenLayers.Format.OSM, projection: new OpenLayers.Projection("EPSG:4326")}); osm_layer.events.register("loadend", osm_layer, function() { - $("loading").innerHTML = ""; - this.map.zoomToExtent(this.features[0].geometry.getBounds()); - var center = getMapCenter(); - $("larger_map").href = '/?lat='+center.lat+'&lon='+center.lon+'&zoom='+this.map.getZoom(); - $("larger_map").innerHTML = "View Larger Map"; + $("loading").innerHTML = ""; + if (this.features.length) { + var extent = this.features[0].geometry.getBounds(); + for (var i = 1; i < this.features.length; i++) { + extent.extend(this.features[i].geometry.getBounds()); + } + this.map.zoomToExtent(extent); + var center = getMapCenter(); + $("larger_map").href = '/?lat='+center.lat+'&lon='+center.lon+'&zoom='+this.map.getZoom(); + $("larger_map").innerHTML = "View Larger Map"; + } else { + $("small_map").style.display = "none"; + } }) map.addLayer(osm_layer); osm_layer.loadGML(); diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml new file mode 100644 index 000000000..f3b6cf0dd --- /dev/null +++ b/app/views/browse/_member.rhtml @@ -0,0 +1,7 @@ +<% if member.member.visible %> + + <%= h(member.member.id.to_s) %> + <%= h(member.member_type) %> + <%= h(member.member_role) %> + +<% end %> diff --git a/app/views/browse/_relation_members.rhtml b/app/views/browse/_relation_members.rhtml new file mode 100644 index 000000000..0e7772152 --- /dev/null +++ b/app/views/browse/_relation_members.rhtml @@ -0,0 +1,11 @@ +<% if relation.members.length != 0 %> +

    Members

    + + + + + + + <%= render :partial => 'member', :collection => relation.relation_members %> +
    IDTypeRole
    +<% end %> diff --git a/app/views/browse/_tag_table.rhtml b/app/views/browse/_tag_table.rhtml index 9b87234cd..dca1c0ab1 100644 --- a/app/views/browse/_tag_table.rhtml +++ b/app/views/browse/_tag_table.rhtml @@ -1,4 +1,5 @@ <% if tags.length != 0 %> +

    Tags

    diff --git a/app/views/browse/relation_view.rhtml b/app/views/browse/relation_view.rhtml new file mode 100644 index 000000000..c75e485ae --- /dev/null +++ b/app/views/browse/relation_view.rhtml @@ -0,0 +1,4 @@ +

    Relation Browser: <%= h(@name) %>

    +<%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %> +<%= render :partial => 'tag_table', :locals => { :tags => @relation.tags } %> +<%= render :partial => 'relation_members', :locals => { :relation => @relation } %> From b3ef9c06c59cdcde8e7a8f5e5e7c538f5336dc47 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 14:29:49 +0000 Subject: [PATCH 007/100] link from member object to the member page --- app/views/browse/_member.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml index f3b6cf0dd..104c7e1f9 100644 --- a/app/views/browse/_member.rhtml +++ b/app/views/browse/_member.rhtml @@ -1,6 +1,6 @@ <% if member.member.visible %> - + From 4fbc1ddde4d33dd0bf13f7a035f7faa96f3ef1e7 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 14:34:45 +0000 Subject: [PATCH 008/100] Handle deleted items better. --- app/views/browse/_common.rhtml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml index d400405c3..d5db7c6cc 100644 --- a/app/views/browse/_common.rhtml +++ b/app/views/browse/_common.rhtml @@ -1,6 +1,12 @@ +<% if obj.visible %> <%= render :partial => 'map', :locals => { :type => type, :id => obj.id } %> +<% else %> +Deleted +<% end %>
      +<% if obj.visible %>
    • <%= link_to h("API"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id %>
    • +<% end %>
    • <%= link_to h("History"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id, :action => "history" %>
    Last edited: <%= h(obj.timestamp) %> From 15d5997067226af7f0067e0c1899dc0f30f640be Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 15:12:56 +0000 Subject: [PATCH 009/100] Add tags_as_hash to old_nodes --- app/models/old_node.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/old_node.rb b/app/models/old_node.rb index 2c3e93b20..b6391a3d1 100644 --- a/app/models/old_node.rb +++ b/app/models/old_node.rb @@ -48,4 +48,12 @@ class OldNode < GeoRecord el1['timestamp'] = self.timestamp.xmlschema return el1 end + + def tags_as_hash + hash = {} + Tags.split(self.tags) do |k,v| + hash[k] = v + end + hash + end end From 4168e0963ee19e05c07b40d30e868fd652fd3757 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 15:14:20 +0000 Subject: [PATCH 010/100] Add history for ways and nodes, split 'last edited by' into a seperate template to be used in multiple places, add to routes. --- app/controllers/browse_controller.rb | 29 +++++++++++++++++++++++++ app/views/browse/_common.rhtml | 5 +---- app/views/browse/_common_editedby.rhtml | 4 ++++ app/views/browse/node_history.rhtml | 8 +++++++ app/views/browse/way_history.rhtml | 8 +++++++ config/routes.rb | 3 +++ 6 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 app/views/browse/_common_editedby.rhtml create mode 100644 app/views/browse/node_history.rhtml create mode 100644 app/views/browse/way_history.rhtml diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 1806558f2..785d8cdcf 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -31,6 +31,21 @@ class BrowseController < ApplicationController render :nothing => true, :status => :not_found end end + + def way_history + begin + @way = Way.find(params[:id]) + + @name = @way.tags['name'].to_s + if @name.length == 0: + @name = "#" + @way.id.to_s + end + + @title = 'Way History | ' + (@name) + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + end + end def node_view begin @@ -46,4 +61,18 @@ class BrowseController < ApplicationController render :nothing => true, :status => :not_found end end + def node_history + begin + @node = Node.find(params[:id]) + + @name = @node.tags_as_hash['name'].to_s + if @name.length == 0: + @name = "#" + @node.id.to_s + end + + @title = 'Node | ' + (@name) + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + end + end end diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml index d5db7c6cc..ec590bda0 100644 --- a/app/views/browse/_common.rhtml +++ b/app/views/browse/_common.rhtml @@ -9,7 +9,4 @@ Deleted <% end %>
  • <%= link_to h("History"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id, :action => "history" %>
  • -Last edited: <%= h(obj.timestamp) %> -<% if obj.user.data_public %> -by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %> -<% end %> +<%= render :partial => 'common_editedby', :locals => { :obj => obj } %> diff --git a/app/views/browse/_common_editedby.rhtml b/app/views/browse/_common_editedby.rhtml new file mode 100644 index 000000000..0f00f3e3c --- /dev/null +++ b/app/views/browse/_common_editedby.rhtml @@ -0,0 +1,4 @@ +Last edited: <%= h(obj.timestamp) %> +<% if obj.user.data_public %> +by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %> +<% end %> diff --git a/app/views/browse/node_history.rhtml b/app/views/browse/node_history.rhtml new file mode 100644 index 000000000..ad46202b7 --- /dev/null +++ b/app/views/browse/node_history.rhtml @@ -0,0 +1,8 @@ +

    Node History: <%= h(@name) %>

    +<%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %> +

    Hisorical Versions

    +<% @node.old_nodes.reverse.each do |node| %> +<%= render :partial => 'common_editedby', :locals => { :obj => node } %> +<%= render :partial => 'tag_table', :locals => { :tags => node.tags_as_hash } %> +
    +<% end %> diff --git a/app/views/browse/way_history.rhtml b/app/views/browse/way_history.rhtml new file mode 100644 index 000000000..32aadb3ff --- /dev/null +++ b/app/views/browse/way_history.rhtml @@ -0,0 +1,8 @@ +

    Way History: <%= h(@name) %>

    +<%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %> +

    Hisorical Versions

    +<% @way.old_ways.reverse.each do |way| %> +<%= render :partial => 'common_editedby', :locals => { :obj => way } %> +<%= render :partial => 'tag_table', :locals => { :tags => way.tags } %> +
    +<% end %> diff --git a/config/routes.rb b/config/routes.rb index 77a8dd8c2..b8de4eca9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -56,7 +56,10 @@ ActionController::Routing::Routes.draw do |map| # Data browsing map.connect '/way/:id', :controller => 'browse', :action => 'way_view', :id => /\d+/ + map.connect '/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ map.connect '/node/:id', :controller => 'browse', :action => 'node_view', :id => /\d+/ + map.connect '/node/:id/history', :controller => 'browse', :action => 'node_history', :id => /\d+/ + map.connect '/relation/:id', :controller => 'browse', :action => 'relation_view', :id => /\d+/ # web site From bb8acc842464bdc00987a54bc0c405223dd1a50d Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 15:32:25 +0000 Subject: [PATCH 011/100] Add support for relation history. --- app/controllers/browse_controller.rb | 16 ++++++++++++++++ app/views/browse/_member.rhtml | 4 +--- app/views/browse/_relation_members.rhtml | 4 ++-- app/views/browse/relation_history.rhtml | 9 +++++++++ app/views/browse/relation_view.rhtml | 2 +- config/routes.rb | 1 + 6 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 app/views/browse/relation_history.rhtml diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 785d8cdcf..e679442c1 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -17,6 +17,21 @@ class BrowseController < ApplicationController end end + def relation_history + begin + @relation = Relation.find(params[:id]) + + @name = @relation.tags['name'].to_s + if @name.length == 0: + @name = "#" + @relation.id.to_s + end + + @title = 'Relation History | ' + (@name) + rescue ActiveRecord::RecordNotFound + render :nothing => true, :status => :not_found + end + end + def way_view begin @way = Way.find(params[:id]) @@ -61,6 +76,7 @@ class BrowseController < ApplicationController render :nothing => true, :status => :not_found end end + def node_history begin @node = Node.find(params[:id]) diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml index 104c7e1f9..2b9ee2b31 100644 --- a/app/views/browse/_member.rhtml +++ b/app/views/browse/_member.rhtml @@ -1,7 +1,5 @@ -<% if member.member.visible %>
    - + -<% end %> diff --git a/app/views/browse/_relation_members.rhtml b/app/views/browse/_relation_members.rhtml index 0e7772152..ebe20ba7e 100644 --- a/app/views/browse/_relation_members.rhtml +++ b/app/views/browse/_relation_members.rhtml @@ -1,4 +1,4 @@ -<% if relation.members.length != 0 %> +<% if members.length != 0 %>

    Members

    Key
    <%= h(member.member.id.to_s) %><%= link_to member.member.id.to_s, :controller => member.member_type, :id => member.member.id %> <%= h(member.member_type) %> <%= h(member.member_role) %>
    <%= link_to member.member.id.to_s, :controller => member.member_type, :id => member.member.id %><%= link_to member.member_id.to_s, :controller => member.member_type, :id => member.member_id %> <%= h(member.member_type) %> <%= h(member.member_role) %>
    @@ -6,6 +6,6 @@ - <%= render :partial => 'member', :collection => relation.relation_members %> + <%= render :partial => 'member', :collection => members %>
    Type Role
    <% end %> diff --git a/app/views/browse/relation_history.rhtml b/app/views/browse/relation_history.rhtml new file mode 100644 index 000000000..f3a75cd07 --- /dev/null +++ b/app/views/browse/relation_history.rhtml @@ -0,0 +1,9 @@ +

    Relation History: <%= h(@name) %>

    +<%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %> +

    Hisorical Versions

    +<% @relation.old_relations.reverse.each do |relation| %> +<%= render :partial => 'common_editedby', :locals => { :obj => relation } %> +<%= render :partial => 'tag_table', :locals => { :tags => relation.tags } %> +<%= render :partial => 'relation_members', :locals => { :members => relation.old_members } %> +
    +<% end %> diff --git a/app/views/browse/relation_view.rhtml b/app/views/browse/relation_view.rhtml index c75e485ae..5dc06f10a 100644 --- a/app/views/browse/relation_view.rhtml +++ b/app/views/browse/relation_view.rhtml @@ -1,4 +1,4 @@

    Relation Browser: <%= h(@name) %>

    <%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %> <%= render :partial => 'tag_table', :locals => { :tags => @relation.tags } %> -<%= render :partial => 'relation_members', :locals => { :relation => @relation } %> +<%= render :partial => 'relation_members', :locals => { :members => @relation.relation_members } %> diff --git a/config/routes.rb b/config/routes.rb index b8de4eca9..83b39e615 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -60,6 +60,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/node/:id', :controller => 'browse', :action => 'node_view', :id => /\d+/ map.connect '/node/:id/history', :controller => 'browse', :action => 'node_history', :id => /\d+/ map.connect '/relation/:id', :controller => 'browse', :action => 'relation_view', :id => /\d+/ + map.connect '/relation/:id/history', :controller => 'browse', :action => 'relation_history', :id => /\d+/ # web site From 9a7e246102f3e40471d2f5e5ed1fbf4a3f50ba94 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 15:36:37 +0000 Subject: [PATCH 012/100] for items which don't actually have a geometry, just zoomToMaxExtent. --- app/views/browse/_map.rhtml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/browse/_map.rhtml b/app/views/browse/_map.rhtml index 466c9b6cc..a0fcc06aa 100644 --- a/app/views/browse/_map.rhtml +++ b/app/views/browse/_map.rhtml @@ -21,8 +21,12 @@ for (var i = 1; i < this.features.length; i++) { extent.extend(this.features[i].geometry.getBounds()); } - this.map.zoomToExtent(extent); - var center = getMapCenter(); + if (extent) { + this.map.zoomToExtent(extent); + } else { + this.map.zoomToMaxExtent(); + } + var center = getMapCenter(); $("larger_map").href = '/?lat='+center.lat+'&lon='+center.lon+'&zoom='+this.map.getZoom(); $("larger_map").innerHTML = "View Larger Map"; } else { From 1fe70eb6519ee21eae6cc4ba9df59b11dcef6466 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 16:05:15 +0000 Subject: [PATCH 013/100] don't abuse link_to: do it right --- app/views/browse/_common.rhtml | 4 ++-- app/views/browse/_member.rhtml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml index ec590bda0..83dadd641 100644 --- a/app/views/browse/_common.rhtml +++ b/app/views/browse/_common.rhtml @@ -5,8 +5,8 @@ Deleted <% end %>
      <% if obj.visible %> -
    • <%= link_to h("API"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id %>
    • +
    • <%= link_to h("API"), :controller => type, :action => "read", :id => obj.id %>
    • <% end %> -
    • <%= link_to h("History"), :controller => "api/#{API_VERSION}/"+type, :id => obj.id, :action => "history" %>
    • +
    • <%= link_to h("History"), :controller => "old_" + type, :action => "history", :id => obj.id %>
    <%= render :partial => 'common_editedby', :locals => { :obj => obj } %> diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml index 2b9ee2b31..0082bc4db 100644 --- a/app/views/browse/_member.rhtml +++ b/app/views/browse/_member.rhtml @@ -1,5 +1,5 @@ - <%= link_to member.member_id.to_s, :controller => member.member_type, :id => member.member_id %> + <%= link_to member.member_id.to_s, :action => member.member_type+'_view', :id => member.member_id %> <%= h(member.member_type) %> <%= h(member.member_role) %> From 7618a9a791df5d74e7b59668032c7e94187831fe Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 16:05:48 +0000 Subject: [PATCH 014/100] update routes: everything lives in browse/ now --- config/routes.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 83b39e615..fa7cd0296 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -55,12 +55,12 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' # Data browsing - map.connect '/way/:id', :controller => 'browse', :action => 'way_view', :id => /\d+/ - map.connect '/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ - map.connect '/node/:id', :controller => 'browse', :action => 'node_view', :id => /\d+/ - map.connect '/node/:id/history', :controller => 'browse', :action => 'node_history', :id => /\d+/ - map.connect '/relation/:id', :controller => 'browse', :action => 'relation_view', :id => /\d+/ - map.connect '/relation/:id/history', :controller => 'browse', :action => 'relation_history', :id => /\d+/ + map.connect '/browse/way/:id', :controller => 'browse', :action => 'way_view', :id => /\d+/ + map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ + map.connect '/browse/node/:id', :controller => 'browse', :action => 'node_view', :id => /\d+/ + map.connect '/browse/node/:id/history', :controller => 'browse', :action => 'node_history', :id => /\d+/ + map.connect '/browse/relation/:id', :controller => 'browse', :action => 'relation_view', :id => /\d+/ + map.connect '/browse/relation/:id/history', :controller => 'browse', :action => 'relation_history', :id => /\d+/ # web site From 488efc3df8f18cd867d3eb9c5b595d7bd8e1d362 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 16:11:56 +0000 Subject: [PATCH 015/100] drop _view from action names --- app/controllers/browse_controller.rb | 8 ++++---- app/views/browse/_member.rhtml | 2 +- config/routes.rb | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index e679442c1..5e55de13b 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -2,7 +2,7 @@ class BrowseController < ApplicationController before_filter :authorize_web layout 'site' - def relation_view + def relation begin @relation = Relation.find(params[:id]) @@ -32,7 +32,7 @@ class BrowseController < ApplicationController end end - def way_view + def way begin @way = Way.find(params[:id]) @@ -62,7 +62,7 @@ class BrowseController < ApplicationController end end - def node_view + def node begin @node = Node.find(params[:id]) @@ -86,7 +86,7 @@ class BrowseController < ApplicationController @name = "#" + @node.id.to_s end - @title = 'Node | ' + (@name) + @title = 'Node History | ' + (@name) rescue ActiveRecord::RecordNotFound render :nothing => true, :status => :not_found end diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml index 0082bc4db..29a72b122 100644 --- a/app/views/browse/_member.rhtml +++ b/app/views/browse/_member.rhtml @@ -1,5 +1,5 @@ - <%= link_to member.member_id.to_s, :action => member.member_type+'_view', :id => member.member_id %> + <%= link_to member.member_id.to_s, :action => member.member_type, :id => member.member_id %> <%= h(member.member_type) %> <%= h(member.member_role) %> diff --git a/config/routes.rb b/config/routes.rb index fa7cd0296..84e6256e1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -55,11 +55,11 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' # Data browsing - map.connect '/browse/way/:id', :controller => 'browse', :action => 'way_view', :id => /\d+/ + map.connect '/browse/way/:id', :controller => 'browse', :action => 'way', :id => /\d+/ map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ - map.connect '/browse/node/:id', :controller => 'browse', :action => 'node_view', :id => /\d+/ + map.connect '/browse/node/:id', :controller => 'browse', :action => 'node', :id => /\d+/ map.connect '/browse/node/:id/history', :controller => 'browse', :action => 'node_history', :id => /\d+/ - map.connect '/browse/relation/:id', :controller => 'browse', :action => 'relation_view', :id => /\d+/ + map.connect '/browse/relation/:id', :controller => 'browse', :action => 'relation', :id => /\d+/ map.connect '/browse/relation/:id/history', :controller => 'browse', :action => 'relation_history', :id => /\d+/ # web site From a5c8a3b7f8e02cbf7f5d2f84b9bdb2034fcf22ec Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 16:16:27 +0000 Subject: [PATCH 016/100] move around things to match the change in action names --- app/views/browse/{node_view.rhtml => node.rhtml} | 0 app/views/browse/{relation_view.rhtml => relation.rhtml} | 0 app/views/browse/{way_view.rhtml => way.rhtml} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename app/views/browse/{node_view.rhtml => node.rhtml} (100%) rename app/views/browse/{relation_view.rhtml => relation.rhtml} (100%) rename app/views/browse/{way_view.rhtml => way.rhtml} (100%) diff --git a/app/views/browse/node_view.rhtml b/app/views/browse/node.rhtml similarity index 100% rename from app/views/browse/node_view.rhtml rename to app/views/browse/node.rhtml diff --git a/app/views/browse/relation_view.rhtml b/app/views/browse/relation.rhtml similarity index 100% rename from app/views/browse/relation_view.rhtml rename to app/views/browse/relation.rhtml diff --git a/app/views/browse/way_view.rhtml b/app/views/browse/way.rhtml similarity index 100% rename from app/views/browse/way_view.rhtml rename to app/views/browse/way.rhtml From bad57126c0cb9ff6824c5688bdf3974c2410ea5a Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 16:18:22 +0000 Subject: [PATCH 017/100] add a browse index (no content yet) --- app/controllers/browse_controller.rb | 3 +++ app/views/browse/index.rhtml | 1 + config/routes.rb | 1 + 3 files changed, 5 insertions(+) create mode 100644 app/views/browse/index.rhtml diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 5e55de13b..a33fedd53 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -2,6 +2,9 @@ class BrowseController < ApplicationController before_filter :authorize_web layout 'site' + def index + end + def relation begin @relation = Relation.find(params[:id]) diff --git a/app/views/browse/index.rhtml b/app/views/browse/index.rhtml new file mode 100644 index 000000000..d4a7b19ef --- /dev/null +++ b/app/views/browse/index.rhtml @@ -0,0 +1 @@ +Welcome to the browse subpages! diff --git a/config/routes.rb b/config/routes.rb index 84e6256e1..a93946c52 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -55,6 +55,7 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' # Data browsing + map.connect '/browse', :controller => 'browse', :action => 'index' map.connect '/browse/way/:id', :controller => 'browse', :action => 'way', :id => /\d+/ map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ map.connect '/browse/node/:id', :controller => 'browse', :action => 'node', :id => /\d+/ From 449567e9a676321681cbb4f8c244502172e8c261 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 16:26:13 +0000 Subject: [PATCH 018/100] link to html history --- app/views/browse/_common.rhtml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml index 83dadd641..f237bfe15 100644 --- a/app/views/browse/_common.rhtml +++ b/app/views/browse/_common.rhtml @@ -7,6 +7,7 @@ Deleted <% if obj.visible %>
  • <%= link_to h("API"), :controller => type, :action => "read", :id => obj.id %>
  • <% end %> -
  • <%= link_to h("History"), :controller => "old_" + type, :action => "history", :id => obj.id %>
  • +
  • <%= link_to h("History"), :controller => "old_" + type, :action => "history", :id => obj.id %> + (<%= link_to h("HTML"), :action => type+"_history", :id => obj.id %>)
  • <%= render :partial => 'common_editedby', :locals => { :obj => obj } %> From 35c88713546d4c606e0aca9c4a4b3a63ae88759b Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 20:26:20 +0000 Subject: [PATCH 019/100] Link ways and nodes backwards and forwards. --- app/controllers/browse_controller.rb | 1 + app/views/browse/index.rhtml | 13 ++++++++++++- app/views/browse/node.rhtml | 11 +++++++++++ app/views/browse/way.rhtml | 12 ++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index a33fedd53..97daaa268 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -3,6 +3,7 @@ class BrowseController < ApplicationController layout 'site' def index + @nodes = Node.find(:all, :order => "timestamp DESC", :limit=> 20) end def relation diff --git a/app/views/browse/index.rhtml b/app/views/browse/index.rhtml index d4a7b19ef..2cd5cc9da 100644 --- a/app/views/browse/index.rhtml +++ b/app/views/browse/index.rhtml @@ -1 +1,12 @@ -Welcome to the browse subpages! +

    <%= @nodes.length %> Recently Changed Nodes

    +
      +<% @nodes.each do |node| + name = node.tags_as_hash['name'].to_s + if name.length == 0: + name = "(No name)" + end + name = name + " - " + node.id.to_s +%> +
    • <%= link_to h(name), :action => "node", :id => node.id %>
    • +<% end %> +
    diff --git a/app/views/browse/node.rhtml b/app/views/browse/node.rhtml index 2a8fd56d9..fcfd7cfd7 100644 --- a/app/views/browse/node.rhtml +++ b/app/views/browse/node.rhtml @@ -1,3 +1,14 @@

    Node Browser: <%= h(@name) %>

    <%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %> <%= render :partial => 'tag_table', :locals => { :tags => @node.tags_as_hash } %> +<% if @node.ways.length != 0 %> +
    +
    +

    Part of:

    +
      + <% @node.ways.each do |way| %> +
    • <%= link_to "Way " + way.id.to_s, :action => "way", :id => way.id.to_s %>
    • + <% end %> +
    +
    +<% end %> diff --git a/app/views/browse/way.rhtml b/app/views/browse/way.rhtml index b1c26f478..c12a422cb 100644 --- a/app/views/browse/way.rhtml +++ b/app/views/browse/way.rhtml @@ -1,3 +1,15 @@

    Way Browser: <%= h(@name) %>

    <%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %> <%= render :partial => 'tag_table', :locals => { :tags => @way.tags } %> + +<% if @way.nodes.length != 0 %> +
    +
    +

    Parts:

    +
      + <% @way.nodes.each do |node| %> +
    • <%= link_to "Node " + node.id.to_s, :action => "node", :id => node.id.to_s %>
    • + <% end %> +
    +
    +<% end %> From 4ca38904dc11fa7329e186bd675e15e3c401ca86 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sun, 20 Apr 2008 21:44:05 +0000 Subject: [PATCH 020/100] add navigation link --- app/controllers/browse_controller.rb | 6 ++++++ app/views/browse/_navigation.rhtml | 13 +++++++++++++ app/views/browse/node.rhtml | 1 + app/views/browse/relation.rhtml | 1 + app/views/browse/way.rhtml | 1 + 5 files changed, 22 insertions(+) create mode 100644 app/views/browse/_navigation.rhtml diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 97daaa268..3ecec6348 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -16,6 +16,8 @@ class BrowseController < ApplicationController end @title = 'Relation | ' + (@name) + @next = Relation.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @relation.id }] ) + @prev = Relation.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @relation.id }] ) rescue ActiveRecord::RecordNotFound render :nothing => true, :status => :not_found end @@ -46,6 +48,8 @@ class BrowseController < ApplicationController end @title = 'Way | ' + (@name) + @next = Way.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @way.id }] ) + @prev = Way.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @way.id }] ) rescue ActiveRecord::RecordNotFound render :nothing => true, :status => :not_found end @@ -76,6 +80,8 @@ class BrowseController < ApplicationController end @title = 'Node | ' + (@name) + @next = Node.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @node.id }] ) + @prev = Node.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @node.id }] ) rescue ActiveRecord::RecordNotFound render :nothing => true, :status => :not_found end diff --git a/app/views/browse/_navigation.rhtml b/app/views/browse/_navigation.rhtml new file mode 100644 index 000000000..269184e02 --- /dev/null +++ b/app/views/browse/_navigation.rhtml @@ -0,0 +1,13 @@ +
    +<% if @prev %> +< +<%= link_to @prev.id.to_s, :action => type, :id => @prev.id %> +<% end %> +<% if @prev and @next %> +| +<% end %> +<% if @next %> +<%= link_to @next.id.to_s, :action => type, :id => @next.id %> +> +<% end %> +
    diff --git a/app/views/browse/node.rhtml b/app/views/browse/node.rhtml index fcfd7cfd7..c050cf002 100644 --- a/app/views/browse/node.rhtml +++ b/app/views/browse/node.rhtml @@ -1,3 +1,4 @@ +<%= render :partial => 'navigation', :locals => { :type => "node" } %>

    Node Browser: <%= h(@name) %>

    <%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %> <%= render :partial => 'tag_table', :locals => { :tags => @node.tags_as_hash } %> diff --git a/app/views/browse/relation.rhtml b/app/views/browse/relation.rhtml index 5dc06f10a..574a4ea2b 100644 --- a/app/views/browse/relation.rhtml +++ b/app/views/browse/relation.rhtml @@ -1,3 +1,4 @@ +<%= render :partial => 'navigation', :locals => { :type => "relation" } %>

    Relation Browser: <%= h(@name) %>

    <%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %> <%= render :partial => 'tag_table', :locals => { :tags => @relation.tags } %> diff --git a/app/views/browse/way.rhtml b/app/views/browse/way.rhtml index c12a422cb..e1c306071 100644 --- a/app/views/browse/way.rhtml +++ b/app/views/browse/way.rhtml @@ -1,3 +1,4 @@ +<%= render :partial => 'navigation', :locals => { :type => "way" } %>

    Way Browser: <%= h(@name) %>

    <%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %> <%= render :partial => 'tag_table', :locals => { :tags => @way.tags } %> From c69dc37b2c37d367211f3365ffe08976d0a7504b Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Mon, 21 Apr 2008 13:52:43 +0000 Subject: [PATCH 021/100] Create a 'browse' tab, which will be used to display data on the main page --- app/views/layouts/site.rhtml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index db7fce0a6..dd43e8b4d 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -43,6 +43,7 @@ exportclass = 'active' if params['controller'] == 'site' and params['action'] == 'export' traceclass = 'active' if params['controller'] == 'trace' diaryclass = 'active' if params['controller'] == 'diary_entry' + browseclass = 'active' if params['controller'] == 'browse' %>
  • <%= link_to 'View', {:controller => 'site', :action => 'index'}, {:id => 'viewanchor', :title => 'view maps', :class => viewclass} %>
  • <%= link_to 'Edit', {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => 'edit maps', :class => editclass} %>
  • @@ -53,6 +54,7 @@ <% end %>
  • <%= link_to 'GPS Traces', {:controller => 'trace', :action => 'list'}, {:id => 'traceanchor', :title => 'manage traces', :class => traceclass} %>
  • <%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list'}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %>
  • +
  • <%= link_to 'Browse', {:controller => 'browse', :action => 'index'}, {:id => 'browseanchor', :title => 'browse data', :class => browseclass} %>
  • From 336a80530cb38c4b138493ef547961ea36b82ee3 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Mon, 21 Apr 2008 23:18:08 +0000 Subject: [PATCH 022/100] add in-map node/way browser --- app/controllers/browse_controller.rb | 2 + app/views/browse/_start.rhtml | 18 +++ app/views/browse/start.rjs | 181 +++++++++++++++++++++++++++ app/views/layouts/site.rhtml | 2 +- config/database.yml | 5 +- config/routes.rb | 1 + 6 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 app/views/browse/_start.rhtml create mode 100644 app/views/browse/start.rjs diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 3ecec6348..b56e4f17e 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -2,6 +2,8 @@ class BrowseController < ApplicationController before_filter :authorize_web layout 'site' + def start + end def index @nodes = Node.find(:all, :order => "timestamp DESC", :limit=> 20) end diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml new file mode 100644 index 000000000..616cd7d02 --- /dev/null +++ b/app/views/browse/_start.rhtml @@ -0,0 +1,18 @@ + diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs new file mode 100644 index 000000000..5ea29921e --- /dev/null +++ b/app/views/browse/start.rjs @@ -0,0 +1,181 @@ +page.replace_html :sidebar_title, 'Browse' +page.replace_html :sidebar_content, :partial => 'start' +page << <API)"; + + obj_list = document.createElement("ul"); + for (var i = 0; i < this.features.length; i++) { + var feature = this.features[i]; + var type ="way"; + if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { + type = "node"; + } + var nice_name = type.substr(0,1).toUpperCase() + type.substr(1,type.length); + var li = document.createElement("li"); + li.appendChild(document.createTextNode(nice_name + " ")); + var link = document.createElement("a"); + link.href = "/browse/"+type+"/"+feature.osm_id; + var name = feature.attributes.name || feature.osm_id; + link.appendChild(document.createTextNode(name)); + li.appendChild(link); + li.appendChild(document.createTextNode(" ")); + var link = document.createElement("a"); + link.href = "#"; + link.appendChild(document.createTextNode("+")); + link.feature = feature; + link.onclick = OpenLayers.Function.bind(function() { + var layer = this.feature.layer; + for (var i = 0; i < layer.selectedFeatures.length; i++) { + var f = layer.selectedFeatures[i]; + layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default")); + } + on_feature_hover(this.feature); + map.setCenter(this.feature.geometry.getBounds().getCenterLonLat()); + }, link); + li.appendChild(link); + obj_list.appendChild(li); + } + $("object").innerHTML = ""; + $("object").appendChild(obj_list); + } + function getData(bounds) { + $("status").innerHTML = "Loading..."; + bounds.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); + var url = "/api/0.5/map?bbox="+bounds.toBBOX(); + if (!gml) { + var def = OpenLayers.Feature.Vector.style['default']; + var style = new OpenLayers.Style(); + style.addRules([new OpenLayers.Rule( + {'symbolizer': + {"Polygon": {'fillColor': '#ff0000', 'strokeColor': '#ff0000'}, + "Line": {'fillColor': '#ffff00', 'strokeColor': '#000000', strokeOpacity: '0.4'}, + "Point": {'fillColor': '#00ff00', 'strokeColor': '#00ff00'}} + } + )]); + gml = new OpenLayers.Layer.GML("Data",url, + {format: OpenLayers.Format.OSM, formatOptions: {checkTags: true}, + styleMap: new OpenLayers.StyleMap({'default': style, 'select': {'strokeColor': '#0000ff'}}) + } + ); + gml.events.register("loadend", gml, dataLoaded ); + map.addLayer(gml); + sf = new OpenLayers.Control.SelectFeature(gml, {'onSelect': on_feature_hover}); + map.addControl(sf); + sf.activate(); + + } else { + gml.setUrl(url); + } + } + function endDrag(bbox) { + var bounds = bbox.getBounds(); + setBounds(bounds); + box.deactivate(); + getData(bounds); + $("drag_box").innerHTML = "Select an area to see features"; + + } + function loadObjList() { + $("object").innerHTML=""; + $("object").appendChild(obj_list); + } + + function on_feature_hover(feature) { + if (currentFeature) { + currentFeature.layer.drawFeature( + currentFeature, currentFeature.layer.styleMap.createSymbolizer(currentFeature, "default") + ); + } + feature.layer.drawFeature( + feature, feature.layer.styleMap.createSymbolizer(feature, "select") + ); + if ($("object").firstChild == $("object").obj_list) { + $("object").removeChild(obj_list); + } else { + $("object").innerHTML = ""; + } + var div = document.createElement("div"); + var link = document.createElement("a"); + link.href="#"; + link.onclick = loadObjList; + link.appendChild(document.createTextNode("Back to Object List")); + div.appendChild(link) + $("object").appendChild(div); + var ul = document.createElement("ul"); + var type ="way"; + if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { + type = "node"; + } + var li = document.createElement("li"); + var link = document.createElement("a"); + link.href = "/browse/"+type+"/"+feature.osm_id; + link.appendChild(document.createTextNode(feature.osm_id)); + li.appendChild(link); + ul.appendChild(li); + for (var key in feature.attributes) { + var li = document.createElement("li"); + li.appendChild(document.createTextNode(key + ": " + feature.attributes[key])); + ul.appendChild(li); + } + $("object").appendChild(ul); + currentFeature = feature; + } + function setBounds(bounds) { + var epsg4326 = new OpenLayers.Projection("EPSG:4326"); + var decimals = Math.pow(10, Math.floor(map.getZoom() / 3)); + + bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326); + + $("minlon").innerHTML = Math.round(bounds.left * decimals) / decimals; + $("minlat").innerHTML = Math.round(bounds.bottom * decimals) / decimals; + $("maxlon").innerHTML = Math.round(bounds.right * decimals) / decimals; + $("maxlat").innerHTML = Math.round(bounds.top * decimals) / decimals; + } + +start(); +EOJ diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index dd43e8b4d..d9641891c 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -54,7 +54,7 @@ <% end %>
  • <%= link_to 'GPS Traces', {:controller => 'trace', :action => 'list'}, {:id => 'traceanchor', :title => 'manage traces', :class => traceclass} %>
  • <%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list'}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %>
  • -
  • <%= link_to 'Browse', {:controller => 'browse', :action => 'index'}, {:id => 'browseanchor', :title => 'browse data', :class => browseclass} %>
  • +
  • <%= link_to_remote 'Browse', {:url => {:controller => 'browse', :action => 'start'}}, {:href => url_for( {:controller => 'browse', :action => 'index'}), :id => 'browseanchor', :title => 'browse data', :class => browseclass} %>
  • diff --git a/config/database.yml b/config/database.yml index b884f3b93..19b5dd8d5 100644 --- a/config/database.yml +++ b/config/database.yml @@ -12,9 +12,8 @@ # http://dev.mysql.com/doc/refman/5.0/en/old-client.html development: adapter: mysql - database: openstreetmap - username: openstreetmap - password: openstreetmap + database: osm + user: root host: localhost # Warning: The database defined as 'test' will be erased and diff --git a/config/routes.rb b/config/routes.rb index a93946c52..b6ab25c13 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -55,6 +55,7 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' # Data browsing + map.connect '/browse/start', :controller => 'browse', :action => 'start' map.connect '/browse', :controller => 'browse', :action => 'index' map.connect '/browse/way/:id', :controller => 'browse', :action => 'way', :id => /\d+/ map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ From a5509e31726767defd614ca8abd8bc221414e67c Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Mon, 21 Apr 2008 23:22:08 +0000 Subject: [PATCH 023/100] destroy the feature when we leave --- app/views/browse/start.rjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 5ea29921e..e8bbb1720 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -29,7 +29,11 @@ page << < Date: Tue, 22 Apr 2008 04:05:37 +0000 Subject: [PATCH 024/100] clean up javascript code. no/few functional changes, afaik. --- app/views/browse/start.rjs | 376 ++++++++++++++++++++----------------- 1 file changed, 200 insertions(+), 176 deletions(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index e8bbb1720..0b0681ce5 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -1,185 +1,209 @@ page.replace_html :sidebar_title, 'Browse' page.replace_html :sidebar_content, :partial => 'start' page << <API)"; - - obj_list = document.createElement("ul"); - for (var i = 0; i < this.features.length; i++) { - var feature = this.features[i]; - var type ="way"; - if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { - type = "node"; - } - var nice_name = type.substr(0,1).toUpperCase() + type.substr(1,type.length); - var li = document.createElement("li"); - li.appendChild(document.createTextNode(nice_name + " ")); - var link = document.createElement("a"); - link.href = "/browse/"+type+"/"+feature.osm_id; - var name = feature.attributes.name || feature.osm_id; - link.appendChild(document.createTextNode(name)); - li.appendChild(link); - li.appendChild(document.createTextNode(" ")); - var link = document.createElement("a"); - link.href = "#"; - link.appendChild(document.createTextNode("+")); - link.feature = feature; - link.onclick = OpenLayers.Function.bind(function() { - var layer = this.feature.layer; - for (var i = 0; i < layer.selectedFeatures.length; i++) { - var f = layer.selectedFeatures[i]; - layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default")); - } - on_feature_hover(this.feature); - map.setCenter(this.feature.geometry.getBounds().getCenterLonLat()); - }, link); - li.appendChild(link); - obj_list.appendChild(li); - } - $("object").innerHTML = ""; - $("object").appendChild(obj_list); - } - function getData(bounds) { - $("status").innerHTML = "Loading..."; - bounds.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); - var url = "/api/0.5/map?bbox="+bounds.toBBOX(); - if (!gml) { - var def = OpenLayers.Feature.Vector.style['default']; - var style = new OpenLayers.Style(); - style.addRules([new OpenLayers.Rule( - {'symbolizer': - {"Polygon": {'fillColor': '#ff0000', 'strokeColor': '#ff0000'}, - "Line": {'fillColor': '#ffff00', 'strokeColor': '#000000', strokeOpacity: '0.4'}, - "Point": {'fillColor': '#00ff00', 'strokeColor': '#00ff00'}} - } - )]); - gml = new OpenLayers.Layer.GML("Data",url, - {format: OpenLayers.Format.OSM, formatOptions: {checkTags: true}, - styleMap: new OpenLayers.StyleMap({'default': style, 'select': {'strokeColor': '#0000ff'}}) - } - ); - gml.events.register("loadend", gml, dataLoaded ); - map.addLayer(gml); - sf = new OpenLayers.Control.SelectFeature(gml, {'onSelect': on_feature_hover}); - map.addControl(sf); - sf.activate(); - - } else { - gml.setUrl(url); - } - } - function endDrag(bbox) { - var bounds = bbox.getBounds(); - setBounds(bounds); - box.deactivate(); - getData(bounds); - $("drag_box").innerHTML = "Select an area to see features"; - - } - function loadObjList() { - $("object").innerHTML=""; - $("object").appendChild(obj_list); - } - function on_feature_hover(feature) { - if (currentFeature) { - currentFeature.layer.drawFeature( - currentFeature, currentFeature.layer.styleMap.createSymbolizer(currentFeature, "default") - ); - } - feature.layer.drawFeature( - feature, feature.layer.styleMap.createSymbolizer(feature, "select") - ); - if ($("object").firstChild == $("object").obj_list) { - $("object").removeChild(obj_list); - } else { + var gml, sf, objList, currentFeature; + OpenLayers.Feature.Vector.style['default'].strokeWidth = 3; + OpenLayers.Feature.Vector.style['default'].cursor = "pointer"; + + function start() { + openSidebar({ onclose: stopBrowse }); + var vectors = new OpenLayers.Layer.Vector(); + + box = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, { + handlerOptions: { + sides: 4, + snapAngle: 90, + irregular: true, + persist: true, + callbacks: { done: endDrag } + } + }); + map.addControl(box); + } + + function stopBrowse() { + if (gml) { + gml.destroy(); + gml = null; + } + if (sf) { + sf.destroy(); + sf = null; + } + if (currentFeature) { + currentFeature.destroy(); + currentFeature = null; + } + } + + function startDrag() { + $("drag_box").innerHTML='Drag a box on the map to select an area'; + box.activate(); + return false; + }; + $("drag_box").onclick = startDrag; + + function useMap() { + var bounds = map.getExtent(); + setBounds(bounds); + getData(bounds); + } + $("use_map").onclick = useMap; + + function endDrag(bbox) { + var bounds = bbox.getBounds(); + setBounds(bounds); + box.deactivate(); + getData(bounds); + $("drag_box").innerHTML = "Manually select a different area"; + } + + function getData(bounds) { + $("status").innerHTML = "Loading..."; + + bounds.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); + var url = "/api/0.5/map?bbox="+bounds.toBBOX(); + + if (!gml) { + var def = OpenLayers.Feature.Vector.style['default']; + var style = new OpenLayers.Style(); + style.addRules([new OpenLayers.Rule( + {'symbolizer': + {"Polygon": {'fillColor': '#ff0000', 'strokeColor': '#ff0000'}, + "Line": {'fillColor': '#ffff00', 'strokeColor': '#000000', strokeOpacity: '0.4'}, + "Point": {'fillColor': '#00ff00', 'strokeColor': '#00ff00'}} + } + )]); + gml = new OpenLayers.Layer.GML("Data",url, + {format: OpenLayers.Format.OSM, formatOptions: {checkTags: true}, + styleMap: new OpenLayers.StyleMap({'default': style, 'select': {'strokeColor': '#0000ff'}}) + } + ); + gml.events.register("loadend", gml, dataLoaded ); + map.addLayer(gml); + + sf = new OpenLayers.Control.SelectFeature(gml, {'onSelect': onFeatureSelect}); + map.addControl(sf); + sf.activate(); + } else { + gml.setUrl(url); + } + } + + function dataLoaded() { + $("status").innerHTML = "Loaded " + this.features.length + " features. (API)"; + + objList = document.createElement("ul"); + for (var i = 0; i < this.features.length; i++) { + var feature = this.features[i]; + + // Type, for linking + var type ="way"; + if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { + type = "node"; + } + var nice_name = type.substr(0,1).toUpperCase() + type.substr(1,type.length); + var li = document.createElement("li"); + li.appendChild(document.createTextNode(nice_name + " ")); + + // Link, for viewing in the tab + var link = document.createElement("a"); + link.href = "/browse/" + type + "/" + feature.osm_id; + var name = feature.attributes.name || feature.osm_id; + link.appendChild(document.createTextNode(name)); + link.feature = feature; + link.onclick = OpenLayers.Function.bind(viewFeatureLink, link); + li.appendChild(link); + + objList.appendChild(li); + } $("object").innerHTML = ""; - } - var div = document.createElement("div"); - var link = document.createElement("a"); - link.href="#"; - link.onclick = loadObjList; - link.appendChild(document.createTextNode("Back to Object List")); - div.appendChild(link) - $("object").appendChild(div); - var ul = document.createElement("ul"); - var type ="way"; - if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { - type = "node"; - } - var li = document.createElement("li"); - var link = document.createElement("a"); - link.href = "/browse/"+type+"/"+feature.osm_id; - link.appendChild(document.createTextNode(feature.osm_id)); - li.appendChild(link); - ul.appendChild(li); - for (var key in feature.attributes) { - var li = document.createElement("li"); - li.appendChild(document.createTextNode(key + ": " + feature.attributes[key])); - ul.appendChild(li); - } - $("object").appendChild(ul); - currentFeature = feature; - } - function setBounds(bounds) { - var epsg4326 = new OpenLayers.Projection("EPSG:4326"); - var decimals = Math.pow(10, Math.floor(map.getZoom() / 3)); + $("object").appendChild(objList); + } + + function viewFeatureLink() { + var layer = this.feature.layer; + for (var i = 0; i < layer.selectedFeatures.length; i++) { + var f = layer.selectedFeatures[i]; + layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default")); + } + onFeatureSelect(this.feature); + map.setCenter(this.feature.geometry.getBounds().getCenterLonLat()); + return false; + } + + function loadObjList() { + $("object").innerHTML=""; + $("object").appendChild(objList); + } + + function onFeatureSelect(feature) { + // Unselect previously selected feature + if (currentFeature) { + currentFeature.layer.drawFeature( + currentFeature, currentFeature.layer.styleMap.createSymbolizer(currentFeature, "default") + ); + } - bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326); + // Redraw in selected style + feature.layer.drawFeature( + feature, feature.layer.styleMap.createSymbolizer(feature, "select") + ); - $("minlon").innerHTML = Math.round(bounds.left * decimals) / decimals; - $("minlat").innerHTML = Math.round(bounds.bottom * decimals) / decimals; - $("maxlon").innerHTML = Math.round(bounds.right * decimals) / decimals; - $("maxlat").innerHTML = Math.round(bounds.top * decimals) / decimals; - } + // If the current object is the list, don't innerHTML="", since that could clar it. + if ($("object").firstChild == objList) { + $("object").removeChild(objList); + } else { + $("object").innerHTML = ""; + } + + // Create a link back to the object list + var div = document.createElement("div"); + var link = document.createElement("a"); + link.href="#"; + link.onclick = loadObjList; + link.appendChild(document.createTextNode("Back to Object List")); + div.appendChild(link) + $("object").appendChild(div); + + // Now the list of attributes + var ul = document.createElement("ul"); + var type = "way"; + if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { + type = "node"; + } + var li = document.createElement("li"); + var link = document.createElement("a"); + link.href = "/browse/"+type+"/"+feature.osm_id; + link.appendChild(document.createTextNode(feature.osm_id)); + li.appendChild(link); + ul.appendChild(li); + for (var key in feature.attributes) { + var li = document.createElement("li"); + var b = document.createElement("b"); + b.appendChild(document.createTextNode(key)); + li.appendChild(b); + li.appendChild(document.createTextNode(": " + feature.attributes[key])); + ul.appendChild(li); + } + $("object").appendChild(ul); + + // Stash the currently drawn feature + currentFeature = feature; + } + + function setBounds(bounds) { + var epsg4326 = new OpenLayers.Projection("EPSG:4326"); + var decimals = Math.pow(10, Math.floor(map.getZoom() / 3)); -start(); + bounds = bounds.clone().transform(map.getProjectionObject(), epsg4326); + + $("minlon").innerHTML = Math.round(bounds.left * decimals) / decimals; + $("minlat").innerHTML = Math.round(bounds.bottom * decimals) / decimals; + $("maxlon").innerHTML = Math.round(bounds.right * decimals) / decimals; + $("maxlat").innerHTML = Math.round(bounds.top * decimals) / decimals; + } + + start(); EOJ From d3314fee0f4a4031a893e0a93b5fa0f86b1613ed Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Tue, 22 Apr 2008 04:28:37 +0000 Subject: [PATCH 025/100] Add recent nodes to start of tab, and return false from onclick actions --- app/controllers/browse_controller.rb | 3 ++- app/views/browse/_start.rhtml | 9 ++++++++- app/views/browse/start.rjs | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index b56e4f17e..a6c0e0ae2 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -2,7 +2,8 @@ class BrowseController < ApplicationController before_filter :authorize_web layout 'site' - def start + def start + @nodes = Node.find(:all, :order => "timestamp DESC", :limit=> 20) end def index @nodes = Node.find(:all, :order => "timestamp DESC", :limit=> 20) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index 616cd7d02..10316c383 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -14,5 +14,12 @@
    -
    +
    +

    Recent Changes

    + +
    diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 0b0681ce5..0d8b3288c 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -47,7 +47,8 @@ page << < Date: Tue, 22 Apr 2008 11:14:58 +0000 Subject: [PATCH 026/100] Customize requestSuccess to limit number of features actually drawn on the map --- app/views/browse/start.rjs | 50 +++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 0d8b3288c..43e65e5f8 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -2,7 +2,7 @@ page.replace_html :sidebar_title, 'Browse' page.replace_html :sidebar_content, :partial => 'start' page << < Date: Tue, 22 Apr 2008 11:19:12 +0000 Subject: [PATCH 027/100] allow down/up events --- app/views/browse/start.rjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 43e65e5f8..f21969398 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -131,8 +131,11 @@ page << < Date: Tue, 22 Apr 2008 11:29:24 +0000 Subject: [PATCH 028/100] don't let users select areas bigger than allowed --- app/views/browse/start.rjs | 45 +++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index f21969398..963f1c25b 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -7,19 +7,21 @@ page << < 0.25) { + $("status").innerHTML = "Unable to load: Bounding box size of " + size + " is too large. (Must be smaller than 0.25)"; + return; + } + var url = "/api/0.5/map?bbox="+bounds.toBBOX(); + $("status").innerHTML = "Loading..."; if (!gml) { var def = OpenLayers.Feature.Vector.style['default']; var style = new OpenLayers.Style(); @@ -257,6 +267,15 @@ page << < 0.25) { + $("use_map").style.display = "none"; + } else { + $("use_map").style.display = "inline"; + } + } start(); EOJ From 24c623fdf28e89125714db004a41afe18c99638d Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Tue, 22 Apr 2008 11:41:57 +0000 Subject: [PATCH 029/100] minor clenaups --- app/views/browse/start.rjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 963f1c25b..2f23c1b1a 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -80,6 +80,7 @@ page << < 0.25) { - $("status").innerHTML = "Unable to load: Bounding box size of " + size + " is too large. (Must be smaller than 0.25)"; + $("status").innerHTML = "Unable to load: Bounding box size of " + size + " is too large. (Must be smaller than 0.25)
    "; return; } From 25fa17d6129adbbbd7bcd8533d24889b25fbf240 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Tue, 22 Apr 2008 12:48:26 +0000 Subject: [PATCH 030/100] change layout: now a link, no longer a tab --- app/views/browse/_start.rhtml | 6 ------ app/views/browse/start.rjs | 26 ++++++++++---------------- app/views/layouts/site.rhtml | 1 - app/views/site/index.rhtml | 1 + public/stylesheets/site.css | 9 ++++++++- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index 10316c383..eff1f415b 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -15,11 +15,5 @@
    -

    Recent Changes

    -
    diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 2f23c1b1a..2c48c70ff 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -22,6 +22,11 @@ page << <= 16) { + useMap(); + } else { + $("status").innerHTML = "Zoom in or Select an area of the map to view."; + } } function stopBrowse() { @@ -49,7 +54,6 @@ page << <API)"; @@ -257,17 +262,6 @@ page << <
  • <%= link_to 'GPS Traces', {:controller => 'trace', :action => 'list'}, {:id => 'traceanchor', :title => 'manage traces', :class => traceclass} %>
  • <%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list'}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %>
  • -
  • <%= link_to_remote 'Browse', {:url => {:controller => 'browse', :action => 'start'}}, {:href => url_for( {:controller => 'browse', :action => 'index'}), :id => 'browseanchor', :title => 'browse data', :class => browseclass} %>
  • diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 94b24debf..fa31d848b 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -9,6 +9,7 @@ <%= render :partial => 'search' %>
    +
    diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index c7f1b0085..4e4a70343 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -1,4 +1,4 @@ -a { +a m color: #0000ff; text-decoration: none; } @@ -569,6 +569,13 @@ input[type="text"] { font-weight: normal; } +#datalink { + z-index:10000; + position:absolute; + bottom:30px; + right:15px; + font-size:smaller; +} #permalink { z-index:10000; position:absolute; From 670d15e4c9738f4c4844d93bfe45d89a3351d25b Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Tue, 22 Apr 2008 13:52:41 +0000 Subject: [PATCH 031/100] add support for displaying history --- app/views/browse/_start.rhtml | 17 ++----- app/views/browse/start.rjs | 87 ++++++++++++++++++++++++++++------- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index eff1f415b..302082de1 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -1,18 +1,11 @@ -
    -
    - -
    - - -
    - -

    - View Data For Current Map View +

    diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 2c48c70ff..dbe70695f 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -1,8 +1,8 @@ -page.replace_html :sidebar_title, 'Browse' +page.replace_html :sidebar_title, 'Data' page.replace_html :sidebar_content, :partial => 'start' page << <= 16) { + } + + function showData() { + if (mode == "manual") { return; } + if (map.getZoom() >= 15) { useMap(); } else { $("status").innerHTML = "Zoom in or Select an area of the map to view."; @@ -42,7 +46,7 @@ page << < 0.25) { - $("use_map").style.display = "none"; - } else { - $("use_map").style.display = "inline"; - } + function loadHistory() { + this.link.href = ""; + this.link.innerHTML = "Wait..."; + new Ajax.Request("/api/0.5/"+this.type+"/"+this.feature.osm_id+"/history", {onComplete: OpenLayers.Function.bind(displayHistory, this)}); + return false; } + function displayHistory(request) { + if (currentFeature.osm_id != this.feature.osm_id || $("object").firstChild == objList) { + return false; + } + this.link.parentNode.parentNode.removeChild(this.link.parentNode); + var doc = request.responseXML; + var div = document.createElement("div"); + var h3 = document.createElement("h3"); + h3.appendChild(document.createTextNode("History")); + div.appendChild(h3); + var nodes = doc.getElementsByTagName(this.type); + var history = document.createElement("ul"); + for (var i = 0; i < nodes.length; i++) { + var user = nodes[i].getAttribute("user") || "private user"; + var timestamp = nodes[i].getAttribute("timestamp"); + var item = document.createElement("li"); + item.appendChild(document.createTextNode("Edited by " + user + " at " + timestamp)); + history.appendChild(item); + } + div.appendChild(history); + $("object").appendChild(div); + } + start(); EOJ From dffe87909dabac40186ee647282cd6220a4836fd Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Tue, 22 Apr 2008 13:59:00 +0000 Subject: [PATCH 032/100] add link to history html page --- app/views/browse/start.rjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index dbe70695f..12a5f070c 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -322,6 +322,10 @@ page << < Date: Wed, 23 Apr 2008 04:25:39 +0000 Subject: [PATCH 033/100] prevent errors when closing sidebar --- app/views/browse/start.rjs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 12a5f070c..11f9edfd4 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -2,7 +2,7 @@ page.replace_html :sidebar_title, 'Data' page.replace_html :sidebar_content, :partial => 'start' page << <API)"; objList = document.createElement("ul"); @@ -314,7 +318,7 @@ page << <= 0; i--) { var user = nodes[i].getAttribute("user") || "private user"; var timestamp = nodes[i].getAttribute("timestamp"); var item = document.createElement("li"); From f06af0508c5860d22ac94579aa889cac103d1517 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Wed, 23 Apr 2008 04:28:42 +0000 Subject: [PATCH 034/100] very minor ui niggles --- app/views/browse/_start.rhtml | 4 ++-- app/views/browse/start.rjs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index 302082de1..8b894fcb8 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -1,6 +1,6 @@ -
    +
    -

    +

    View Data For Current Map View
    Manually select a different area diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 11f9edfd4..84a03ce1c 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -74,7 +74,6 @@ page << < Date: Wed, 23 Apr 2008 13:59:41 +0000 Subject: [PATCH 035/100] move data into a layer in the layerswitcher --- app/views/browse/_start.rhtml | 2 +- app/views/browse/start.rjs | 35 ++++++++++++++++++------------ app/views/site/index.rhtml | 1 - public/javascripts/map.js | 3 +++ public/openlayers/OpenStreetMap.js | 15 +++++++++++++ 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index 8b894fcb8..a6030a5a4 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -1,4 +1,4 @@ -

    +

    View Data For Current Map View diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 84a03ce1c..8d221f290 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -22,6 +22,7 @@ page << < 'search' %>

    -
    diff --git a/public/javascripts/map.js b/public/javascripts/map.js index bc2e90863..ccfa3b255 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -40,6 +40,9 @@ function createMap(divName, options) { wrapDateLine: true }); map.addLayer(maplint); + var data = new OpenLayers.Layer.Data("Data", {'visibility': false}); + map.addLayer(data); + map.dataLayer = data; var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels); markers = new OpenLayers.Layer.Markers("Markers", { diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index d6bc397d1..244930866 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -182,3 +182,18 @@ OpenLayers.Layer.OSM.Maplint = OpenLayers.Class(OpenLayers.Layer.OSM, { CLASS_NAME: "OpenLayers.Layer.OSM.Maplint" }); + +OpenLayers.Layer.Data = OpenLayers.Class(OpenLayers.Layer, { + setVisibility: function(vis) { + OpenLayers.Layer.prototype.setVisibility.apply(this, arguments); + if (!this.map) { return; } + if (vis) { + new Ajax.Request('/browse/start', {asynchronous:true, evalScripts:true}); + } else { + if (this.stopBrowse) { + this.stopBrowse(); + closeSidebar(); + } + } + } +}); From f4dfa0f93b8470d8bab0158f6b2993ececfed78d Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Wed, 23 Apr 2008 14:58:25 +0000 Subject: [PATCH 036/100] UI changes from RichardF --- app/views/browse/start.rjs | 42 ++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 8d221f290..5be4cffc6 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -193,9 +193,11 @@ page << <API)"; + $("status").innerHTML = "Loaded." - objList = document.createElement("ul"); + objList = document.createElement("div") + + list = document.createElement("ul"); for (var i = 0; i < this.features.length; i++) { var feature = this.features[i]; @@ -217,10 +219,16 @@ page << < Date: Wed, 23 Apr 2008 16:39:20 +0000 Subject: [PATCH 037/100] define type earlier --- app/views/browse/start.rjs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 5be4cffc6..783c387b2 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -279,6 +279,11 @@ page << < Date: Wed, 23 Apr 2008 16:40:18 +0000 Subject: [PATCH 038/100] no longer need stylesheet change --- public/stylesheets/site.css | 7 ------- 1 file changed, 7 deletions(-) diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index 4e4a70343..4edff5793 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -569,13 +569,6 @@ input[type="text"] { font-weight: normal; } -#datalink { - z-index:10000; - position:absolute; - bottom:30px; - right:15px; - font-size:smaller; -} #permalink { z-index:10000; position:absolute; From 679d47818bd834449f568b8c326202c9af2e798a Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Wed, 23 Apr 2008 16:41:33 +0000 Subject: [PATCH 039/100] browseclass no longer used --- app/views/layouts/site.rhtml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index d2a9e0122..db7fce0a6 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -43,7 +43,6 @@ exportclass = 'active' if params['controller'] == 'site' and params['action'] == 'export' traceclass = 'active' if params['controller'] == 'trace' diaryclass = 'active' if params['controller'] == 'diary_entry' - browseclass = 'active' if params['controller'] == 'browse' %>
  • <%= link_to 'View', {:controller => 'site', :action => 'index'}, {:id => 'viewanchor', :title => 'view maps', :class => viewclass} %>
  • <%= link_to 'Edit', {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => 'edit maps', :class => editclass} %>
  • From 1f0636d2532b014573f98f835a6725d5663b7c9c Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Wed, 23 Apr 2008 16:46:47 +0000 Subject: [PATCH 040/100] start no longer uses these nodes: don't query for them --- app/controllers/browse_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index a6c0e0ae2..fd482119d 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -3,8 +3,8 @@ class BrowseController < ApplicationController layout 'site' def start - @nodes = Node.find(:all, :order => "timestamp DESC", :limit=> 20) end + def index @nodes = Node.find(:all, :order => "timestamp DESC", :limit=> 20) end From 3d6b28b6662a37ee10491fcd739f7ccdaf56f8db Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sat, 26 Apr 2008 16:15:45 +0000 Subject: [PATCH 041/100] Don't load things if the layer is already visible: if that's the case, we should already be loading. --- public/openlayers/OpenStreetMap.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index 244930866..f472d3fc1 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -185,9 +185,10 @@ OpenLayers.Layer.OSM.Maplint = OpenLayers.Class(OpenLayers.Layer.OSM, { OpenLayers.Layer.Data = OpenLayers.Class(OpenLayers.Layer, { setVisibility: function(vis) { + var oldvis = this.visibility; OpenLayers.Layer.prototype.setVisibility.apply(this, arguments); if (!this.map) { return; } - if (vis) { + if (vis && !oldvis) { new Ajax.Request('/browse/start', {asynchronous:true, evalScripts:true}); } else { if (this.stopBrowse) { From ca0989f90fcc14832a54fe129dfdedd907850304 Mon Sep 17 00:00:00 2001 From: Christopher Schmidt Date: Sat, 26 Apr 2008 16:33:26 +0000 Subject: [PATCH 042/100] destroy the box handler as well --- app/views/browse/start.rjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 783c387b2..80a691b4e 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -47,6 +47,10 @@ page << < Date: Mon, 5 May 2008 16:39:33 +0000 Subject: [PATCH 043/100] Rework the new Go button on the search form so that it actually stands some chance of rendering as intended. It's still not really ideal to steal space from the seach box of course... Closes #589. --- app/views/site/_search.rhtml | 12 ++++++++---- public/stylesheets/site.css | 10 +++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/views/site/_search.rhtml b/app/views/site/_search.rhtml index 43853dcf0..f18587f73 100644 --- a/app/views/site/_search.rhtml +++ b/app/views/site/_search.rhtml @@ -38,10 +38,14 @@ <% form_remote_tag(:loading => "startSearch()", :complete => "endSearch()", :url => { :controller => :geocoder, :action => :search }) do %> - <%= text_field_tag :query, h(params[:query]) %> - - <%= submit_tag 'Go' %> - <% end %> + + + + + + +
    <%= text_field_tag :query, h(params[:query]) %><%= submit_tag 'Go' %>
    + <% end %>

    Searching...

    diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index e1b877e03..2ede490ef 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -354,14 +354,18 @@ hides rule from IE5-Mac \*/ padding: 0px; } +.optionalbox input { + width: 100%; +} -.optionalbox input[type="text"] { - width: 110px; +.optionalbox td { + margin: 0px; + padding: 0px; } .search_form { height: 16px; - padding-bottom: 2px; + padding-bottom: 6px; } #search_active { From 210e26f40e96242c64d74340e1971ee1c0c108dc Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 5 May 2008 22:46:56 +0000 Subject: [PATCH 044/100] Reinstate stripping of Re: prefixes that Steve dropped... --- app/controllers/message_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index 8aecef98e..5c435710f 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -35,7 +35,7 @@ class MessageController < ApplicationController def reply message = Message.find(params[:message_id], :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id ]) @body = "\n\nOn #{message.sent_on} #{message.sender.display_name} wrote:\n #{message.body}" - @title = "Re: #{message.title}" + @title = "Re: #{message.title.sub(/^Re:\s*/, '')}" @user_id = message.from_user_id render :action => 'new' rescue ActiveRecord::RecordNotFound From af1e733bee624d034c1d08867ddb6a109229dfc4 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 5 May 2008 22:52:19 +0000 Subject: [PATCH 045/100] Quote reply messages properly. --- app/controllers/message_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index 5c435710f..0fec8aab1 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -34,7 +34,7 @@ class MessageController < ApplicationController def reply message = Message.find(params[:message_id], :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id ]) - @body = "\n\nOn #{message.sent_on} #{message.sender.display_name} wrote:\n #{message.body}" + @body = "On #{message.sent_on} #{message.sender.display_name} wrote:\n\n#{message.body.gsub(/^/, '> ')}" @title = "Re: #{message.title.sub(/^Re:\s*/, '')}" @user_id = message.from_user_id render :action => 'new' From a47fcb08579b06dcd615af92d9e530033d8673dc Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 5 May 2008 23:01:05 +0000 Subject: [PATCH 046/100] Fix replying to diary comments, and tidy a few things up. --- app/controllers/message_controller.rb | 2 ++ app/views/message/new.rhtml | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index 0fec8aab1..e79fe7461 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -17,6 +17,8 @@ class MessageController < ApplicationController Notifier::deliver_message_notification(@message) redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name end + else + @title = params[:title] end end diff --git a/app/views/message/new.rhtml b/app/views/message/new.rhtml index 723cb1f10..214df8d31 100644 --- a/app/views/message/new.rhtml +++ b/app/views/message/new.rhtml @@ -1,5 +1,5 @@ -<% display_name = User.find_by_id(params[:user_id] || @user_id).display_name %> -<% title = params[:message] ? params[:message][:title] : params[:title] %> +<% user_id = params[:user_id] || @user_id %> +<% display_name = User.find_by_id(user_id).display_name %>

    Send a new message to <%= h(display_name) %>

    @@ -10,11 +10,11 @@ <%= error_messages_for 'message' %> -<% form_for :message, :url => {:user_id => params[:user_id] || @user_id, :action => "new" } do |f| %> +<% form_for :message, :url => { :action => "new", :user_id => user_id } do |f| %> - + From 895eb829c9647ba72fd49675bb0cbd82dda8bd5e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 6 May 2008 16:35:24 +0000 Subject: [PATCH 047/100] Backout message deletion functionality as it has unfortunate side effects as it also removes the message from the sender's outbox. --- app/controllers/message_controller.rb | 12 ------------ app/views/message/_message_summary.rhtml | 2 -- app/views/message/read.rhtml | 1 - config/routes.rb | 1 - 4 files changed, 16 deletions(-) diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index e79fe7461..85c0ac328 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -22,18 +22,6 @@ class MessageController < ApplicationController end end - def destroy - @message = Message.find(params[:message_id], :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id ]) - if !@message.message_read - flash[:notice] = 'Message not read and so not deleted' - redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name - else - flash[:notice] = "Message '#{@message.title}' deleted" - @message.destroy - redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name - end - end - def reply message = Message.find(params[:message_id], :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id ]) @body = "On #{message.sent_on} #{message.sender.display_name} wrote:\n\n#{message.body.gsub(/^/, '> ')}" diff --git a/app/views/message/_message_summary.rhtml b/app/views/message/_message_summary.rhtml index dbd71f017..6d45d33dd 100644 --- a/app/views/message/_message_summary.rhtml +++ b/app/views/message/_message_summary.rhtml @@ -10,6 +10,4 @@ <% end %> - - diff --git a/app/views/message/read.rhtml b/app/views/message/read.rhtml index eccb26050..d44859029 100644 --- a/app/views/message/read.rhtml +++ b/app/views/message/read.rhtml @@ -32,7 +32,6 @@ -
    Subject<%= text_field_tag 'message[title]', title, :size => 60, :value => @title %><%= f.text_field :title, :size => 60, :value => @title %>
    Body<%= button_to 'Mark as read', :controller => 'message', :action => 'mark', :message_id => message_summary.id, :mark => 'read' %><%= button_to 'Reply', :controller => 'message', :action => 'reply', :message_id => message_summary.id %><%= button_to 'Delete', :controller => 'message', :action => 'destroy', :message_id => message_summary.id %>
    <%= button_to 'Reply', :controller => 'message', :action => 'reply', :message_id => @message.id %> <%= button_to 'Mark as unread', :controller => 'message', :action => 'mark', :message_id => @message.id, :mark => 'unread' %><%= button_to 'Delete', :controller => 'message', :action => 'destroy', :message_id => @message.id %> <%= link_to 'Back to inbox', :controller => 'message', :action => 'inbox', :display_name => @user.display_name %>
    diff --git a/config/routes.rb b/config/routes.rb index 06f1583ff..dc26259fa 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -144,7 +144,6 @@ ActionController::Routing::Routes.draw do |map| map.connect '/message/read/:message_id', :controller => 'message', :action => 'read' map.connect '/message/mark/:message_id', :controller => 'message', :action => 'mark' map.connect '/message/reply/:message_id', :controller => 'message', :action => 'reply' - map.connect '/message/delete/:message_id', :controller => 'message', :action => 'destroy' # fall through map.connect ':controller/:id/:action' From 74b6dabb7f785794fd8d9c68da334b4a75e4d9e9 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 6 May 2008 16:57:40 +0000 Subject: [PATCH 048/100] Tidy up handling of unknown traces. --- app/controllers/trace_controller.rb | 31 ++++++++++++----------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/app/controllers/trace_controller.rb b/app/controllers/trace_controller.rb index 3bb0d3323..cf35d0046 100644 --- a/app/controllers/trace_controller.rb +++ b/app/controllers/trace_controller.rb @@ -84,20 +84,15 @@ class TraceController < ApplicationController def view @trace = Trace.find(params[:id]) - unless @trace - flash[:notice] = "OH NOES! Trace not found!" + if @trace and @trace.visible? and + (@trace.public? or @trace.user.id == @user.id) + @title = "Viewing trace #{@trace.name}" + else + flash[:notice] = "Trace not found!" redirect_to :controller => 'trace', :action => 'list' - return - end - - @title = "Viewing trace #{@trace.name}" - if !@trace.visible? - render :nothing => true, :status => :not_found - elsif !@trace.public? and @trace.user.id != @user.id - render :nothing => true, :status => :forbidden end rescue ActiveRecord::RecordNotFound - flash[:notice] = "GPX file not found" + flash[:notice] = "Trace not found!" redirect_to :controller => 'trace', :action => 'list' end @@ -115,11 +110,11 @@ class TraceController < ApplicationController end else @trace = Trace.new({:name => "Dummy", - :tagstring => params[:trace][:tagstring], - :description => params[:trace][:description], - :public => params[:trace][:public], - :inserted => false, :user => @user, - :timestamp => Time.now}) + :tagstring => params[:trace][:tagstring], + :description => params[:trace][:description], + :public => params[:trace][:public], + :inserted => false, :user => @user, + :timestamp => Time.now}) @trace.valid? @trace.errors.add(:gpx_file, "can't be blank") end @@ -294,7 +289,7 @@ class TraceController < ApplicationController end end - private +private def do_create(file, tags, description, public) name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, '_') @@ -303,7 +298,7 @@ class TraceController < ApplicationController File.open(filename, "w") { |f| f.write(file.read) } @trace = Trace.new({:name => name, :tagstring => tags, - :description => description, :public => public}) + :description => description, :public => public}) @trace.inserted = false @trace.user = @user @trace.timestamp = Time.now From 801f02fdd95b056311d899e092b61be492b5cfd6 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 7 May 2008 11:05:17 +0000 Subject: [PATCH 049/100] Remove bogus apostrophe. --- app/views/site/index.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 94b24debf..895885360 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -21,7 +21,7 @@ Licensed under the Creative Commons Attribution-Share Alike 2.0 license -by the OpenStreetMap project and it's contributors. +by the OpenStreetMap project and its contributors.
    From b2289c29d4300b1964842da771056d06e705ee41 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Thu, 8 May 2008 10:24:17 +0000 Subject: [PATCH 050/100] Potlatch 0.9 --- public/potlatch/potlatch.swf | Bin 121258 -> 133334 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index ede135a1fd56a0894378c64d4987e5b26e174341..9f86b17bd30895e11a358720cf807d8b4100458f 100755 GIT binary patch literal 133334 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�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 VYf-Cp2FC#l&OB=tVQnS({{p%b?Dqfw literal 121258 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 Date: Fri, 9 May 2008 14:10:10 +0000 Subject: [PATCH 051/100] Add the marker to the map correctly. --- app/views/diary_entry/new.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/diary_entry/new.rhtml b/app/views/diary_entry/new.rhtml index 6c40eaeb5..0a5203a66 100644 --- a/app/views/diary_entry/new.rhtml +++ b/app/views/diary_entry/new.rhtml @@ -66,7 +66,7 @@ removeMarkerFromMap(marker); } - marker = addMarkerToMap(merc, null, "Diary entry location"); + marker = addMarkerToMap(lonlat, null, "Diary entry location"); } function openMap() { From 4d8ea0eed0d47b3547f222fbc47524328bbd23a7 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 11 May 2008 14:41:11 +0000 Subject: [PATCH 052/100] Only add the data layer to the main map, and use the visibility changed event to handle turning the data layer on and off. --- app/views/site/index.rhtml | 12 ++++++++++++ public/javascripts/map.js | 6 ++---- public/openlayers/OpenStreetMap.js | 16 ---------------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 895885360..bd114a6b3 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -86,6 +86,10 @@ by the OpenStreetMap project and its contributors. function mapInit(){ map = createMap("map"); + map.dataLayer = new OpenLayers.Layer("Data", { "visibility": false }); + map.dataLayer.events.register("visibilitychanged", map.dataLayer, toggleData); + map.addLayer(map.dataLayer); + <% if bbox %> var bbox = new OpenLayers.Bounds(<%= minlon %>, <%= minlat %>, <%= maxlon %>, <%= maxlat %>); @@ -118,6 +122,14 @@ by the OpenStreetMap project and its contributors. handleResize(); } + function toggleData() { + if (map.dataLayer.visibility) { + <%= remote_function :url => { :controller => 'browse', :action => 'start' } %> + } else { + closeSidebar(); + } + } + function getPosition() { return getMapCenter(); } diff --git a/public/javascripts/map.js b/public/javascripts/map.js index c7f381d84..9b144c560 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -8,7 +8,8 @@ OpenLayers._getScriptLocation = function () { } function createMap(divName, options) { - if (!options) { options = {} } + options = options || {}; + map = new OpenLayers.Map(divName, { controls: options.controls || [ new OpenLayers.Control.ArgParser(), @@ -40,9 +41,6 @@ function createMap(divName, options) { wrapDateLine: true }); map.addLayer(maplint); - var data = new OpenLayers.Layer.Data("Data", {'visibility': false}); - map.addLayer(data); - map.dataLayer = data; var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels); markers = new OpenLayers.Layer.Markers("Markers", { diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index f472d3fc1..d6bc397d1 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -182,19 +182,3 @@ OpenLayers.Layer.OSM.Maplint = OpenLayers.Class(OpenLayers.Layer.OSM, { CLASS_NAME: "OpenLayers.Layer.OSM.Maplint" }); - -OpenLayers.Layer.Data = OpenLayers.Class(OpenLayers.Layer, { - setVisibility: function(vis) { - var oldvis = this.visibility; - OpenLayers.Layer.prototype.setVisibility.apply(this, arguments); - if (!this.map) { return; } - if (vis && !oldvis) { - new Ajax.Request('/browse/start', {asynchronous:true, evalScripts:true}); - } else { - if (this.stopBrowse) { - this.stopBrowse(); - closeSidebar(); - } - } - } -}); From 75f160aeb4983e679656d323c27766495953ba1f Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 11 May 2008 14:42:44 +0000 Subject: [PATCH 053/100] Fix what looks like an accidental change to the stylesheeet. --- public/stylesheets/site.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index 801654877..2ede490ef 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -1,4 +1,4 @@ -a m +a { color: #0000ff; text-decoration: none; } From cf9f5ba9333ac2dee444bdb5d4e20523061de184 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 11 May 2008 16:15:35 +0000 Subject: [PATCH 054/100] Add maximiseMap() and minimiseMap() functions to the edit page to allow the size of the editing area to be toggled. --- app/views/site/edit.rhtml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/views/site/edit.rhtml b/app/views/site/edit.rhtml index ac54cb5e5..afd33e4ae 100644 --- a/app/views/site/edit.rhtml +++ b/app/views/site/edit.rhtml @@ -105,7 +105,29 @@ resizeMap(); } + + function maximiseMap() { + $("left").style.display = "none"; + $("greeting").style.display = "none"; + $("tabnav").style.display = "none"; + + $("content").style.top = "10px"; + $("content").style.left = "10px"; + + handleResize(); + } + function minimiseMap() { + $("left").style.display = ""; + $("greeting").style.display = ""; + $("tabnav").style.display = ""; + + $("content").style.top = "35px"; + $("content").style.left = "192px"; + + handleResize(); + } + handleResize(); window.onload = handleResize; From 3b02a271905cff8b3036df638df8d6d4e2bcac35 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Sun, 11 May 2008 20:16:09 +0000 Subject: [PATCH 055/100] Potlatch 0.9a --- public/potlatch/potlatch.swf | Bin 133334 -> 135506 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 9f86b17bd30895e11a358720cf807d8b4100458f..40e964e3c7101e7c7ace7d40f746fa25ec833729 100755 GIT binary patch delta 31438 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⪻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 delta 29617 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 WlRMhGB3`m^Zx)wz_MKc From e2cfc813f3b0edb0286abcd829c4e172b1d7cbaf Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Sun, 11 May 2008 20:25:11 +0000 Subject: [PATCH 056/100] hmmm, probably best not to gratuitously send the same request every second --- public/potlatch/potlatch.swf | Bin 135506 -> 135544 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 40e964e3c7101e7c7ace7d40f746fa25ec833729..7cc793306c1d5485c019eabd575f3fb8fda99ad9 100755 GIT binary patch delta 127 zcmcb#h~vj14pz7DV2+B7tP%>0dYk1GzST3mW}G~6iuz>R1(uARo68sQGIB97aLCF` zV`kvYovgS(Oo|)GU}k^8%)r2z$1F3Aoq?T+fq{YJxUK)>c?;vD92lk{G%)*3<6vNC X1j=)+Wtx2OgGRH(qU{!o7^U(7{6`_- delta 115 zcmeydh~v^C4pz7DV2+@TtP%>09Gm47zST3GW}G~6iuz>R1(uANo68sQGD>kXaON_z zzhGuy;LKx|na0k*&cwjLz;WDGcJjW3aZFYWlh?eLmttn%%x4Y~p9Z9JfvPwd*cpMU SIM*`SHped79=nK9Iv)UoWFEc% From f365881a624add2ebf5205569bd09013de127cb0 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Mon, 12 May 2008 10:18:57 +0000 Subject: [PATCH 057/100] splash screen --- public/potlatch/potlatch.swf | Bin 135544 -> 137133 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 7cc793306c1d5485c019eabd575f3fb8fda99ad9..af12249a1e40d8ebce892c640b63dabdde375196 100755 GIT binary patch delta 37427 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 Y5PyC4DXyT7wrJT@d2N1AWv%Z210!Y^5&!@I delta 35652 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 G@_zs-($3BR From e62eacd8d3c839835308cf01da11827f844d3a91 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 15 May 2008 09:34:45 +0000 Subject: [PATCH 058/100] Remove bogus action attribute from the submit button - it should have no effect as there is no such attribute defined, but Opera seems to decide that it should post the form to that URL instead of the one give on the form element. --- app/views/message/new.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/message/new.rhtml b/app/views/message/new.rhtml index 214df8d31..d7bb18f8e 100644 --- a/app/views/message/new.rhtml +++ b/app/views/message/new.rhtml @@ -22,7 +22,7 @@ - <%= submit_tag 'Send', :action => 'new' %> + <%= submit_tag 'Send' %> <% end %> From 18777b41ea4aa1364dbf33e86e6cb65762b53296 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 15 May 2008 16:57:34 +0000 Subject: [PATCH 059/100] Tidy up map browse code and qualify various global names to avoid any risk of conflicts. --- app/views/browse/_start.rhtml | 17 +- app/views/browse/start.rjs | 734 ++++++++++++++++++---------------- 2 files changed, 407 insertions(+), 344 deletions(-) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index a6030a5a4..00e1411b9 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -1,12 +1,13 @@ -
    - diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 80a691b4e..35cd56591 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -1,359 +1,421 @@ page.replace_html :sidebar_title, 'Data' page.replace_html :sidebar_content, :partial => 'start' page << <= 15) { - useMap(); - } else { - $("status").innerHTML = "Zoom in or Select an area of the map to view."; - } - } + OpenLayers.Feature.Vector.style['default'].strokeWidth = 3; + OpenLayers.Feature.Vector.style['default'].cursor = "pointer"; - function stopBrowse() { - if (browsing) { - browsing = false; - map.dataLayer.stopBrowse = null; - if (gml) { - gml.destroy(); - gml = null; - } - if (sf) { - sf.destroy(); - sf = null; - } - if (box) { - box.destroy(); - box = null; - } - if (currentFeature) { - currentFeature.destroy(); - currentFeature = null; - } - map.dataLayer.setVisibility(false); - map.events.unregister("moveend", map, showData); - } - } - - function startDrag() { - $("drag_box").innerHTML='Drag a box on the map to select an area'; - box.activate(); - return false; - }; - $("drag_box").onclick = startDrag; - - function useMap() { - var bounds = map.getExtent(); - var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326); - if (!currentBounds || !currentBounds.containsBounds(projected)) { - var center = bounds.getCenterLonLat(); - var tileWidth = bounds.getWidth() * 1.2; - var tileHeight = bounds.getHeight() * 1.2; - var tileBounds = - new OpenLayers.Bounds(center.lon - (tileWidth / 2), - center.lat - (tileHeight / 2), - center.lon + (tileWidth / 2), - center.lat + (tileHeight / 2)); + function startBrowse() { + openSidebar({ onclose: stopBrowse }); - currentBounds = tileBounds; - getData(tileBounds); - mode = "auto"; - $("use_map").style.display="none"; - } - return false; - } - $("use_map").onclick = useMap; + var vectors = new OpenLayers.Layer.Vector(); - function endDrag(bbox) { - var bounds = bbox.getBounds(); - box.deactivate(); - currentBounds = bounds; - getData(bounds); - $("drag_box").innerHTML = "Manually select a different area"; - mode = "manual"; - $("use_map").style.display="inline"; + browseBoxControl = new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, { + handlerOptions: { + sides: 4, + snapAngle: 90, + irregular: true, + persist: true, + callbacks: { done: endDrag } + } + }); + map.addControl(browseBoxControl); + + map.events.register("moveend", map, showData); + map.events.triggerEvent("moveend"); + + browseActive = true; + } + + function showData() { + if (browseMode == "auto") { + if (map.getZoom() >= 15) { + useMap(); + } else { + $("browse_status").innerHTML = "Zoom in or Select an area of the map to view."; + } } - - function displayFeatureWarning() { - $("status").innerHTML = ""; - var div = document.createElement("div"); - var p = document.createElement("p"); - p.appendChild(document.createTextNode("You have loaded an area which contains " + featureList.length + " features. In general, some browsers may not cope well with displaying this quantity of data. Generally, browsers work best at displaying less than 100 features at a time: doing anything else may make your browser slow/unresponsive. If you are sure you want to display this data, you may do so by clicking the button below.")); - div.appendChild(p); - var input = document.createElement("input"); - input.type = "submit"; - input.value = "Load Data"; - input.onclick = loadFeatureList; - div.appendChild(input); - $("object").innerHTML=""; - $("object").appendChild(div); - } - - function loadFeatureList() { - gml.addFeatures(featureList); - gml.events.triggerEvent("loadend"); - return false; + } + + function stopBrowse() { + if (browseActive) { + browseActive = false; + + if (browseDataLayer) { + browseDataLayer.destroy(); + browseDataLayer = null; + } + + if (browseSelectControl) { + browseSelectControl.destroy(); + browseSelectControl = null; + } + + if (browseBoxControl) { + browseBoxControl.destroy(); + browseBoxControl = null; + } + + if (browseActiveFeature) { + browseActiveFeature.destroy(); + browseActiveFeature = null; + } + + map.dataLayer.setVisibility(false); + map.events.unregister("moveend", map, showData); } - - function customDataLoader(request) { - if (!browsing) { return; } - var doc = request.responseXML; - - if (!doc || !doc.documentElement) { - doc = request.responseText; - } - - var options = {}; - - OpenLayers.Util.extend(options, this.formatOptions); - if (this.map && !this.projection.equals(this.map.getProjectionObject())) { - options.externalProjection = this.projection; - options.internalProjection = this.map.getProjectionObject(); - } - - var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options); - var features = gml.read(doc); - if (!this.maxFeatures || features.length <= this.maxFeatures) { - this.addFeatures(features); - this.events.triggerEvent("loadend"); - featureList = []; - } else { - featureList = features; - displayFeatureWarning(); - } - } - - function getData(bounds) { - - bounds.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); - var size = bounds.getWidth() * bounds.getHeight(); - if (size > 0.25) { - $("status").innerHTML = "Unable to load: Bounding box size of " + size + " is too large. (Must be smaller than 0.25)
    "; - return; - } - - var url = "/api/0.5/map?bbox="+bounds.toBBOX(); - - loadGML(url); - } - function loadGML(url) { - $("status").innerHTML = "Loading..."; - $("object").innerHTML = ""; - if (!gml) { - var style = new OpenLayers.Style(); - style.addRules([new OpenLayers.Rule( - {'symbolizer': - {"Polygon": {'fillColor': '#ff0000', 'strokeColor': '#ff0000'}, - "Line": {'fillColor': '#ffff00', 'strokeColor': '#000000', strokeOpacity: '0.4'}, - "Point": {'fillColor': '#00ff00', 'strokeColor': '#00ff00'}} - } - )]); - gml = new OpenLayers.Layer.GML("Data",url, - {format: OpenLayers.Format.OSM, formatOptions: {checkTags: true}, - maxFeatures: 100, requestSuccess: customDataLoader, - displayInLayerSwitcher: false, - styleMap: new OpenLayers.StyleMap({'default': style, 'select': {'strokeColor': '#0000ff', strokeWidth: 8}}) - } - ); - gml.events.register("loadend", gml, dataLoaded ); - map.addLayer(gml); - - sf = new OpenLayers.Control.SelectFeature(gml, {'onSelect': onFeatureSelect}); - sf.handler.stopDown = false; - sf.handler.stopUp = false; - map.addControl(sf); - sf.activate(); - - } else { - gml.setUrl(url); - } - - currentFeature = null; - } - function dataLoaded() { - if (!browsing) { return; } - $("status").innerHTML = "Loaded." - - objList = document.createElement("div") - - list = document.createElement("ul"); - for (var i = 0; i < this.features.length; i++) { - var feature = this.features[i]; - - // Type, for linking - var type ="way"; - if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { - type = "node"; - } - var nice_name = type.substr(0,1).toUpperCase() + type.substr(1,type.length); - var li = document.createElement("li"); - li.appendChild(document.createTextNode(nice_name + " ")); - - // Link, for viewing in the tab - var link = document.createElement("a"); - link.href = "/browse/" + type + "/" + feature.osm_id; - var name = feature.attributes.name || feature.osm_id; - link.appendChild(document.createTextNode(name)); - link.feature = feature; - link.onclick = OpenLayers.Function.bind(viewFeatureLink, link); - li.appendChild(link); - - list.appendChild(li); - } - objList.appendChild(list) - var link = document.createElement("a"); - link.href = this.url; - link.appendChild(document.createTextNode("API")); - objList.appendChild(link) - $("object").innerHTML = ""; - $("object").appendChild(objList); - - } + } - function viewFeatureLink() { - var layer = this.feature.layer; - for (var i = 0; i < layer.selectedFeatures.length; i++) { - var f = layer.selectedFeatures[i]; - layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default")); - } - onFeatureSelect(this.feature); - if (mode != "auto") { - map.setCenter(this.feature.geometry.getBounds().getCenterLonLat()); - } - return false; - } + function startDrag() { + $("browse_select_box").innerHTML='Drag a box on the map to select an area'; + + browseBoxControl.activate(); + + return false; + }; + + $("browse_select_box").onclick = startDrag; - function loadObjList() { - $("object").innerHTML=""; - $("object").appendChild(objList); - return false; + function useMap() { + var bounds = map.getExtent(); + var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326); + + if (!browseBounds || !browseBounds.containsBounds(projected)) { + var center = bounds.getCenterLonLat(); + var tileWidth = bounds.getWidth() * 1.2; + var tileHeight = bounds.getHeight() * 1.2; + var tileBounds = new OpenLayers.Bounds(center.lon - (tileWidth / 2), + center.lat - (tileHeight / 2), + center.lon + (tileWidth / 2), + center.lat + (tileHeight / 2)); + + browseBounds = tileBounds; + getData(tileBounds); + + browseMode = "auto"; + + $("browse_select_view").style.display = "none"; } - - function onFeatureSelect(feature) { - // Unselect previously selected feature - if (currentFeature) { - currentFeature.layer.drawFeature( - currentFeature, currentFeature.layer.styleMap.createSymbolizer(currentFeature, "default") - ); + + return false; + } + + $("browse_select_view").onclick = useMap; + + function endDrag(bbox) { + var bounds = bbox.getBounds(); + var projected = bounds.clone().transform(map.getProjectionObject(), epsg4326); + + browseBoxControl.deactivate(); + browseBounds = projected; + getData(bounds); + + browseMode = "manual"; + + $("browse_select_box").innerHTML = "Manually select a different area"; + $("browse_select_view").style.display = "inline"; + } + + function displayFeatureWarning() { + $("browse_status").innerHTML = ""; + + var div = document.createElement("div"); + + var p = document.createElement("p"); + p.appendChild(document.createTextNode("You have loaded an area which contains " + browseFeatureList.length + " features. In general, some browsers may not cope well with displaying this quantity of data. Generally, browsers work best at displaying less than 100 features at a time: doing anything else may make your browser slow/unresponsive. If you are sure you want to display this data, you may do so by clicking the button below.")); + div.appendChild(p); + + var input = document.createElement("input"); + input.type = "submit"; + input.value = "Load Data"; + input.onclick = loadFeatureList; + div.appendChild(input); + + $("browse_object_list").innerHTML = ""; + $("browse_object_list").appendChild(div); + } + + function loadFeatureList() { + browseDataLayer.addFeatures(browseFeatureList); + browseDataLayer.events.triggerEvent("loadend"); + + browseFeatureList = []; + + return false; + } + + function customDataLoader(request) { + if (browseActive) { + var doc = request.responseXML; + + if (!doc || !doc.documentElement) { + doc = request.responseText; + } + + var options = {}; + + OpenLayers.Util.extend(options, this.formatOptions); + + if (this.map && !this.projection.equals(this.map.getProjectionObject())) { + options.externalProjection = this.projection; + options.internalProjection = this.map.getProjectionObject(); + } + + var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options); + + browseFeatureList = gml.read(doc); + + if (!this.maxFeatures || browseFeatureList.length <= this.maxFeatures) { + loadFeatureList(); + } else { + displayFeatureWarning(); + } + } + } + + function getData(bounds) { + var projected = bounds.clone().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); + var size = projected.getWidth() * projected.getHeight(); + + if (size > 0.25) { + $("browse_status").innerHTML = "Unable to load: Bounding box size of " + size + " is too large. (Must be smaller than 0.25)
    "; + } else { + loadGML("/api/0.5/map?bbox=" + projected.toBBOX()); + } + } + + function loadGML(url) { + $("browse_status").innerHTML = "Loading..."; + $("browse_object_list").innerHTML = ""; + + if (!browseDataLayer) { + var style = new OpenLayers.Style(); + + style.addRules([new OpenLayers.Rule({ + symbolizer: { + Polygon: { fillColor: '#ff0000', strokeColor: '#ff0000' }, + Line: { fillColor: '#ffff00', strokeColor: '#000000', strokeOpacity: '0.4' }, + Point: { fillColor: '#00ff00', strokeColor: '#00ff00' } } + })]); - // Redraw in selected style - feature.layer.drawFeature( - feature, feature.layer.styleMap.createSymbolizer(feature, "select") - ); + browseDataLayer = new OpenLayers.Layer.GML("Data", url, { + format: OpenLayers.Format.OSM, + formatOptions: { checkTags: true }, + maxFeatures: 100, + requestSuccess: customDataLoader, + displayInLayerSwitcher: false, + styleMap: new OpenLayers.StyleMap({ + default: style, + select: { strokeColor: '#0000ff', strokeWidth: 8 } + }) + }); + browseDataLayer.events.register("loadend", browseDataLayer, dataLoaded ); + map.addLayer(browseDataLayer); + + browseSelectControl = new OpenLayers.Control.SelectFeature(browseDataLayer, { onSelect: onFeatureSelect }); + browseSelectControl.handler.stopDown = false; + browseSelectControl.handler.stopUp = false; + map.addControl(browseSelectControl); + browseSelectControl.activate(); + } else { + browseDataLayer.setUrl(url); + } - // If the current object is the list, don't innerHTML="", since that could clar it. - if ($("object").firstChild == objList) { - $("object").removeChild(objList); - } else { - $("object").innerHTML = ""; - } - - // Create a link back to the object list - var div = document.createElement("div"); - var link = document.createElement("a"); - link.href="#"; - link.onclick = loadObjList; - link.appendChild(document.createTextNode("Back to Object List")); - div.appendChild(link) - $("object").appendChild(div); + browseActiveFeature = null; + } + + function dataLoaded() { + if (browseActive) { + $("browse_status").innerHTML = "Loaded." + var list = document.createElement("ul"); + + for (var i = 0; i < this.features.length; i++) { + var feature = this.features[i]; + + // Type, for linking var type = "way"; if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { - type = "node"; - } - - var link = document.createElement("a"); - link.href = "/browse/"+type+"/"+feature.osm_id; - link.appendChild(document.createTextNode("Database entry for " + feature.osm_id)); - - var div = document.createElement("div"); - div.style.marginTop = "20px" - div.appendChild(link); - - $("object").appendChild(div); - - // Now the list of attributes - var ul = document.createElement("ul"); - for (var key in feature.attributes) { - var li = document.createElement("li"); - var b = document.createElement("b"); - b.appendChild(document.createTextNode(key)); - li.appendChild(b); - li.appendChild(document.createTextNode(": " + feature.attributes[key])); - ul.appendChild(li); - } - - $("object").appendChild(ul); - - var link = document.createElement("a"); - link.href = "/browse/"+type+"/"+feature.osm_id+"/history"; - link.appendChild(document.createTextNode("History")); - ul.appendChild(li); - link.onclick = OpenLayers.Function.bind(loadHistory, {type: type, feature: feature, link: link}); - - $("object").appendChild(link); - - // Stash the currently drawn feature - currentFeature = feature; - } - function loadHistory() { - this.link.href = ""; - this.link.innerHTML = "Wait..."; - new Ajax.Request("/api/0.5/"+this.type+"/"+this.feature.osm_id+"/history", {onComplete: OpenLayers.Function.bind(displayHistory, this)}); - return false; - } - function displayHistory(request) { - if (currentFeature.osm_id != this.feature.osm_id || $("object").firstChild == objList) { - return false; + type = "node"; } - this.link.parentNode.removeChild(this.link); - var doc = request.responseXML; - var div = document.createElement("div"); - var h3 = document.createElement("h3"); - h3.appendChild(document.createTextNode("History")); - div.appendChild(h3); - var nodes = doc.getElementsByTagName(this.type); - var history = document.createElement("ul"); - for (var i = nodes.length - 1; i >= 0; i--) { - var user = nodes[i].getAttribute("user") || "private user"; - var timestamp = nodes[i].getAttribute("timestamp"); - var item = document.createElement("li"); - item.appendChild(document.createTextNode("Edited by " + user + " at " + timestamp)); - history.appendChild(item); - } - div.appendChild(history); + var typeName = type.substr(0,1).toUpperCase() + type.substr(1,type.length); + var li = document.createElement("li"); + li.appendChild(document.createTextNode(typeName + " ")); + + // Link, for viewing in the tab var link = document.createElement("a"); - link.appendChild(document.createTextNode("History entry for " + this.feature.osm_id)); - link.href = "/browse/"+this.type+"/"+this.feature.osm_id+"/history"; - div.appendChild(link); - $("object").appendChild(div); + link.href = "/browse/" + type + "/" + feature.osm_id; + var name = feature.attributes.name || feature.osm_id; + link.appendChild(document.createTextNode(name)); + link.feature = feature; + link.onclick = OpenLayers.Function.bind(viewFeatureLink, link); + li.appendChild(link); + + list.appendChild(li); + } + + browseObjectList = document.createElement("div") + browseObjectList.appendChild(list) + + var link = document.createElement("a"); + link.href = this.url; + link.appendChild(document.createTextNode("API")); + browseObjectList.appendChild(link); + + $("browse_object_list").innerHTML = ""; + $("browse_object_list").appendChild(browseObjectList); } + } - start(); + function viewFeatureLink() { + var layer = this.feature.layer; + + for (var i = 0; i < layer.selectedFeatures.length; i++) { + var f = layer.selectedFeatures[i]; + layer.drawFeature(f, layer.styleMap.createSymbolizer(f, "default")); + } + + onFeatureSelect(this.feature); + + if (browseMode != "auto") { + map.setCenter(this.feature.geometry.getBounds().getCenterLonLat()); + } + + return false; + } + + function loadObjectList() { + $("browse_object_list").innerHTML=""; + $("browse_object_list").appendChild(browseObjectList); + + return false; + } + + function onFeatureSelect(feature) { + // Unselect previously selected feature + if (browseActiveFeature) { + browseActiveFeature.layer.drawFeature( + browseActiveFeature, + browseActiveFeature.layer.styleMap.createSymbolizer(browseActiveFeature, "default") + ); + } + + // Redraw in selected style + feature.layer.drawFeature( + feature, feature.layer.styleMap.createSymbolizer(feature, "select") + ); + + // If the current object is the list, don't innerHTML="", since that could clear it. + if ($("browse_object_list").firstChild == browseObjectList) { + $("browse_object_list").removeChild(browseObjectList); + } else { + $("browse_object_list").innerHTML = ""; + } + + // Create a link back to the object list + var link = document.createElement("a"); + link.href = "#"; + link.onclick = loadObjectList; + link.appendChild(document.createTextNode("Back to Object List")); + + var div = document.createElement("div"); + div.appendChild(link) + + $("browse_object_list").appendChild(div); + + var type = "way"; + if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") { + type = "node"; + } + + var link = document.createElement("a"); + link.href = "/browse/" + type + "/" + feature.osm_id; + link.appendChild(document.createTextNode("Database entry for " + feature.osm_id)); + + var div = document.createElement("div"); + div.style.marginTop = "20px" + div.appendChild(link); + + $("browse_object_list").appendChild(div); + + // Now the list of attributes + var ul = document.createElement("ul"); + for (var key in feature.attributes) { + var li = document.createElement("li"); + var b = document.createElement("b"); + b.appendChild(document.createTextNode(key)); + li.appendChild(b); + li.appendChild(document.createTextNode(": " + feature.attributes[key])); + ul.appendChild(li); + } + + $("browse_object_list").appendChild(ul); + + var link = document.createElement("a"); + link.href = "/browse/"+type+"/"+feature.osm_id+"/history"; + link.appendChild(document.createTextNode("History")); + link.onclick = OpenLayers.Function.bind(loadHistory, { + type: type, feature: feature, link: link + }); + + $("browse_object_list").appendChild(link); + + // Stash the currently drawn feature + browseActiveFeature = feature; + } + + function loadHistory() { + this.link.href = ""; + this.link.innerHTML = "Wait..."; + + new Ajax.Request("/api/0.5/" + this.type + "/" + this.feature.osm_id + "/history", { + onComplete: OpenLayers.Function.bind(displayHistory, this) + }); + + return false; + } + + function displayHistory(request) { + if (browseActiveFeature.osm_id != this.feature.osm_id || $("browse_object_list").firstChild == browseObjectList) { + return false; + } + + this.link.parentNode.removeChild(this.link); + + var doc = request.responseXML; + var div = document.createElement("div"); + var h3 = document.createElement("h3"); + h3.appendChild(document.createTextNode("History")); + div.appendChild(h3); + + var nodes = doc.getElementsByTagName(this.type); + var history = document.createElement("ul"); + for (var i = nodes.length - 1; i >= 0; i--) { + var user = nodes[i].getAttribute("user") || "private user"; + var timestamp = nodes[i].getAttribute("timestamp"); + var item = document.createElement("li"); + item.appendChild(document.createTextNode("Edited by " + user + " at " + timestamp)); + history.appendChild(item); + } + div.appendChild(history); + + var link = document.createElement("a"); + link.appendChild(document.createTextNode("History entry for " + this.feature.osm_id)); + link.href = "/browse/"+this.type+"/"+this.feature.osm_id+"/history"; + div.appendChild(link); + + $("browse_object_list").appendChild(div); + } + + startBrowse(); EOJ From 1f59ad76eff4b63c149d406868527372191e268f Mon Sep 17 00:00:00 2001 From: Shaun McDonald Date: Fri, 16 May 2008 09:44:50 +0000 Subject: [PATCH 060/100] Showing a nice message for browsers with javascript disabled. closes #36 --- app/views/site/index.rhtml | 4 ++++ public/stylesheets/site.css | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 895885360..f924f7a14 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -8,6 +8,10 @@ <%= render :partial => 'key' %> <%= render :partial => 'search' %> + + diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index 2ede490ef..c6b566215 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -639,3 +639,10 @@ input[type="submit"] { width: 100%; text-align: center; } + +#noscript { + z-index:20000000; + position:absolute; + top:15px; + left:15px +} From 1ea1c62d15398ad7a8583596371abfa28407a624 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 16 May 2008 10:06:57 +0000 Subject: [PATCH 061/100] Try and make browsers display the search box sanely. --- app/views/site/_search.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/site/_search.rhtml b/app/views/site/_search.rhtml index f18587f73..d4214e8fe 100644 --- a/app/views/site/_search.rhtml +++ b/app/views/site/_search.rhtml @@ -40,7 +40,7 @@ :url => { :controller => :geocoder, :action => :search }) do %> - + From f08c9de07337d335347d65c98526bab4b938b824 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 16 May 2008 10:09:55 +0000 Subject: [PATCH 062/100] Reword the noscript section a bit. --- app/views/site/index.rhtml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index f924f7a14..d6247158d 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -8,9 +8,13 @@ <%= render :partial => 'key' %> <%= render :partial => 'search' %> - +
    From 889ee9e3680ea693351801a0f041852389a24db6 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Fri, 16 May 2008 10:32:53 +0000 Subject: [PATCH 063/100] fix revert to cope with moved nodes properly (OH NOES I updated some SQL) --- app/controllers/amf_controller.rb | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 421444869..4eda7b00a 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -638,8 +638,8 @@ class AmfController < ApplicationController # which means the SWF needs to allocate new ids # - if it's an invisible node, we can reuse the old node id - # get node list from specified version of way, - # and the _current_ lat/long/tags of each node + # ----- get node list from specified version of way, + # and the _current_ lat/long/tags of each node row=ActiveRecord::Base.connection.select_one("SELECT timestamp FROM ways WHERE version=#{version} AND id=#{id}") waytime=row['timestamp'] @@ -654,31 +654,31 @@ class AmfController < ApplicationController EOF rows=ActiveRecord::Base.connection.select_all(sql) - # if historic (full revert), get the old version of each node - # - if it's in another way now, generate a new id - # - if it's not in another way, use the old ID + # ----- if historic (full revert), get the old version of each node + # - if it's in another way now, generate a new id + # - if it's not in another way, use the old ID + if historic then rows.each_index do |i| sql=<<-EOF SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags,cwn.id AS currentway FROM nodes n - LEFT JOIN current_way_nodes cwn - ON cwn.node_id=n.id + LEFT JOIN current_way_nodes cwn + ON cwn.node_id=n.id AND cwn.id!=#{id} WHERE n.id=#{rows[i]['id']} AND n.timestamp<="#{waytime}" - AND cwn.id!=#{id} - ORDER BY n.timestamp DESC + ORDER BY n.timestamp DESC LIMIT 1 EOF row=ActiveRecord::Base.connection.select_one(sql) - unless row.nil? then - nx=row['longitude'].to_f - ny=row['latitude'].to_f + nx=row['longitude'].to_f + ny=row['latitude'].to_f + if (!row.nil?) if (row['currentway'] && (nx!=rows[i]['longitude'].to_f or ny!=rows[i]['latitude'].to_f or row['tags']!=rows[i]['tags'])) then rows[i]['id']=-1 end - rows[i]['longitude']=nx - rows[i]['latitude' ]=ny - rows[i]['tags' ]=row['tags'] - end + end + rows[i]['longitude']=nx + rows[i]['latitude' ]=ny + rows[i]['tags' ]=row['tags'] end end rows From a401b59242122697d423468175453073681c185e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 16 May 2008 10:42:51 +0000 Subject: [PATCH 064/100] Yet another at fixing the layout of the search box. Seems to work now on FF2, IE7, Operand and Safari though we are giving space away on FF. --- app/views/site/_search.rhtml | 9 ++------- public/stylesheets/site.css | 11 +++++++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/views/site/_search.rhtml b/app/views/site/_search.rhtml index d4214e8fe..5b4e74b34 100644 --- a/app/views/site/_search.rhtml +++ b/app/views/site/_search.rhtml @@ -38,13 +38,8 @@ <% form_remote_tag(:loading => "startSearch()", :complete => "endSearch()", :url => { :controller => :geocoder, :action => :search }) do %> -
    <%= text_field_tag :query, h(params[:query]) %><%= text_field_tag :query, h(params[:query]) %> <%= submit_tag 'Go' %>
    - - - - - -
    <%= text_field_tag :query, h(params[:query]) %><%= submit_tag 'Go' %>
    + <%= text_field_tag :query, h(params[:query]) %> + <%= submit_tag "Go" %> <% end %>

    Searching...

    diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index c6b566215..df04b7c99 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -354,13 +354,16 @@ hides rule from IE5-Mac \*/ padding: 0px; } -.optionalbox input { +#search_field form { width: 100%; } -.optionalbox td { - margin: 0px; - padding: 0px; +#search_field input[type="text"] { + width: 116px; +} + +#search_field input[type="submit"] { + width: 26px; } .search_form { From 0623e88d3931243f1b3afea3321ad4123de9acad Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 19 May 2008 09:57:58 +0000 Subject: [PATCH 065/100] Add the cycle map to the main site. --- public/export/embed.html | 9 ++++++++- public/javascripts/map.js | 6 ++++++ public/openlayers/OpenStreetMap.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/public/export/embed.html b/public/export/embed.html index ae82eb54a..af45a6b1f 100644 --- a/public/export/embed.html +++ b/public/export/embed.html @@ -37,13 +37,20 @@ attribution: attribution }); map.addLayer(mapnik); - } else { + } else if (args.layer == "osmarender") { var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", { displayOutsideMaxExtent: true, wrapDateLine: true, attribution: attribution }); map.addLayer(osmarender); + } else if (args.layer == "cycle map") { + var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map", { + displayOutsideMaxExtent: true, + wrapDateLine: true, + attribution: attribution + }); + map.addLayer(cyclemap); } if (args.marker) { diff --git a/public/javascripts/map.js b/public/javascripts/map.js index db5b85616..e1baba50e 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -34,6 +34,12 @@ function createMap(divName) { }); map.addLayer(osmarender); + var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map", { + displayOutsideMaxExtent: true, + wrapDateLine: true + }); + map.addLayer(cyclemap); + var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint", { displayOutsideMaxExtent: true, wrapDateLine: true diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js index c2acf2e0c..c783dba20 100644 --- a/public/openlayers/OpenStreetMap.js +++ b/public/openlayers/OpenStreetMap.js @@ -155,6 +155,34 @@ OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, { CLASS_NAME: "OpenLayers.Layer.OSM.Osmarender" }); +/** + * Class: OpenLayers.Layer.OSM.CycleMap + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.CycleMap + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.thunderflames.org/tiles/cycle/", + "http://b.thunderflames.org/tiles/cycle/", + "http://c.thunderflames.org/tiles/cycle/" + ]; + options = OpenLayers.Util.extend({ numZoomLevels: 17 }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.CycleMap" +}); + /** * Class: OpenLayers.Layer.OSM.Maplint * From e758e520e7d72cd93accfd0169e5d9592a7c87bb Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 19 May 2008 10:00:52 +0000 Subject: [PATCH 066/100] Make the "larger map" link on an HTML export point at the right layer. --- app/views/export/start.rjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/export/start.rjs b/app/views/export/start.rjs index 2babcc982..47cf9ce6b 100644 --- a/app/views/export/start.rjs +++ b/app/views/export/start.rjs @@ -246,7 +246,9 @@ page << <View Larger Map'; + var layers = getMapLayers(); + + html += '
    View Larger Map'; $("export_html_text").value = html; From de5e96585b8bd316f717247d355b57c50d7ccb1d Mon Sep 17 00:00:00 2001 From: Shaun McDonald Date: Tue, 20 May 2008 15:25:18 +0000 Subject: [PATCH 067/100] Add a check to make sure that a node/way/relation doesn't already exist in the relation as part of the preconditions. closes #718 --- app/models/relation.rb | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/models/relation.rb b/app/models/relation.rb index 61344bdfb..cedfaf656 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -202,22 +202,49 @@ class Relation < ActiveRecord::Base end def preconditions_ok? + # These are hastables that store an id in the index of all + # the nodes/way/relations that have already been added. + # Once we know the id of the node/way/relation exists + # we check to see if it is already existing in the hashtable + # if it does, then we return false. Otherwise + # we add it to the relevant hash table, with the value true.. + # Thus if you have nodes with the ids of 50 and 1 already in the + # relation, then the hash table nodes would contain: + # => {50=>true, 1=>true} + nodes = Hash.new + ways = Hash.new + relations = Hash.new self.members.each do |m| if (m[0] == "node") n = Node.find(:first, :conditions => ["id = ?", m[1]]) unless n and n.visible return false end + if nodes[m[1]] + return false + else + nodes[m[1]] = true + end elsif (m[0] == "way") w = Way.find(:first, :conditions => ["id = ?", m[1]]) unless w and w.visible and w.preconditions_ok? return false end + if ways[m[1]] + return false + else + ways[m[1]] = true + end elsif (m[0] == "relation") e = Relation.find(:first, :conditions => ["id = ?", m[1]]) unless e and e.visible and e.preconditions_ok? return false end + if relations[m[1]] + return false + else + relations[m[1]] = true + end else return false end From 436012c6975cf2eef7d9908ad48d70dad833afd0 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 20 May 2008 23:37:06 +0000 Subject: [PATCH 068/100] Make the layer attribute a bit less fragile - base layers and overlays are now treated separately so that adding a new base laser doesn't break things. --- public/javascripts/map.js | 46 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/public/javascripts/map.js b/public/javascripts/map.js index e1baba50e..7591d7d16 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -124,34 +124,38 @@ function getEventPosition(event) { } function getMapLayers() { - var layers = ""; + var layerConfig = ""; - for (var i=0; i< this.map.layers.length; i++) { - var layer = this.map.layers[i]; + for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) { + layerConfig += layers[i] == map.baseLayer ? "B" : "0"; + } - if (layer.isBaseLayer) { - layers += (layer == this.map.baseLayer) ? "B" : "0"; - } else { - layers += (layer.getVisibility()) ? "T" : "F"; + for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) { + layerConfig += layers[i].getVisibility() ? "T" : "F"; + } + + return layerConfig; +} + +function setMapLayers(layerConfig) { + var l = 0; + + for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) { + var c = layerConfig.charAt(l++); + + if (c == "B") { + map.setBaseLayer(layers[i]); } } - return layers; -} + while (layerConfig.charAt(l) == "B" || layerConfig.charAt(l) == "0") { + l++; + } -function setMapLayers(layers) { - for (var i=0; i < layers.length; i++) { - var layer = map.layers[i]; + for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) { + var c = layerConfig.charAt(l++); - if (layer) { - var c = layers.charAt(i); - - if (c == "B") { - map.setBaseLayer(layer); - } else if ( (c == "T") || (c == "F") ) { - layer.setVisibility(c == "T"); - } - } + layers[i].setVisibility(c == "T"); } } From 764d08ff6f8f3ad698d59a6178d53702c8901de4 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Wed, 21 May 2008 12:01:56 +0000 Subject: [PATCH 069/100] don't set _alpha so often when ways dimmed (SWF) --- public/potlatch/potlatch.swf | Bin 137133 -> 137283 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index af12249a1e40d8ebce892c640b63dabdde375196..4b4da77780b07cf060bbacec081f31d07df9aed1 100755 GIT binary patch delta 1049 zcmZ`&Ye*DP6u#%~wV7!%YqedaU0K5yTA>u7rM=ATv99J?Tc*~QJ^;3X7#bVG%?>3UgDp$aIz57D~G_8mZCzIG4HSo9~?SeP>$ki)|0Y zDXX0hF)Q-n6q8j927sJjkaETyXMH_4ENex+!7oQ z56^V41Rr&#(5Vc4omTLn<8+q&an1Aghwh5}6KsR0MJ^rTq|*(kUeG@4{6P&qBy zivy`I0SYn6moQ@^%Tdb|GP8DWLYHqBIMKu7X7{|$K^@(~u;Xhi+Ir{17Od{Q3Pou8 z)*P{wNnxCuPpLL#S4oQT?YC&-q=ZG*6DpOUzOO>Jm6?@G2AYVs`=a#Qm{|@b(pQj5 z(bKn`Zf6K}vv6sDCX`}Le@}>uF_NLUR)P^+SnH4HvB{sn<4eDl4(hPq9}PP&Y#=vs zCld_333WU^WU^hKqxDmUhX+>uKiNKDgk9J(kRk478h#HZ58i>j?)Je$pxehXG4+LM z)lIuPVt99#w`-LHZ(bkV1nId5#Sxbo4OjH#eXCdNv&IPx<^tm8iO<*383;RG!G zB}jiR80OzIHkJ#G!-7G*<1&x%XPSl{mz?=el2aw?RnEWE*Wh%0^KfhPF!&=tR&IpT frqRRHS{y;AQk~3y#RemdQqCA@{a8w|m}tXq*&09t delta 990 zcmZ`%T}+c#82;YV1K)R2feMvkY_Vk2E&)w7%cc=xj3RDA(V|uq0e`3)OzSTyR?!#} zvn6Ws#D1D(iCcEFMIxjZnix&gUFxRBcthd^1zQub0)av|!1Gl}#Kd!P&Uw!BocDds zd)^0KTIUTdbB(`N>$G)e+ML?1Bq`@hJ!c{==hM=NTHQ<9s+H?&t7=xQi^RRzmspP) z8GG@!iLAKO>tRt761`5k2TRmR*RVLci~?wlenpFMEm}l5xF20g&+%Whl>Wq*eJ(l+ zubj8zaG#$t@KDa3DDL;uCWQL^NcBIXYW(}Mh`bnlxqxa=5UZf|Xo!Vq1A1ah9X_rq za)^4ehfRtoAzzp&nj;N1z!P_q4_o4HOD(T7cptZ?*NwOsZ~O`*9Xp#BXayz zkBRv?vImM0d|iZJ2C@t|DB(W?ZL|dyZ?3Pc<040<%23j2y++KfywYK;msnMrSR(yY zI<7Lss)REY@yQKG*sL(I4a*XHGwQfK%+Niahr5YV^LB}{6!DrwJw_5u)PU2;eB|7= zAoO-2)#I~*9FRy7YDgGz{P$pf?Vw5VlNjzVj{UoZR6qsQ%z_}7QixYMrdp~9mTCN*Sxm(roJYh zEu5>Un$ZWxW~dwJID+G@dBV?$injMfRjDCVrCJ zYtS%ZGZl+dxIE#}I^r~;{z|_sa6g{$1O7FHZs~)s6Rj;wKpFbSjOjubKn`UR* L*iX~@E*rx;l>|eY From 6e30a771e5c2e247f04799cff417e5f7e05bc235 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Wed, 21 May 2008 15:20:55 +0000 Subject: [PATCH 070/100] temporarily disable OAM (SWF) --- public/potlatch/potlatch.swf | Bin 137283 -> 137323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 4b4da77780b07cf060bbacec081f31d07df9aed1..ee60c82572df4842396a7e92b96a94ec24ae0565 100755 GIT binary patch delta 107 zcmX@Sf#dZC4pz7DV2dR`NFqWL!2me1Vk!BLf42 ar_fv`23CfdObh}H%{>dY_bg!CUJd}_ts7nd delta 71 zcmaF8f#dK74pz7DU=HVvtP%=rKfg0FbQo_|R(Po==9pTPnV6%XtKeUdng`+dCKhZq Y^*0G*oH#jafmQR)1>1KnVBAy=0F+r9761SM From fc98b97e591acf043e1a6721d6327719dd53a53f Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Sun, 25 May 2008 08:17:16 +0000 Subject: [PATCH 071/100] Potlatch 0.9b --- public/potlatch/potlatch.swf | Bin 137323 -> 137924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index ee60c82572df4842396a7e92b96a94ec24ae0565..8c3d0c9153c364a0c7efcc83c9eed2144e898d5a 100755 GIT binary patch literal 137924 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

    Pbuwud6QQ=vRwGk;uwV# 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 literal 137323 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 z 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 From f053c8472336b386eaff72acdcdb8f8e148a3340 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 28 May 2008 23:46:55 +0000 Subject: [PATCH 072/100] Improve the layout of the browse sidebar a bit. --- app/views/browse/_start.rhtml | 8 +- app/views/browse/start.rjs | 170 +++++++++++++++++++++++----------- public/stylesheets/site.css | 12 +++ 3 files changed, 131 insertions(+), 59 deletions(-) diff --git a/app/views/browse/_start.rhtml b/app/views/browse/_start.rhtml index 00e1411b9..2e120c100 100644 --- a/app/views/browse/_start.rhtml +++ b/app/views/browse/_start.rhtml @@ -1,13 +1,13 @@ -

    +
    -
    + -
    +
    diff --git a/app/views/browse/start.rjs b/app/views/browse/start.rjs index 35cd56591..04f5e12c9 100644 --- a/app/views/browse/start.rjs +++ b/app/views/browse/start.rjs @@ -41,7 +41,7 @@ page << <= 15) { useMap(); } else { - $("browse_status").innerHTML = "Zoom in or Select an area of the map to view."; + setStatus("Zoom in or select an area of the map to view"); } } } @@ -126,7 +126,7 @@ page << < 0.25) { - $("browse_status").innerHTML = "Unable to load: Bounding box size of " + size + " is too large. (Must be smaller than 0.25)
    "; + setStatus("Unable to load: Bounding box size of " + size + " is too large (must be smaller than 0.25)"); } else { loadGML("/api/0.5/map?bbox=" + projected.toBBOX()); } } function loadGML(url) { - $("browse_status").innerHTML = "Loading..."; - $("browse_object_list").innerHTML = ""; + setStatus("Loading..."); + $("browse_content").innerHTML = ""; if (!browseDataLayer) { var style = new OpenLayers.Style(); @@ -236,19 +236,23 @@ page << < Date: Thu, 29 May 2008 01:18:38 +0000 Subject: [PATCH 073/100] Potlatch 0.9c --- public/potlatch/potlatch.swf | Bin 137924 -> 140422 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 8c3d0c9153c364a0c7efcc83c9eed2144e898d5a..678b09d0c426372f5ac3c5b863d670d96308cb11 100755 GIT binary patch literal 140422 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 literal 137924 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

    Pbuwud6QQ=vRwGk;uwV# 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 From b8569b1e1324ac29383f1f87517c030993e45a72 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Thu, 29 May 2008 19:58:05 +0000 Subject: [PATCH 074/100] fix node relations bug (thanks Dave!) --- public/potlatch/potlatch.swf | Bin 140422 -> 140596 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index 678b09d0c426372f5ac3c5b863d670d96308cb11..721840fe4ec4d006d7b62d134313f7e90fffee54 100755 GIT binary patch delta 304 zcmZoW$+6`W2b)`XFo%iiMz(8;Oxnzw?wSO!W`RQ zTw`QoWGtQj{yL-E9KDZ`KDjhWE28xVFj7&H$C?a<3+}-?e=dOPlz${PQUP*QJ>Lk+8;)BsC*p@ zlkD_V7N*TiY>d;TSeYz%0vV>UF>tywbM9f3nSN1|Q4HbG>6xrd+Zex1S72k(U~*?b U$RZ3An?9e7iG6!98u=z$wir3sRWM$RR5;jfsIHsX0G>dwx9Q=9tRvi%(sju#F#!ZOxOOys3)KYvYXSL8D{15y(~-@nO-qWpTNpw zA#TbrjSVErxrY(#BB;Bj|7K;{#&nBe`a)JFbw=&!4xEf)(~q+-@lN+;XJX&3$j&4z F2LNA;P6q%0 From 48000eb09ad072e83789c1efb002c259222ae91a Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 29 May 2008 20:43:58 +0000 Subject: [PATCH 075/100] Require a form post to finally confirm an account to stop accidental confirmations. --- app/controllers/user_controller.rb | 24 +++++++++++++----------- app/views/user/confirm.rhtml | 9 +++++++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index e998e83c6..31955d019 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -143,17 +143,19 @@ class UserController < ApplicationController end def confirm - token = UserToken.find_by_token(params[:confirm_string]) - if token and !token.user.active? - @user = token.user - @user.active = true - @user.save! - token.destroy - flash[:notice] = 'Confirmed your account, thanks for signing up!' - session[:user] = @user.id - redirect_to :action => 'account', :display_name => @user.display_name - else - flash[:notice] = 'Something went wrong confirming that user.' + if params[:confirm_action] + token = UserToken.find_by_token(params[:confirm_string]) + if token and !token.user.active? + @user = token.user + @user.active = true + @user.save! + token.destroy + flash[:notice] = 'Confirmed your account, thanks for signing up!' + session[:user] = @user.id + redirect_to :action => 'account', :display_name => @user.display_name + else + flash[:notice] = 'Something went wrong confirming that user.' + end end end diff --git a/app/views/user/confirm.rhtml b/app/views/user/confirm.rhtml index 8b1378917..5577b7068 100644 --- a/app/views/user/confirm.rhtml +++ b/app/views/user/confirm.rhtml @@ -1 +1,10 @@ +

    Confirm a user account

    + +

    Press the confirm button below to activate your account.

    + +
    + + +
    + From c25a20ff133d0ff9c865ac2cbc0076544cb4f16b Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 2 Jun 2008 12:45:24 +0000 Subject: [PATCH 076/100] Don't try and parse an empty string as a layer config, and cope a bit better if we do hit the end of the string. Closes #942. --- app/views/site/index.rhtml | 2 +- public/javascripts/map.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index d6247158d..3e0400ce4 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -109,7 +109,7 @@ by the OpenStreetMap project and its contributors. setMapCenter(centre, zoom); <% end %> - <% if layers %> + <% if !layers.empty? %> setMapLayers("<%= layers %>"); <% end %> diff --git a/public/javascripts/map.js b/public/javascripts/map.js index 7591d7d16..9f9be0987 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -155,7 +155,11 @@ function setMapLayers(layerConfig) { for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) { var c = layerConfig.charAt(l++); - layers[i].setVisibility(c == "T"); + if (c == "T") { + layers[i].setVisibility(true); + } else if(c == "F") { + layers[i].setVisibility(false); + } } } From 2829bf79d0120ba534a1b4f5ad75ae1622a76d06 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 3 Jun 2008 15:12:46 +0000 Subject: [PATCH 077/100] Cope with not having a layer configuration at all. --- app/views/site/index.rhtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 3e0400ce4..e30dad1d0 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -76,8 +76,8 @@ by the OpenStreetMap project and its contributors. <% lon = '-0.1' %> <% lat = '51.5' %> <% zoom = h(params['zoom'] || '5') %> -<% layers = h(params['layers']) %> <% end %> +<% layers = h(params['layers']) %> <% end %> <%= javascript_include_tag '/openlayers/OpenLayers.js' %> @@ -109,7 +109,7 @@ by the OpenStreetMap project and its contributors. setMapCenter(centre, zoom); <% end %> - <% if !layers.empty? %> + <% if !layers.nil? and !layers.empty? %> setMapLayers("<%= layers %>"); <% end %> From 91bcc440212a73a6cc4587a2d95b8bc05a7266f5 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 5 Jun 2008 21:20:30 +0000 Subject: [PATCH 078/100] Make sure the diary tab always links to the global diary rather than a specific user's diary. Closes #956. --- app/views/layouts/site.rhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index 33e02449d..7283ebb32 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -52,7 +52,7 @@
  • <%= link_to 'Export', {:controller => 'site', :action => 'export'}, {:id => 'exportanchor', :title => 'export map data', :class => exportclass} %>
  • <% end %>
  • <%= link_to 'GPS Traces', {:controller => 'trace', :action => 'list'}, {:id => 'traceanchor', :title => 'manage traces', :class => traceclass} %>
  • -
  • <%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list'}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %>
  • +
  • <%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list', :display_name => nil}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %>
  • From e2539b7126586e50118433e2408f311554860246 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 5 Jun 2008 23:06:29 +0000 Subject: [PATCH 079/100] Switch to rails 2.0.2 as Debian/Ubuntu is able to handle it now. --- config/environment.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/environment.rb b/config/environment.rb index 02d99f20c..cfabe365f 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -5,8 +5,7 @@ ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -# DO NOT BUMP THIS TO 2.0.2 AS THE LIVE SERVERS CAN'T RUN THAT -RAILS_GEM_VERSION = '2.0.1' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION # Set the server URL SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' From cdf12b7a33334fefe58ed140c2874217591ac69e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 5 Jun 2008 23:27:52 +0000 Subject: [PATCH 080/100] Don't use comma to separate values in the location cookie, as rails 2.0.2 will treat comma (as well as semicolon) as a cookie separate. Also change the name of the location cookie to avoid problems parsing old ones. --- app/views/site/index.rhtml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index e30dad1d0..a79ea10c3 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -58,8 +58,8 @@ by the OpenStreetMap project and its contributors. <% lat = h(params['mlat']) %> <% zoom = h(params['zoom'] || '12') %> <% layers = h(params['layers']) %> -<% elsif cookies.key?("location") %> -<% lon,lat,zoom,layers = cookies["location"].split(",") %> +<% elsif cookies.key?("_osm_location") %> +<% lon,lat,zoom,layers = cookies["_osm_location"].split("|") %> <% elsif @user and !@user.home_lon.nil? and !@user.home_lat.nil? %> <% lon = @user.home_lon %> <% lat = @user.home_lat %> @@ -148,7 +148,7 @@ by the OpenStreetMap project and its contributors. updatelinks(lonlat.lon, lonlat.lat, zoom, layers); - document.cookie = "location=" + lonlat.lon + "," + lonlat.lat + "," + zoom + "," + layers; + document.cookie = "_osm_location=" + lonlat.lon + "|" + lonlat.lat + "|" + zoom + "|" + layers; } function resizeContent() { From 4fc6b982dd2eb839bd68ee24a14b08471e15ebe3 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 6 Jun 2008 23:17:56 +0000 Subject: [PATCH 081/100] Switch to rails 2.1.0 release. --- config/environment.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/environment.rb b/config/environment.rb index cfabe365f..87ac38982 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -5,7 +5,7 @@ ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION # Set the server URL SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' From e7346e590342bf41aa0262e89498b28111c97f6f Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 6 Jun 2008 23:32:21 +0000 Subject: [PATCH 082/100] Go back to rails 2.0.2 for now as 2.1.0 doesn't quite work... --- config/environment.rb | 2 +- config/initializers/composite_primary_keys.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/environment.rb b/config/environment.rb index 87ac38982..cfabe365f 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -5,7 +5,7 @@ ENV['RAILS_ENV'] ||= 'production' # Specifies gem version of Rails to use when vendor/rails is not present -RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION # Set the server URL SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb index 8fc935778..017408e9e 100644 --- a/config/initializers/composite_primary_keys.rb +++ b/config/initializers/composite_primary_keys.rb @@ -1 +1,2 @@ -require 'composite_primary_keys' +require 'rubygems' +gem 'composite_primary_keys', '= 0.9.93' From d29defa7ccff03c097a77709ae46cff33809d60c Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Fri, 6 Jun 2008 23:53:20 +0000 Subject: [PATCH 083/100] Magic foo to make composite_primary_keys work. --- config/initializers/composite_primary_keys.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb index 017408e9e..7deab668a 100644 --- a/config/initializers/composite_primary_keys.rb +++ b/config/initializers/composite_primary_keys.rb @@ -1,2 +1,3 @@ require 'rubygems' -gem 'composite_primary_keys', '= 0.9.93' +require_gem 'composite_primary_keys', '= 0.9.92' +require 'composite_primary_keys' From e8293baf8fe4c5947519a2871e0eca906789dcdc Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 7 Jun 2008 00:03:27 +0000 Subject: [PATCH 084/100] Let's have one last try... --- config/initializers/composite_primary_keys.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb index 7deab668a..430bcfac2 100644 --- a/config/initializers/composite_primary_keys.rb +++ b/config/initializers/composite_primary_keys.rb @@ -1,3 +1,3 @@ require 'rubygems' -require_gem 'composite_primary_keys', '= 0.9.92' +gem 'composite_primary_keys', '= 0.9.93' require 'composite_primary_keys' From 7d9bf3634c07e37bc1d2ff15a36f9c21f36d7c41 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 7 Jun 2008 22:40:39 +0000 Subject: [PATCH 085/100] Work around the fact that exists? no longer works for models with no primary key. --- app/models/trace.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/trace.rb b/app/models/trace.rb index 0e9e7bcc1..d28c2c6f4 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -183,7 +183,7 @@ class Trace < ActiveRecord::Base # If there are any existing points for this trace then delete # them - we check for existing points first to avoid locking # the table in the common case where there aren't any. - if Tracepoint.exists?(['gpx_id = ?', self.id]) + if Tracepoint.find(:first, :conditions => ['gpx_id = ?', self.id]) Tracepoint.delete_all(['gpx_id = ?', self.id]) end From 955122e41292828516d6b75c3baf813d00da76e2 Mon Sep 17 00:00:00 2001 From: Shaun McDonald Date: Tue, 10 Jun 2008 17:17:32 +0000 Subject: [PATCH 086/100] Replacing the non existant image with a pending text on the trace page --- app/views/trace/view.rhtml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/trace/view.rhtml b/app/views/trace/view.rhtml index d4bdb9745..f547f05db 100644 --- a/app/views/trace/view.rhtml +++ b/app/views/trace/view.rhtml @@ -1,6 +1,10 @@

    <%= h(@title) %>

    - + <% if @trace.inserted %> + + <% else %> + PENDING + <% end %> From 550ebc6c82e065461ad50f52c50cade040c33648 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Wed, 11 Jun 2008 14:45:36 +0000 Subject: [PATCH 087/100] trap for #971 until I can work out why it's doing it --- app/controllers/amf_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 4eda7b00a..359b45326 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -376,10 +376,11 @@ class AmfController < ApplicationController RAILS_DEFAULT_LOGGER.info(" Message: putway, id=#{originalway}") - # -- Check for null IDs or short ways + # -- Check for null IDs, short ways or lats=90 points.each do |a| if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end + if coord2lat(a[1],masterscale,basey)==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end end if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end From a21824f754ddea0e45beb87cdaa371e74359e2e2 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 21 Jun 2008 16:19:36 +0000 Subject: [PATCH 088/100] Removed bogus belongs_to user declaration. --- app/models/old_relation_member.rb | 3 --- app/models/old_relation_tag.rb | 3 --- 2 files changed, 6 deletions(-) diff --git a/app/models/old_relation_member.rb b/app/models/old_relation_member.rb index 9e2cce4c2..d8b685854 100644 --- a/app/models/old_relation_member.rb +++ b/app/models/old_relation_member.rb @@ -1,6 +1,3 @@ class OldRelationMember < ActiveRecord::Base - belongs_to :user - set_table_name 'relation_members' - end diff --git a/app/models/old_relation_tag.rb b/app/models/old_relation_tag.rb index 6ad4b452e..7ce6f694e 100644 --- a/app/models/old_relation_tag.rb +++ b/app/models/old_relation_tag.rb @@ -1,6 +1,3 @@ class OldRelationTag < ActiveRecord::Base - belongs_to :user - set_table_name 'relation_tags' - end From b527d27674f0ad4ad66075def914bde695d4d88e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sat, 21 Jun 2008 17:38:17 +0000 Subject: [PATCH 089/100] Use a polymorphic association to model relation members and add associations for upward links from objects to relations that they are a part of. --- app/models/node.rb | 13 ++++++++---- app/models/relation.rb | 9 +++++--- app/models/relation_member.rb | 39 ++++++++++++++--------------------- app/models/way.rb | 14 ++++++++----- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/app/models/node.rb b/app/models/node.rb index cc646b768..4393f2526 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -10,11 +10,16 @@ class Node < GeoRecord validates_numericality_of :latitude, :longitude validate :validate_position - has_many :ways, :through => :way_nodes - has_many :old_nodes, :foreign_key => :id - has_many :way_nodes belongs_to :user - + + has_many :old_nodes, :foreign_key => :id + + has_many :way_nodes + has_many :ways, :through => :way_nodes + + has_many :containing_relation_members, :as => :member + has_many :containing_relations, :through => :containing_relation_members + # Sanity check the latitude and longitude and add an error if it's broken def validate_position errors.add_to_base("Node is not in the world") unless in_world? diff --git a/app/models/relation.rb b/app/models/relation.rb index cedfaf656..cd2d67cdd 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -1,14 +1,17 @@ class Relation < ActiveRecord::Base require 'xml/libxml' + set_table_name 'current_relations' + belongs_to :user + has_many :old_relations, :foreign_key => 'id', :order => 'version' + has_many :relation_members, :foreign_key => 'id' has_many :relation_tags, :foreign_key => 'id' - has_many :old_relations, :foreign_key => 'id', :order => 'version' - - set_table_name 'current_relations' + has_many :containing_relation_members, :as => :member + has_many :containing_relations, :through => :containing_relation_members def self.from_xml(xml, create=false) begin diff --git a/app/models/relation_member.rb b/app/models/relation_member.rb index 79102853e..9ff4f46f3 100644 --- a/app/models/relation_member.rb +++ b/app/models/relation_member.rb @@ -1,30 +1,23 @@ class RelationMember < ActiveRecord::Base set_table_name 'current_relation_members' - - # problem with RelationMember is that it may link to any one - # object (a node, a way, another relation), and belongs_to is - # not flexible enough for that. So we do this, which is ugly, - # but fortunately rails won't actually run the SQL behind that - # unless someone really accesses .node, .way, or - # .relation - which is what we do below based on member_type. - # (and no: the :condition on belongs_to doesn't work here as - # it is a condition on the *referenced* object not the - # *referencing* object!) - belongs_to :node, :foreign_key => "member_id" - belongs_to :way, :foreign_key => "member_id" - belongs_to :relation, :foreign_key => "member_id" + belongs_to :member, :polymorphic => true, :foreign_type => :member_class + belongs_to :relation, :foreign_key => :id - # so we define this "member" function that returns whatever it - # is. - - def member() - return (member_type == "node") ? node : (member_type == "way") ? way : relation + def after_find + self[:member_class] = self.member_type.capitalize end - # NOTE - relations are SUBJECTS of memberships. The fact that nodes, - # ways, and relations can be the OBJECT of a membership, - # i.e. a node/way/relation can be referenced throgh a - # RelationMember object, is NOT modelled in rails, i.e. these links - # have to be resolved manually, on demand. + def after_initialize + self[:member_class] = self.member_type.capitalize + end + + def before_save + self.member_type = self[:member_class].downcase + end + + def member_type=(type) + self[:member_type] = type + self[:member_class] = type.capitalize + end end diff --git a/app/models/way.rb b/app/models/way.rb index f1dc76eb4..8ae6b4084 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -1,15 +1,19 @@ class Way < ActiveRecord::Base require 'xml/libxml' - belongs_to :user + set_table_name 'current_ways' - has_many :nodes, :through => :way_nodes, :order => 'sequence_id' - has_many :way_nodes, :foreign_key => 'id', :order => 'sequence_id' - has_many :way_tags, :foreign_key => 'id' + belongs_to :user has_many :old_ways, :foreign_key => 'id', :order => 'version' - set_table_name 'current_ways' + has_many :way_nodes, :foreign_key => 'id', :order => 'sequence_id' + has_many :nodes, :through => :way_nodes, :order => 'sequence_id' + + has_many :way_tags, :foreign_key => 'id' + + has_many :containing_relation_members, :class_name => "RelationMember", :as => :member + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation def self.from_xml(xml, create=false) begin From 2cf15b549e985f090648b449ca660b6d6e264f50 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 22 Jun 2008 12:10:32 +0000 Subject: [PATCH 090/100] Add support for putting the site in an offline mode where it operates without a database but with most features disabled. --- app/controllers/application.rb | 14 ++++++++++++-- app/controllers/diary_entry_controller.rb | 1 + app/controllers/trace_controller.rb | 5 ++++- app/controllers/user_controller.rb | 2 ++ app/views/layouts/site.rhtml | 4 ++-- app/views/site/edit.rhtml | 4 ++-- app/views/site/offline.rhtml | 3 +++ config/environment.rb | 15 +++++++++++---- config/routes.rb | 1 + 9 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 app/views/site/offline.rhtml diff --git a/app/controllers/application.rb b/app/controllers/application.rb index acb2f9162..7570fd82a 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -2,6 +2,10 @@ # Likewise, all the methods added will be available for all controllers. class ApplicationController < ActionController::Base + if OSM_STATUS == :database_offline + session :off + end + def authorize_web if session[:user] @user = User.find(session[:user]) @@ -39,8 +43,14 @@ class ApplicationController < ActionController::Base end end + def check_database_availability + if OSM_STATUS == :database_offline + redirect_to :controller => 'site', :action => 'offline' + end + end + def check_read_availability - if API_STATUS == :offline + if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline response.headers['Error'] = "Database offline for maintenance" render :nothing => true, :status => :service_unavailable return false @@ -48,7 +58,7 @@ class ApplicationController < ActionController::Base end def check_write_availability - if API_STATUS == :offline or API_STATUS == :readonly + if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline or OSM_STATUS == :api_readonly response.headers['Error'] = "Database offline for maintenance" render :nothing => true, :status => :service_unavailable return false diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb index a3b37b931..5159f7362 100644 --- a/app/controllers/diary_entry_controller.rb +++ b/app/controllers/diary_entry_controller.rb @@ -3,6 +3,7 @@ class DiaryEntryController < ApplicationController before_filter :authorize_web before_filter :require_user, :only => [:new] + before_filter :check_database_availability def new @title = 'new diary entry' diff --git a/app/controllers/trace_controller.rb b/app/controllers/trace_controller.rb index cf35d0046..0467e66ba 100644 --- a/app/controllers/trace_controller.rb +++ b/app/controllers/trace_controller.rb @@ -1,7 +1,10 @@ class TraceController < ApplicationController + layout 'site' + before_filter :authorize_web before_filter :authorize, :only => [:api_details, :api_data, :api_create] - layout 'site' + before_filter :check_database_availability, :except => [:api_details, :api_data, :api_create] + before_filter :check_read_availability, :only => [:api_details, :api_data, :api_create] # Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.). # target_user - if set, specifies the user to fetch traces for. if not set will fetch all traces diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 31955d019..5d26708fe 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -4,6 +4,8 @@ class UserController < ApplicationController before_filter :authorize, :only => [:api_details, :api_gpx_files] before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend, :upload_image] before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image] + before_filter :check_database_availability, :except => [:api_details, :api_gpx_files] + before_filter :check_read_availability, :only => [:api_details, :api_gpx_files] filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation diff --git a/app/views/layouts/site.rhtml b/app/views/layouts/site.rhtml index 7283ebb32..52e7b6b24 100644 --- a/app/views/layouts/site.rhtml +++ b/app/views/layouts/site.rhtml @@ -76,12 +76,12 @@ <% end %> - <% if API_STATUS == :offline %> + <% if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline %>
    The OpenStreetMap database is currently offline while essential database maintenance work is carried out.
    - <% elsif API_STATUS == :readonly %> + <% elsif OSM_STATUS == :api_readonly %>
    The OpenStreetMap database is currently in read-only mode while essential database maintenance work is carried out. diff --git a/app/views/site/edit.rhtml b/app/views/site/edit.rhtml index afd33e4ae..a3896bc48 100644 --- a/app/views/site/edit.rhtml +++ b/app/views/site/edit.rhtml @@ -1,8 +1,8 @@ -<% if API_STATUS == :offline %> +<% if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline %>

    The OpenStreetMap database is currently offline while essential database maintenance work is carried out.

    -<% elsif API_STATUS == :readonly %> +<% elsif OSM_STATUS == :api_readonly %>

    The OpenStreetMap database is currently in read-only mode while essential database maintenance work is carried out.

    diff --git a/app/views/site/offline.rhtml b/app/views/site/offline.rhtml new file mode 100644 index 000000000..d97a6ca90 --- /dev/null +++ b/app/views/site/offline.rhtml @@ -0,0 +1,3 @@ +

    The OpenStreetMap database is currently offline while + essential database maintenance work is carried out. +

    diff --git a/config/environment.rb b/config/environment.rb index cfabe365f..495f94d80 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -13,9 +13,14 @@ SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org' # Application constants needed for routes.rb - must go before Initializer call API_VERSION = ENV['OSM_API_VERSION'] || '0.5' -# Set to :readonly to put the API in read-only mode or :offline to -# take it completely offline -API_STATUS = :online +# Set application status - possible settings are: +# +# :online - online and operating normally +# :api_readonly - site online but API in read-only mode +# :api_offline - site online but API offline +# :database_offline - database offline with site in emergency mode +# +OSM_STATUS = :online # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') @@ -28,7 +33,9 @@ Rails::Initializer.run do |config| # Skip frameworks you're not going to use (only works if using vendor/rails). # To use Rails without a database, you must remove the Active Record framework - # config.frameworks -= [ :active_record, :active_resource, :action_mailer ] + if OSM_STATUS == :database_offline + config.frameworks -= [ :active_record ] + end # Only load the plugins named here, in the order given. By default, all plugins # in vendor/plugins are loaded in alphabetical order. diff --git a/config/routes.rb b/config/routes.rb index dc26259fa..290ad6e08 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -64,6 +64,7 @@ ActionController::Routing::Routes.draw do |map| map.connect '/export', :controller => 'site', :action => 'export' map.connect '/login', :controller => 'user', :action => 'login' map.connect '/logout', :controller => 'user', :action => 'logout' + map.connect '/offline', :controller => 'site', :action => 'offline' map.connect '/user/new', :controller => 'user', :action => 'new' map.connect '/user/save', :controller => 'user', :action => 'save' map.connect '/user/confirm', :controller => 'user', :action => 'confirm' From b72fedb162d3fcecc304d7dfe5f67acb30844099 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 22 Jun 2008 14:44:34 +0000 Subject: [PATCH 091/100] Make the polymorphic relation association work properly. --- app/models/node.rb | 10 +++++----- app/models/old_node.rb | 4 +++- app/models/relation.rb | 4 ++-- app/models/tracepoint.rb | 4 +++- {app/models => lib}/geo_record.rb | 6 ++++-- 5 files changed, 17 insertions(+), 11 deletions(-) rename {app/models => lib}/geo_record.rb (94%) diff --git a/app/models/node.rb b/app/models/node.rb index 4393f2526..be444bf3e 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -1,8 +1,8 @@ -# The node model represents a current existing node, that is, the latest version. Use OldNode for historical nodes. - -class Node < GeoRecord +class Node < ActiveRecord::Base require 'xml/libxml' + include GeoRecord + set_table_name 'current_nodes' validates_presence_of :user_id, :timestamp @@ -17,8 +17,8 @@ class Node < GeoRecord has_many :way_nodes has_many :ways, :through => :way_nodes - has_many :containing_relation_members, :as => :member - has_many :containing_relations, :through => :containing_relation_members + has_many :containing_relation_members, :class_name => "RelationMember", :as => :member + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation # Sanity check the latitude and longitude and add an error if it's broken def validate_position diff --git a/app/models/old_node.rb b/app/models/old_node.rb index 2c3e93b20..891b89731 100644 --- a/app/models/old_node.rb +++ b/app/models/old_node.rb @@ -1,4 +1,6 @@ -class OldNode < GeoRecord +class OldNode < ActiveRecord::Base + include GeoRecord + set_table_name 'nodes' validates_presence_of :user_id, :timestamp diff --git a/app/models/relation.rb b/app/models/relation.rb index cd2d67cdd..71ddc4a55 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -10,8 +10,8 @@ class Relation < ActiveRecord::Base has_many :relation_members, :foreign_key => 'id' has_many :relation_tags, :foreign_key => 'id' - has_many :containing_relation_members, :as => :member - has_many :containing_relations, :through => :containing_relation_members + has_many :containing_relation_members, :class_name => "RelationMember", :as => :member + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation def self.from_xml(xml, create=false) begin diff --git a/app/models/tracepoint.rb b/app/models/tracepoint.rb index 8648e555d..bf3cdd7c0 100644 --- a/app/models/tracepoint.rb +++ b/app/models/tracepoint.rb @@ -1,4 +1,6 @@ -class Tracepoint < GeoRecord +class Tracepoint < ActiveRecord::Base + include GeoRecord + set_table_name 'gps_points' validates_numericality_of :trackid, :only_integer => true diff --git a/app/models/geo_record.rb b/lib/geo_record.rb similarity index 94% rename from app/models/geo_record.rb rename to lib/geo_record.rb index ddd029aec..d5604d4d3 100644 --- a/app/models/geo_record.rb +++ b/lib/geo_record.rb @@ -1,5 +1,7 @@ -class GeoRecord < ActiveRecord::Base - before_save :update_tile +module GeoRecord + def before_save + self.update_tile + end # Is this node within -90 >= latitude >= 90 and -180 >= longitude >= 180 # * returns true/false From cfc14f1ddc0b451dbfdd5994e5672b2f1b11e0a8 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 22 Jun 2008 15:22:13 +0000 Subject: [PATCH 092/100] Make GeoRecord inject class methods correctly when included. --- lib/geo_record.rb | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/geo_record.rb b/lib/geo_record.rb index d5604d4d3..025bbe4a8 100644 --- a/lib/geo_record.rb +++ b/lib/geo_record.rb @@ -1,4 +1,8 @@ module GeoRecord + def self.included(base) + base.extend(ClassMethods) + end + def before_save self.update_tile end @@ -11,12 +15,6 @@ module GeoRecord return true end - def self.find_by_area(minlat, minlon, maxlat, maxlon, options) - self.with_scope(:find => {:conditions => OSM.sql_for_area(minlat, minlon, maxlat, maxlon)}) do - return self.find(:all, options) - end - end - def update_tile self.tile = QuadTile.tile_for_point(lat, lon) end @@ -48,11 +46,18 @@ module GeoRecord -(lat2y(self.lat)-basey)*masterscale end - private +private def lat2y(a) 180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2)) end + module ClassMethods + def find_by_area(minlat, minlon, maxlat, maxlon, options) + self.with_scope(:find => {:conditions => OSM.sql_for_area(minlat, minlon, maxlat, maxlon)}) do + return self.find(:all, options) + end + end + end end From 398d5fa3298b7aacea4a9cbddd0c4e5f8a9e6638 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 24 Jun 2008 16:44:45 +0000 Subject: [PATCH 093/100] Improve the layout of the object browser views. --- app/models/old_node.rb | 10 ++++ app/models/old_relation.rb | 17 +++++- app/models/old_way.rb | 17 +++++- app/models/relation.rb | 4 ++ app/models/way.rb | 5 ++ app/views/browse/_common.rhtml | 13 ---- app/views/browse/_common_details.rhtml | 22 +++++++ app/views/browse/_common_editedby.rhtml | 4 -- app/views/browse/_containing_relation.rhtml | 8 +++ app/views/browse/_map.rhtml | 66 +++++++++++++-------- app/views/browse/_member.rhtml | 5 -- app/views/browse/_navigation.rhtml | 22 +++---- app/views/browse/_node_details.rhtml | 19 ++++++ app/views/browse/_relation_details.rhtml | 27 +++++++++ app/views/browse/_relation_member.rhtml | 10 ++++ app/views/browse/_relation_members.rhtml | 11 ---- app/views/browse/_tag.rhtml | 3 +- app/views/browse/_tag_table.rhtml | 10 ---- app/views/browse/_way_details.rhtml | 27 +++++++++ app/views/browse/node.rhtml | 41 ++++++++----- app/views/browse/node_history.rhtml | 28 ++++++--- app/views/browse/relation.rhtml | 31 ++++++++-- app/views/browse/relation_history.rhtml | 29 ++++++--- app/views/browse/way.rhtml | 42 ++++++++----- app/views/browse/way_history.rhtml | 28 ++++++--- config/routes.rb | 2 +- 26 files changed, 358 insertions(+), 143 deletions(-) delete mode 100644 app/views/browse/_common.rhtml create mode 100644 app/views/browse/_common_details.rhtml delete mode 100644 app/views/browse/_common_editedby.rhtml create mode 100644 app/views/browse/_containing_relation.rhtml delete mode 100644 app/views/browse/_member.rhtml create mode 100644 app/views/browse/_node_details.rhtml create mode 100644 app/views/browse/_relation_details.rhtml create mode 100644 app/views/browse/_relation_member.rhtml delete mode 100644 app/views/browse/_relation_members.rhtml delete mode 100644 app/views/browse/_tag_table.rhtml create mode 100644 app/views/browse/_way_details.rhtml diff --git a/app/models/old_node.rb b/app/models/old_node.rb index 7bafca053..76eab8427 100644 --- a/app/models/old_node.rb +++ b/app/models/old_node.rb @@ -58,4 +58,14 @@ class OldNode < ActiveRecord::Base end hash end + + # Pretend we're not in any ways + def ways + return [] + end + + # Pretend we're not in any relations + def containing_relation_members + return [] + end end diff --git a/app/models/old_relation.rb b/app/models/old_relation.rb index 6da7814c2..bac03c4d2 100644 --- a/app/models/old_relation.rb +++ b/app/models/old_relation.rb @@ -107,5 +107,20 @@ class OldRelation < ActiveRecord::Base el1 << e end return el1 - end + end + + # Temporary method to match interface to nodes + def tags_as_hash + return self.tags + end + + # Temporary method to match interface to relations + def relation_members + return self.old_members + end + + # Pretend we're not in any relations + def containing_relation_members + return [] + end end diff --git a/app/models/old_way.rb b/app/models/old_way.rb index a2b165e42..1abb23bbb 100644 --- a/app/models/old_way.rb +++ b/app/models/old_way.rb @@ -108,5 +108,20 @@ class OldWay < ActiveRecord::Base el1 << e end return el1 - end + end + + # Temporary method to match interface to nodes + def tags_as_hash + return self.tags + end + + # Temporary method to match interface to ways + def way_nodes + return self.old_nodes + end + + # Pretend we're not in any relations + def containing_relation_members + return [] + end end diff --git a/app/models/relation.rb b/app/models/relation.rb index 71ddc4a55..a1dc9f81d 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -257,4 +257,8 @@ class Relation < ActiveRecord::Base return false end + # Temporary method to match interface to nodes + def tags_as_hash + return self.tags + end end diff --git a/app/models/way.rb b/app/models/way.rb index 8ae6b4084..b042be59e 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -257,4 +257,9 @@ class Way < ActiveRecord::Base self.delete_with_relations_and_history(user) end + + # Temporary method to match interface to nodes + def tags_as_hash + return self.tags + end end diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml deleted file mode 100644 index f237bfe15..000000000 --- a/app/views/browse/_common.rhtml +++ /dev/null @@ -1,13 +0,0 @@ -<% if obj.visible %> -<%= render :partial => 'map', :locals => { :type => type, :id => obj.id } %> -<% else %> -Deleted -<% end %> -
      -<% if obj.visible %> -
    • <%= link_to h("API"), :controller => type, :action => "read", :id => obj.id %>
    • -<% end %> -
    • <%= link_to h("History"), :controller => "old_" + type, :action => "history", :id => obj.id %> - (<%= link_to h("HTML"), :action => type+"_history", :id => obj.id %>)
    • -
    -<%= render :partial => 'common_editedby', :locals => { :obj => obj } %> diff --git a/app/views/browse/_common_details.rhtml b/app/views/browse/_common_details.rhtml new file mode 100644 index 000000000..ee5f22cee --- /dev/null +++ b/app/views/browse/_common_details.rhtml @@ -0,0 +1,22 @@ +
    + + + + +<% if common_details.user.data_public %> + + + + +<% end %> + +<% unless common_details.tags_as_hash.empty? %> + + + + +<% end %> diff --git a/app/views/browse/_common_editedby.rhtml b/app/views/browse/_common_editedby.rhtml deleted file mode 100644 index 0f00f3e3c..000000000 --- a/app/views/browse/_common_editedby.rhtml +++ /dev/null @@ -1,4 +0,0 @@ -Last edited: <%= h(obj.timestamp) %> -<% if obj.user.data_public %> -by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %> -<% end %> diff --git a/app/views/browse/_containing_relation.rhtml b/app/views/browse/_containing_relation.rhtml new file mode 100644 index 000000000..b33dea590 --- /dev/null +++ b/app/views/browse/_containing_relation.rhtml @@ -0,0 +1,8 @@ + + + diff --git a/app/views/browse/_map.rhtml b/app/views/browse/_map.rhtml index a0fcc06aa..9ca0a163a 100644 --- a/app/views/browse/_map.rhtml +++ b/app/views/browse/_map.rhtml @@ -1,44 +1,58 @@ <%= javascript_include_tag '/openlayers/OpenLayers.js' %> <%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> <%= javascript_include_tag 'map.js' %> -
    +Loading... + -Loading... - -
    diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml deleted file mode 100644 index 29a72b122..000000000 --- a/app/views/browse/_member.rhtml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/views/browse/_navigation.rhtml b/app/views/browse/_navigation.rhtml index 269184e02..57e724d42 100644 --- a/app/views/browse/_navigation.rhtml +++ b/app/views/browse/_navigation.rhtml @@ -1,13 +1,13 @@
    -<% if @prev %> -< -<%= link_to @prev.id.to_s, :action => type, :id => @prev.id %> -<% end %> -<% if @prev and @next %> -| -<% end %> -<% if @next %> -<%= link_to @next.id.to_s, :action => type, :id => @next.id %> -> -<% end %> + <% if @prev %> + < + <%= link_to @prev.id.to_s, :id => @prev.id %> + <% end %> + <% if @prev and @next %> + | + <% end %> + <% if @next %> + <%= link_to @next.id.to_s, :id => @next.id %> + > + <% end %>
    diff --git a/app/views/browse/_node_details.rhtml b/app/views/browse/_node_details.rhtml new file mode 100644 index 000000000..e3d11e0fe --- /dev/null +++ b/app/views/browse/_node_details.rhtml @@ -0,0 +1,19 @@ +
    Edited at:<%= h(common_details.timestamp) %>
    Edited by:<%= link_to h(common_details.user.display_name), :controller => "user", :action => "view", :display_name => common_details.user.display_name %>
    Tags: + + <%= render :partial => "tag", :collection => common_details.tags_as_hash %> +
    +
    + <%= link_to "Relation " + containing_relation.id.to_s, :action => "relation", :id => containing_relation.id.to_s %> + <% unless containing_relation.member_role.blank? %> + (as <%= h(containing_relation.member_role) %>) + <% end %> +
    <%= link_to member.member_id.to_s, :action => member.member_type, :id => member.member_id %><%= h(member.member_type) %><%= h(member.member_role) %>
    + + <%= render :partial => "common_details", :object => node_details %> + + <% unless node_details.ways.empty? and node_details.containing_relation_members.empty? %> + + + + + <% end %> + +
    Part of: + + <% node_details.ways.each do |way| %> + + <% end %> + <%= render :partial => "containing_relation", :collection => node_details.containing_relation_members %> +
    <%= link_to "Way " + way.id.to_s, :action => "way", :id => way.id.to_s %>
    +
    diff --git a/app/views/browse/_relation_details.rhtml b/app/views/browse/_relation_details.rhtml new file mode 100644 index 000000000..b8874d9ce --- /dev/null +++ b/app/views/browse/_relation_details.rhtml @@ -0,0 +1,27 @@ + + + <%= render :partial => "common_details", :object => relation_details %> + + <% unless relation_details.relation_members.empty? %> + + + + + <% end %> + + <% unless relation_details.containing_relation_members.empty? %> + + + + + <% end %> + +
    Members: + + <%= render :partial => "relation_member", :collection => relation_details.relation_members %> +
    +
    Part of: + + <%= render :partial => "containing_relation", :collection => relation_details.containing_relation_members %> +
    +
    diff --git a/app/views/browse/_relation_member.rhtml b/app/views/browse/_relation_member.rhtml new file mode 100644 index 000000000..516d9e37f --- /dev/null +++ b/app/views/browse/_relation_member.rhtml @@ -0,0 +1,10 @@ + + + <%= h(relation_member.member_type.capitalize) %> + <%= link_to relation_member.member_id.to_s, :action => relation_member.member_type, :id => relation_member.member_id %> + <% unless relation_member.member_role.blank? %> + as + <%= h(relation_member.member_role) %> + <% end %> + + diff --git a/app/views/browse/_relation_members.rhtml b/app/views/browse/_relation_members.rhtml deleted file mode 100644 index ebe20ba7e..000000000 --- a/app/views/browse/_relation_members.rhtml +++ /dev/null @@ -1,11 +0,0 @@ -<% if members.length != 0 %> -

    Members

    - - - - - - - <%= render :partial => 'member', :collection => members %> -
    IDTypeRole
    -<% end %> diff --git a/app/views/browse/_tag.rhtml b/app/views/browse/_tag.rhtml index 009d39e79..8a57387bf 100644 --- a/app/views/browse/_tag.rhtml +++ b/app/views/browse/_tag.rhtml @@ -1,4 +1,3 @@ - <%= h(tag[0]) %><%= h(tag[1]) %> + <%= h(tag[0]) %> = <%= h(tag[1]) %> - diff --git a/app/views/browse/_tag_table.rhtml b/app/views/browse/_tag_table.rhtml deleted file mode 100644 index dca1c0ab1..000000000 --- a/app/views/browse/_tag_table.rhtml +++ /dev/null @@ -1,10 +0,0 @@ -<% if tags.length != 0 %> -

    Tags

    - - - - - - <%= render :partial => 'tag', :collection => tags %> -
    KeyValue
    -<% end %> diff --git a/app/views/browse/_way_details.rhtml b/app/views/browse/_way_details.rhtml new file mode 100644 index 000000000..99b8e1d16 --- /dev/null +++ b/app/views/browse/_way_details.rhtml @@ -0,0 +1,27 @@ + + + <%= render :partial => "common_details", :object => way_details %> + + + + + + + <% unless way_details.containing_relation_members.empty? %> + + + + + <% end %> + +
    Nodes: + + <% way_details.way_nodes.each do |wn| %> + + <% end %> +
    <%= link_to "Node " + wn.node_id.to_s, :action => "node", :id => wn.node_id.to_s %>
    +
    Part of: + + <%= render :partial => "containing_relation", :collection => way_details.containing_relation_members %> +
    +
    diff --git a/app/views/browse/node.rhtml b/app/views/browse/node.rhtml index c050cf002..075c1917f 100644 --- a/app/views/browse/node.rhtml +++ b/app/views/browse/node.rhtml @@ -1,15 +1,26 @@ -<%= render :partial => 'navigation', :locals => { :type => "node" } %> -

    Node Browser: <%= h(@name) %>

    -<%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %> -<%= render :partial => 'tag_table', :locals => { :tags => @node.tags_as_hash } %> -<% if @node.ways.length != 0 %> -
    -
    -

    Part of:

    -
      - <% @node.ways.each do |way| %> -
    • <%= link_to "Way " + way.id.to_s, :action => "way", :id => way.id.to_s %>
    • - <% end %> -
    -
    -<% end %> + + + + + + + + + +
    +

    Node: <%= h(@name) %>

    +
    + <%= render :partial => "navigation" %> +
    + <%= render :partial => "node_details", :object => @node %> +
    + <%= link_to "Download XML", :controller => "node", :action => "read" %> + or + <%= link_to "view history", :action => "node_history" %> +
    + <% if @node.visible %> + <%= render :partial => "map", :locals => { :type => "node", :id => @node.id } %> + <% else %> + Deleted + <% end %> +
    diff --git a/app/views/browse/node_history.rhtml b/app/views/browse/node_history.rhtml index ad46202b7..ffa42bef6 100644 --- a/app/views/browse/node_history.rhtml +++ b/app/views/browse/node_history.rhtml @@ -1,8 +1,22 @@

    Node History: <%= h(@name) %>

    -<%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %> -

    Hisorical Versions

    -<% @node.old_nodes.reverse.each do |node| %> -<%= render :partial => 'common_editedby', :locals => { :obj => node } %> -<%= render :partial => 'tag_table', :locals => { :tags => node.tags_as_hash } %> -
    -<% end %> + + + + + + +
    + <% @node.old_nodes.reverse.each do |node| %> + <%= render :partial => "node_details", :object => node %> +
    + <% end %> + <%= link_to "Download XML", :controller => "old_node", :action => "history" %> + or + <%= link_to "view details", :action => "node" %> +
    + <% if @node.visible %> + <%= render :partial => "map", :locals => { :type => "node", :id => @node.id } %> + <% else %> + Deleted + <% end %> +
    diff --git a/app/views/browse/relation.rhtml b/app/views/browse/relation.rhtml index 574a4ea2b..8d4f94bf5 100644 --- a/app/views/browse/relation.rhtml +++ b/app/views/browse/relation.rhtml @@ -1,5 +1,26 @@ -<%= render :partial => 'navigation', :locals => { :type => "relation" } %> -

    Relation Browser: <%= h(@name) %>

    -<%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %> -<%= render :partial => 'tag_table', :locals => { :tags => @relation.tags } %> -<%= render :partial => 'relation_members', :locals => { :members => @relation.relation_members } %> + + + + + + + + + +
    +

    Relation: <%= h(@name) %>

    +
    + <%= render :partial => "navigation" %> +
    + <%= render :partial => "relation_details", :object => @relation %> +
    + <%= link_to "Download XML", :controller => "relation", :action => "read" %> + or + <%= link_to "view history", :action => "relation_history" %> +
    + <% if @relation.visible %> + <%= render :partial => "map", :locals => { :type => "relation", :id => @relation.id } %> + <% else %> + Deleted + <% end %> +
    diff --git a/app/views/browse/relation_history.rhtml b/app/views/browse/relation_history.rhtml index f3a75cd07..f4b3e1faa 100644 --- a/app/views/browse/relation_history.rhtml +++ b/app/views/browse/relation_history.rhtml @@ -1,9 +1,22 @@

    Relation History: <%= h(@name) %>

    -<%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %> -

    Hisorical Versions

    -<% @relation.old_relations.reverse.each do |relation| %> -<%= render :partial => 'common_editedby', :locals => { :obj => relation } %> -<%= render :partial => 'tag_table', :locals => { :tags => relation.tags } %> -<%= render :partial => 'relation_members', :locals => { :members => relation.old_members } %> -
    -<% end %> + + + + + + +
    + <% @relation.old_relations.reverse.each do |relation| %> + <%= render :partial => "relation_details", :object => relation %> +
    + <% end %> + <%= link_to "Download XML", :controller => "old_relation", :action => "history" %> + or + <%= link_to "view details", :action => "relation" %> +
    + <% if @relation.visible %> + <%= render :partial => "map", :locals => { :type => "relation", :id => @relation.id } %> + <% else %> + Deleted + <% end %> +
    diff --git a/app/views/browse/way.rhtml b/app/views/browse/way.rhtml index e1c306071..75b333443 100644 --- a/app/views/browse/way.rhtml +++ b/app/views/browse/way.rhtml @@ -1,16 +1,26 @@ -<%= render :partial => 'navigation', :locals => { :type => "way" } %> -

    Way Browser: <%= h(@name) %>

    -<%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %> -<%= render :partial => 'tag_table', :locals => { :tags => @way.tags } %> - -<% if @way.nodes.length != 0 %> -
    -
    -

    Parts:

    -
      - <% @way.nodes.each do |node| %> -
    • <%= link_to "Node " + node.id.to_s, :action => "node", :id => node.id.to_s %>
    • - <% end %> -
    -
    -<% end %> + + + + + + + + + +
    +

    Way: <%= h(@name) %>

    +
    + <%= render :partial => "navigation" %> +
    + <%= render :partial => "way_details", :object => @way %> +
    + <%= link_to "Download XML", :controller => "way", :action => "read" %> + or + <%= link_to "view history", :action => "way_history" %> +
    + <% if @way.visible %> + <%= render :partial => "map", :locals => { :type => "way", :id => @way.id } %> + <% else %> + Deleted + <% end %> +
    diff --git a/app/views/browse/way_history.rhtml b/app/views/browse/way_history.rhtml index 32aadb3ff..1eaf52ed5 100644 --- a/app/views/browse/way_history.rhtml +++ b/app/views/browse/way_history.rhtml @@ -1,8 +1,22 @@

    Way History: <%= h(@name) %>

    -<%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %> -

    Hisorical Versions

    -<% @way.old_ways.reverse.each do |way| %> -<%= render :partial => 'common_editedby', :locals => { :obj => way } %> -<%= render :partial => 'tag_table', :locals => { :tags => way.tags } %> -
    -<% end %> + + + + + + +
    + <% @way.old_ways.reverse.each do |way| %> + <%= render :partial => "way_details", :object => way %> +
    + <% end %> + <%= link_to "Download XML", :controller => "old_way", :action => "history" %> + or + <%= link_to "view details", :action => "way" %> +
    + <% if @way.visible %> + <%= render :partial => "map", :locals => { :type => "way", :id => @way.id } %> + <% else %> + Deleted + <% end %> +
    diff --git a/config/routes.rb b/config/routes.rb index 52636b385..854e7f003 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -58,8 +58,8 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints' # Data browsing - map.connect '/browse/start', :controller => 'browse', :action => 'start' map.connect '/browse', :controller => 'browse', :action => 'index' + map.connect '/browse/start', :controller => 'browse', :action => 'start' map.connect '/browse/way/:id', :controller => 'browse', :action => 'way', :id => /\d+/ map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/ map.connect '/browse/node/:id', :controller => 'browse', :action => 'node', :id => /\d+/ From def60c193514a0d5067d5c0b007421e1a472b73b Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 24 Jun 2008 23:42:39 +0000 Subject: [PATCH 094/100] Railsify relation selection (aka ripping out the f***in SQL). --- app/controllers/amf_controller.rb | 4 +++- app/controllers/api_controller.rb | 12 +++--------- app/models/node.rb | 2 +- app/models/relation.rb | 25 +------------------------ app/models/way.rb | 2 +- lib/object_finder.rb | 5 +++++ 6 files changed, 14 insertions(+), 36 deletions(-) create mode 100644 lib/object_finder.rb diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 359b45326..11ddc3f7c 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -123,7 +123,9 @@ class AmfController < ApplicationController points = nodes_not_used_in_area.collect { |n| [n.id, n.lon_potlatch(baselong,masterscale), n.lat_potlatch(basey,masterscale), n.tags_as_hash] } # find the relations used by those nodes and ways - relation_ids = (Relation.find_for_nodes_and_ways(nodes_in_area.collect {|n| n.id}, way_ids)).collect {|n| n.id}.uniq + relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten + + way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten + relation_ids = relations.collect { |relation| relation.id }.uniq [way_ids,points,relation_ids] end diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 26cb93a48..9cf8977d3 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -124,8 +124,6 @@ class ApiController < ApplicationController return end - relations = Array.new - doc = OSM::API.new.get_xml_doc # get ways @@ -170,19 +168,15 @@ class ApiController < ApplicationController end end - relations = Relation.find_for_nodes_and_ways(visible_nodes.keys, way_ids) + relations = visible_nodes.values.collect { |node| node.containing_relations.visible }.flatten + + way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten # we do not normally return the "other" partners referenced by an relation, # e.g. if we return a way A that is referenced by relation X, and there's # another way B also referenced, that is not returned. But we do make # an exception for cases where an relation references another *relation*; # in that case we return that as well (but we don't go recursive here) - relation_ids = relations.collect { |relation| relation.id } - if relation_ids.length > 0 - relations += Relation.find_by_sql("select e.* from current_relations e,current_relation_members em where " + - "e.visible=1 and " + - "em.id = e.id and em.member_type='relation' and em.member_id in (#{relation_ids.join(',')})") - end + relations += relations.collect { |relation| relation.containing_relations.visible }.flatten # this "uniq" may be slightly inefficient; it may be better to first collect and output # all node-related relations, then find the *not yet covered* way-related ones etc. diff --git a/app/models/node.rb b/app/models/node.rb index be444bf3e..abfa44d67 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -18,7 +18,7 @@ class Node < ActiveRecord::Base has_many :ways, :through => :way_nodes has_many :containing_relation_members, :class_name => "RelationMember", :as => :member - has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder # Sanity check the latitude and longitude and add an error if it's broken def validate_position diff --git a/app/models/relation.rb b/app/models/relation.rb index 71ddc4a55..bdba25f8f 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -11,7 +11,7 @@ class Relation < ActiveRecord::Base has_many :relation_tags, :foreign_key => 'id' has_many :containing_relation_members, :class_name => "RelationMember", :as => :member - has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder def self.from_xml(xml, create=false) begin @@ -105,29 +105,6 @@ class Relation < ActiveRecord::Base return el1 end - - # collect relationships. currently done in one big block at the end; - # may need to move this upwards if people want automatic completion of - # relationships, i.e. deliver referenced objects like we do with ways... - # FIXME: rip out the fucking SQL - def self.find_for_nodes_and_ways(node_ids, way_ids) - relations = [] - - if node_ids.length > 0 - relations += Relation.find_by_sql("select e.* from current_relations e,current_relation_members em where " + - "e.visible=1 and " + - "em.id = e.id and em.member_type='node' and em.member_id in (#{node_ids.join(',')})") - end - if way_ids.length > 0 - relations += Relation.find_by_sql("select e.* from current_relations e,current_relation_members em where " + - "e.visible=1 and " + - "em.id = e.id and em.member_type='way' and em.member_id in (#{way_ids.join(',')})") - end - - relations # if you don't do this then it returns nil and not [] - end - - # FIXME is this really needed? def members unless @members diff --git a/app/models/way.rb b/app/models/way.rb index 8ae6b4084..a77f35fe9 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -13,7 +13,7 @@ class Way < ActiveRecord::Base has_many :way_tags, :foreign_key => 'id' has_many :containing_relation_members, :class_name => "RelationMember", :as => :member - has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation + has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder def self.from_xml(xml, create=false) begin diff --git a/lib/object_finder.rb b/lib/object_finder.rb new file mode 100644 index 000000000..26608a7f9 --- /dev/null +++ b/lib/object_finder.rb @@ -0,0 +1,5 @@ +module ObjectFinder + def visible + find :all, :conditions => "#{proxy_reflection.table_name}.visible = 1" + end +end From 2677593b3360f5034b2956ff759e9626d295de42 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 25 Jun 2008 14:41:37 +0000 Subject: [PATCH 095/100] Try and make message and comment notifications more idiot proof. --- .../notifier/diary_comment_notification.rhtml | 18 ++++++++++++++++++ app/views/notifier/message_notification.rhtml | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/app/views/notifier/diary_comment_notification.rhtml b/app/views/notifier/diary_comment_notification.rhtml index 05b1f0886..1e821412c 100644 --- a/app/views/notifier/diary_comment_notification.rhtml +++ b/app/views/notifier/diary_comment_notification.rhtml @@ -1,6 +1,15 @@ *************************************************************************** Please do not reply to this email. Use the OpenStreetMap web site to reply. *************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** Hi <%= @to_user %>, @@ -18,3 +27,12 @@ or reply at <%= @replyurl %> *************************************************************************** Please do not reply to this email. Use the OpenStreetMap web site to reply. *************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** diff --git a/app/views/notifier/message_notification.rhtml b/app/views/notifier/message_notification.rhtml index 82efbb1a9..d52c0c71a 100644 --- a/app/views/notifier/message_notification.rhtml +++ b/app/views/notifier/message_notification.rhtml @@ -1,6 +1,15 @@ *************************************************************************** Please do not reply to this email. Use the OpenStreetMap web site to reply. *************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** Hi <%= @to_user %>, @@ -16,3 +25,12 @@ and you can reply at <%= @replyurl %> *************************************************************************** Please do not reply to this email. Use the OpenStreetMap web site to reply. *************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** +*************************************************************************** +Please do not reply to this email. Use the OpenStreetMap web site to reply. +*************************************************************************** From 65ff860da9ccb6a5a9ef4beb5a82316791c58687 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 25 Jun 2008 15:18:07 +0000 Subject: [PATCH 096/100] Handle international idiots in a reasonable selection of languages. --- .../notifier/diary_comment_notification.rhtml | 46 +++++++++++-------- app/views/notifier/message_notification.rhtml | 46 +++++++++++-------- 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/app/views/notifier/diary_comment_notification.rhtml b/app/views/notifier/diary_comment_notification.rhtml index 1e821412c..f2694e7df 100644 --- a/app/views/notifier/diary_comment_notification.rhtml +++ b/app/views/notifier/diary_comment_notification.rhtml @@ -1,14 +1,17 @@ *************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. +* * +* Please do not reply to this email. * +* Use the OpenStreetMap web site to reply. * +* * +* Bitte antworten Sie nicht auf diese E-Mail. * +* Verwenden Sie die OpenStreetMap Website zu antworten. * +* * +* Por favor, no responda a este mensaje. * +* Utilice el OpenStreetMap sitio web para responder. * +* * +* S’il vous plaît de ne pas répondre à ce message. * +* Utilisez le OpenStreetMap site Web pour y répondre. * +* * *************************************************************************** Hi <%= @to_user %>, @@ -25,14 +28,17 @@ and you can comment at <%= @commenturl %> or reply at <%= @replyurl %> *************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. +* * +* Please do not reply to this email. * +* Use the OpenStreetMap web site to reply. * +* * +* Bitte antworten Sie nicht auf diese E-Mail. * +* Verwenden Sie die OpenStreetMap Website zu antworten. * +* * +* Por favor, no responda a este mensaje. * +* Utilice el OpenStreetMap sitio web para responder. * +* * +* S’il vous plaît de ne pas répondre à ce message. * +* Utilisez le OpenStreetMap site Web pour y répondre. * +* * *************************************************************************** diff --git a/app/views/notifier/message_notification.rhtml b/app/views/notifier/message_notification.rhtml index d52c0c71a..ebf2ea2b0 100644 --- a/app/views/notifier/message_notification.rhtml +++ b/app/views/notifier/message_notification.rhtml @@ -1,14 +1,17 @@ *************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. +* * +* Please do not reply to this email. * +* Use the OpenStreetMap web site to reply. * +* * +* Bitte antworten Sie nicht auf diese E-Mail. * +* Verwenden Sie die OpenStreetMap Website zu antworten. * +* * +* Por favor, no responda a este mensaje. * +* Utilice el OpenStreetMap sitio web para responder. * +* * +* S’il vous plaît de ne pas répondre à ce message. * +* Utilisez le OpenStreetMap site Web pour y répondre. * +* * *************************************************************************** Hi <%= @to_user %>, @@ -23,14 +26,17 @@ You can also read the message at <%= @readurl %> and you can reply at <%= @replyurl %> *************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. -*************************************************************************** -*************************************************************************** -Please do not reply to this email. Use the OpenStreetMap web site to reply. +* * +* Please do not reply to this email. * +* Use the OpenStreetMap web site to reply. * +* * +* Bitte antworten Sie nicht auf diese E-Mail. * +* Verwenden Sie die OpenStreetMap Website zu antworten. * +* * +* Por favor, no responda a este mensaje. * +* Utilice el OpenStreetMap sitio web para responder. * +* * +* S’il vous plaît de ne pas répondre à ce message. * +* Utilisez le OpenStreetMap site Web pour y répondre. * +* * *************************************************************************** From 563172b2c877598f18c056a8eb6c0104a8df450b Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 25 Jun 2008 16:46:25 +0000 Subject: [PATCH 097/100] Minor correction to German translation. --- app/views/notifier/diary_comment_notification.rhtml | 4 ++-- app/views/notifier/message_notification.rhtml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/notifier/diary_comment_notification.rhtml b/app/views/notifier/diary_comment_notification.rhtml index f2694e7df..9d000e9d3 100644 --- a/app/views/notifier/diary_comment_notification.rhtml +++ b/app/views/notifier/diary_comment_notification.rhtml @@ -4,7 +4,7 @@ * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zu antworten. * +* Verwenden Sie die OpenStreetMap Website zum antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * @@ -33,7 +33,7 @@ or reply at <%= @replyurl %> * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zu antworten. * +* Verwenden Sie die OpenStreetMap Website zum antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * diff --git a/app/views/notifier/message_notification.rhtml b/app/views/notifier/message_notification.rhtml index ebf2ea2b0..55e464e15 100644 --- a/app/views/notifier/message_notification.rhtml +++ b/app/views/notifier/message_notification.rhtml @@ -4,7 +4,7 @@ * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zu antworten. * +* Verwenden Sie die OpenStreetMap Website zum antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * @@ -31,7 +31,7 @@ and you can reply at <%= @replyurl %> * Use the OpenStreetMap web site to reply. * * * * Bitte antworten Sie nicht auf diese E-Mail. * -* Verwenden Sie die OpenStreetMap Website zu antworten. * +* Verwenden Sie die OpenStreetMap Website zum antworten. * * * * Por favor, no responda a este mensaje. * * Utilice el OpenStreetMap sitio web para responder. * From abb66fa808f09469306e6b03b21539eb57b74d38 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 26 Jun 2008 17:36:21 +0000 Subject: [PATCH 098/100] Disable the data browswer when the database is not available. --- app/controllers/application.rb | 4 ++-- app/controllers/browse_controller.rb | 4 +++- app/views/site/index.rhtml | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/controllers/application.rb b/app/controllers/application.rb index 7570fd82a..918e4b617 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -43,8 +43,8 @@ class ApplicationController < ActionController::Base end end - def check_database_availability - if OSM_STATUS == :database_offline + def check_database_availability(need_api = false) + if OSM_STATUS == :database_offline or (need_api and OSM_STATUS == :api_offline) redirect_to :controller => 'site', :action => 'offline' end end diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index fd482119d..f3a04519c 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -1,7 +1,9 @@ class BrowseController < ApplicationController - before_filter :authorize_web layout 'site' + before_filter :authorize_web + before_filter { |c| c.check_database_availability(true) } + def start end diff --git a/app/views/site/index.rhtml b/app/views/site/index.rhtml index 482ed85b8..2cca4d529 100644 --- a/app/views/site/index.rhtml +++ b/app/views/site/index.rhtml @@ -94,9 +94,11 @@ by the OpenStreetMap project and its contributors. function mapInit(){ map = createMap("map"); + <% unless OSM_STATUS == :api_offline or OSM_STATUS == :database_offline %> map.dataLayer = new OpenLayers.Layer("Data", { "visibility": false }); map.dataLayer.events.register("visibilitychanged", map.dataLayer, toggleData); map.addLayer(map.dataLayer); + <% end %> <% if bbox %> var bbox = new OpenLayers.Bounds(<%= minlon %>, <%= minlat %>, <%= maxlon %>, <%= maxlat %>); From 9a7db5d63b12f90b944f4ad151e5299d1745ecfb Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 26 Jun 2008 23:01:55 +0000 Subject: [PATCH 099/100] Refactor to remove some code duplication. --- app/views/browse/_map.rhtml | 20 +++++++++++++------- app/views/browse/node.rhtml | 8 +------- app/views/browse/node_history.rhtml | 8 +------- app/views/browse/relation.rhtml | 8 +------- app/views/browse/relation_history.rhtml | 8 +------- app/views/browse/way.rhtml | 8 +------- app/views/browse/way_history.rhtml | 8 +------- 7 files changed, 19 insertions(+), 49 deletions(-) diff --git a/app/views/browse/_map.rhtml b/app/views/browse/_map.rhtml index 9ca0a163a..ad2d2d307 100644 --- a/app/views/browse/_map.rhtml +++ b/app/views/browse/_map.rhtml @@ -1,15 +1,21 @@ <%= javascript_include_tag '/openlayers/OpenLayers.js' %> <%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> <%= javascript_include_tag 'map.js' %> -
    -
    -Loading... - + + <% if map.visible %> +
    +
    + Loading... + + <% else %> + Deleted + <% end %> +