From 0509fc8d12fd763e98bc0c8e3a0d2b0ee6a11f9a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Sun, 26 Aug 2012 17:01:39 -0700 Subject: [PATCH] Move param-based map configuration to client This prepares us for hash-based permalinks (#81) and removes the duplication between index.html.erb and SiteController#edit. --- app/assets/javascripts/application.js | 1 + app/assets/javascripts/params.js | 100 +++++++++++++++++++ app/controllers/site_controller.rb | 48 ++------- app/views/layouts/_head.html.erb | 8 ++ app/views/site/_potlatch.html.erb | 3 +- app/views/site/_potlatch2.html.erb | 6 +- app/views/site/index.html.erb | 137 +++++--------------------- 7 files changed, 145 insertions(+), 158 deletions(-) create mode 100644 app/assets/javascripts/params.js diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 551d48f10..e345f3074 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -7,6 +7,7 @@ //= require openlayers //= require i18n/translations //= require globals +//= require params //= require piwik //= require browse //= require export diff --git a/app/assets/javascripts/params.js b/app/assets/javascripts/params.js new file mode 100644 index 000000000..5373625dc --- /dev/null +++ b/app/assets/javascripts/params.js @@ -0,0 +1,100 @@ +OSM.mapParams = function (search) { + var params = {}, mapParams = {}, loc; + + search = (search || window.location.search).replace('?', '').split('&'); + + for (var i = 0; i < search.length; ++i) { + var pair = search[i], + j = pair.indexOf('='), + key = pair.slice(0, j), + val = pair.slice(++j); + params[key] = decodeURIComponent(val); + } + + if (params.mlon && params.mlat) { + mapParams.marker = true; + mapParams.mlon = parseFloat(params.mlon); + mapParams.mlat = parseFloat(params.mlat); + } + + if (params.layers) { + mapParams.layers = params.layers; + } + + if (params.node || params.way || params.relation) { + mapParams.object = true; + mapParams.object_zoom = true; + + if (params.node) { + mapParams.object_type = 'node'; + mapParams.object_id = parseInt(params.node); + } else if (params.way) { + mapParams.object_type = 'way'; + mapParams.object_id = parseInt(params.way); + } else if (params.relation) { + mapParams.object_type = 'relation'; + mapParams.object_id = parseInt(params.relation); + } + } + + // Decide on a lat lon to initialise the map with. Various ways of doing this + if (params.bbox) { + var bbox = params.bbox.split(","); + mapParams.bbox = true; + mapParams.minlon = parseFloat(bbox[0]); + mapParams.minlat = parseFloat(bbox[1]); + mapParams.maxlon = parseFloat(bbox[2]); + mapParams.maxlat = parseFloat(bbox[3]); + mapParams.object_zoom = false; + } else if (params.minlon && params.minlat && params.maxlon && params.maxlat) { + mapParams.bbox = true; + mapParams.minlon = parseFloat(params.minlon); + mapParams.minlat = parseFloat(params.minlat); + mapParams.maxlon = parseFloat(params.maxlon); + mapParams.maxlat = parseFloat(params.maxlat); + mapParams.object_zoom = false; + } else if (params.lon && params.lat) { + mapParams.lon = parseFloat(params.lon); + mapParams.lat = parseFloat(params.lat); + mapParams.zoom = parseInt(params.zoom || 5); + mapParams.object_zoom = false; + } else if (params.mlon && params.mlat) { + mapParams.lon = parseFloat(params.mlon); + mapParams.lat = parseFloat(params.mlat); + mapParams.zoom = parseInt(params.zoom || 12); + mapParams.object_zoom = false; + } else if (loc = $.cookie('_osm_location')) { + loc = loc.split("|"); + mapParams.lon = parseFloat(loc[0]); + mapParams.lat = parseFloat(loc[1]); + mapParams.zoom = parseInt(loc[2]); + mapParams.layers = loc[3]; + } else if (OSM.home) { + mapParams.lon = OSM.home.lon; + mapParams.lat = OSM.home.lat; + mapParams.zoom = 10; + } else if (OSM.location) { + mapParams.bbox = true; + mapParams.minlon = OSM.location.minlon; + mapParams.minlat = OSM.location.minlat; + mapParams.maxlon = OSM.location.maxlon; + mapParams.maxlat = OSM.location.maxlat; + } else { + mapParams.lon = -0.1; + mapParams.lat = 51.5; + mapParams.zoom = parseInt(params.zoom || 5); + } + + if (mapParams.bbox) { + mapParams.box = params.box == "yes"; + mapParams.lon = (mapParams.minlon + mapParams.maxlon) / 2; + mapParams.lat = (mapParams.minlat + mapParams.maxlat) / 2; + } + + var scale = parseFloat(params.scale); + if (scale > 0) { + mapParams.zoom = Math.log(360.0 / (scale * 512.0)) / Math.log(2.0); + } + + return mapParams; +}; diff --git a/app/controllers/site_controller.rb b/app/controllers/site_controller.rb index 356af9879..015da9e22 100644 --- a/app/controllers/site_controller.rb +++ b/app/controllers/site_controller.rb @@ -6,6 +6,12 @@ class SiteController < ApplicationController before_filter :set_locale before_filter :require_user, :only => [:edit] + def index + unless STATUS == :database_readonly or STATUS == :database_offline + session[:location] ||= OSM::IPLocation(request.env['REMOTE_ADDR']) + end + end + def permalink lon, lat, zoom = ShortLink::decode(params[:code]) new_params = params.clone @@ -33,48 +39,6 @@ class SiteController < ApplicationController if editor == "remote" render :action => :index - else - # Decide on a lat lon to initialise potlatch with. Various ways of doing this - if params['lon'] and params['lat'] - @lon = params['lon'].to_f - @lat = params['lat'].to_f - @zoom = params['zoom'].to_i - - elsif params['mlon'] and params['mlat'] - @lon = params['mlon'].to_f - @lat = params['mlat'].to_f - @zoom = params['zoom'].to_i - - elsif params['bbox'] - bbox = BoundingBox.from_bbox_params(params) - - @lon = bbox.centre_lon - @lat = bbox.centre_lat - @zoom = 16 - elsif params['minlon'] and params['minlat'] and params['maxlon'] and params['maxlat'] - bbox = BoundingBox.from_lon_lat_params(params) - - @lon = bbox.centre_lon - @lat = bbox.centre_lat - @zoom = 16 - - elsif params['gpx'] - @lon = Trace.find(params['gpx']).longitude - @lat = Trace.find(params['gpx']).latitude - - 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 - - else - #catch all. Do nothing. lat=nil, lon=nil - #Currently this results in potlatch starting up at 0,0 (Atlantic ocean). - end - - @zoom = '17' if @zoom.nil? end end diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index 993544bae..91a862f0a 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -21,6 +21,14 @@ I18n.defaultLocale = "<%= I18n.default_locale %>"; I18n.locale = "<%= I18n.locale %>"; I18n.fallbacks = true; + + <% if @user and !@user.home_lon.nil? and !@user.home_lat.nil? %> + OSM.home = <%= { :lat => @user.home_lat, :lon => @user.home_lon }.to_json.html_safe %>; + <% end %> + + <% if session[:location] %> + OSM.location = <%= session[:location].to_json.html_safe %>; + <% end %> <%= t 'layouts.project_name.title' %><%= ' | '+ @title if @title %> diff --git a/app/views/site/_potlatch.html.erb b/app/views/site/_potlatch.html.erb index 2cdccc4b0..8180cee02 100644 --- a/app/views/site/_potlatch.html.erb +++ b/app/views/site/_potlatch.html.erb @@ -42,7 +42,8 @@ // 700,600 for fixed size, 100%,100% for resizable } - doSWF(<%= @lat || 'null' %>,<%= @lon || 'null' %>,<%= @zoom %>); + var params = OSM.mapParams(); + doSWF(params.lat, params.lon, params.zoom || 17); $(document).ready(function () { $("body").on("click", "a.set_position", function () { diff --git a/app/views/site/_potlatch2.html.erb b/app/views/site/_potlatch2.html.erb index 4559282ca..31e15f09d 100644 --- a/app/views/site/_potlatch2.html.erb +++ b/app/views/site/_potlatch2.html.erb @@ -69,8 +69,12 @@ <% elsif params[:way] -%> <% bbox = Way.find(params[:way]).bbox.to_unscaled -%> doSWF(<%= bbox.centre_lat %>,<%= bbox.centre_lon %>,16); + <% elsif params[:gpx] -%> + <% trace = Trace.find(params[:gpx]) -%> + doSWF(<%= trace.latitude %>,<%= trace.longitude %>,16); <% else -%> - doSWF(<%= @lat || 'null' %>,<%= @lon || 'null' %>,<%= @zoom %>); + var params = OSM.mapParams(); + doSWF(params.lat, params.lon, params.zoom || 17); <% end -%> $(document).ready(function () { diff --git a/app/views/site/index.html.erb b/app/views/site/index.html.erb index 9d5024326..8f8d8737b 100644 --- a/app/views/site/index.html.erb +++ b/app/views/site/index.html.erb @@ -43,129 +43,45 @@ -<% -if params[:mlon] and params[:mlat] - marker = true - mlon = params[:mlon].to_f - mlat = params[:mlat].to_f -end - -if params[:node] or params[:way] or params[:relation] - object = true - object_zoom = true - - if params[:node] - object_type = 'node' - object_id = params[:node].to_i - elsif params[:way] - object_type = 'way' - object_id = params[:way].to_i - elsif params[:relation] - object_type = 'relation' - object_id = params[:relation].to_i - end -end - -# Decide on a lat lon to initialise the map with. Various ways of doing this -if params[:bbox] - bbox = true - minlon, minlat, maxlon, maxlat = params[:bbox].split(",").collect { |c| c.to_f } - layers = params[:layers] - box = true if params[:box] == "yes" - object_zoom = false -elsif params[:minlon] and params[:minlat] and params[:maxlon] and params[:maxlat] - bbox = true - minlon = params[:minlon].to_f - minlat = params[:minlat].to_f - maxlon = params[:maxlon].to_f - maxlat = params[:maxlat].to_f - layers = params[:layers] - box = true if params[:box]=="yes" - object_zoom = false -elsif params[:lon] and params[:lat] - lon = params[:lon].to_f - lat = params[:lat].to_f - zoom = params.fetch(:zoom, 5).to_i - layers = params[:layers] - object_zoom = false -elsif params[:mlon] and params[:mlat] - lon = params[:mlon].to_f - lat = params[:mlat].to_f - zoom = params.fetch(:zoom, 12).to_i - layers = params[:layers] - object_zoom = false -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 - zoom = 10 -else - unless STATUS == :database_readonly or STATUS == :database_offline - session[:location] = OSM::IPLocation(request.env['REMOTE_ADDR']) unless session[:location] - end - - if session[:location] - bbox = true - minlon = session[:location][:minlon] - minlat = session[:location][:minlat] - maxlon = session[:location][:maxlon] - maxlat = session[:location][:maxlat] - else - lon = -0.1 - lat = 51.5 - zoom = params.fetch(:zoom, 5).to_i - end - - layers = params[:layers] -end -%> -