From 631306b3ca9ab547521458f933eca304e47937d0 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 17 Sep 2012 17:00:03 -0700 Subject: [PATCH 1/3] Use jquery.cookie --- app/assets/javascripts/application.js | 1 + app/views/site/index.html.erb | 2 +- vendor/assets/jquery/jquery.cookie.js | 72 +++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 vendor/assets/jquery/jquery.cookie.js diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 148855dd81..551d48f100 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -2,6 +2,7 @@ //= require jquery_ujs //= require jquery.autogrowtextarea //= require jquery.timers +//= require jquery.cookie //= require augment //= require openlayers //= require i18n/translations diff --git a/app/views/site/index.html.erb b/app/views/site/index.html.erb index 25f0c8585a..9d50243267 100644 --- a/app/views/site/index.html.erb +++ b/app/views/site/index.html.erb @@ -227,7 +227,7 @@ end updatelinks(lonlat.lon, lonlat.lat, zoom, layers, extents.left, extents.bottom, extents.right, extents.top, objtype, objid); expiry.setYear(expiry.getFullYear() + 10); - document.cookie = "_osm_location=" + lonlat.lon + "|" + lonlat.lat + "|" + zoom + "|" + layers + "; expires=" + expiry.toGMTString(); + $.cookie("_osm_location", [lonlat.lon, lonlat.lat, zoom, layers].join("|"), {expires: expiry}); } function remoteEditHandler(event) { diff --git a/vendor/assets/jquery/jquery.cookie.js b/vendor/assets/jquery/jquery.cookie.js new file mode 100644 index 0000000000..9e911a605c --- /dev/null +++ b/vendor/assets/jquery/jquery.cookie.js @@ -0,0 +1,72 @@ +/*jshint eqnull:true */ +/*! + * jQuery Cookie Plugin v1.2 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2011, Klaus Hartl + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://www.opensource.org/licenses/mit-license.php + * http://www.opensource.org/licenses/GPL-2.0 + */ +(function ($, document, undefined) { + + var pluses = /\+/g; + + function raw(s) { + return s; + } + + function decoded(s) { + return decodeURIComponent(s.replace(pluses, ' ')); + } + + var config = $.cookie = function (key, value, options) { + + // write + if (value !== undefined) { + options = $.extend({}, config.defaults, options); + + if (value === null) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + value = config.json ? JSON.stringify(value) : String(value); + + return (document.cookie = [ + encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // read + var decode = config.raw ? raw : decoded; + var cookies = document.cookie.split('; '); + for (var i = 0, parts; (parts = cookies[i] && cookies[i].split('=')); i++) { + if (decode(parts.shift()) === key) { + var cookie = decode(parts.join('=')); + return config.json ? JSON.parse(cookie) : cookie; + } + } + + return null; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + if ($.cookie(key) !== null) { + $.cookie(key, null, options); + return true; + } + return false; + }; + +})(jQuery, document); From a6b0a6e9a5ca1f980f2e69299e6045ae78f24d7f Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Sun, 26 Aug 2012 17:01:39 -0700 Subject: [PATCH 2/3] 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 551d48f100..e345f30743 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 0000000000..5373625dcd --- /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 356af9879e..015da9e224 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 @@ def edit 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 993544baed..91a862f0ab 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 2cdccc4b0c..8180cee02a 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 4559282ca4..31e15f09df 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 9d50243267..8f8d8737be 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 -%> -