From 438e8be102a2ac4c0e92041da2866f1339715b40 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 10 Jul 2013 11:52:33 -0700 Subject: [PATCH 01/27] Reorganize share/export UI "Image" and "Embeddable HTML" options move to share control. Only XML export remains, and is now accessed via a sidebar link rather than the tab bar. --- app/assets/javascripts/index/export.js | 229 +---------------------- app/assets/javascripts/leaflet.share.js | 235 +++++++++++++++++++++++- app/assets/stylesheets/common.css.scss | 27 ++- app/views/export/start.html.erb | 51 +---- app/views/layouts/site.html.erb | 17 +- app/views/site/_sidebar.html.erb | 1 + config/locales/en.yml | 14 +- 7 files changed, 276 insertions(+), 298 deletions(-) diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index 47830f8bee..aec35ed2b1 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -1,61 +1,32 @@ function initializeExport(map) { - $("#exportanchor").click(function (e) { - $.ajax({ url: $(this).data('url'), success: function (sidebarHtml) { - startExport(sidebarHtml); - }}); - e.preventDefault(); - }); - if (window.location.pathname == "/export") { - $("#exportanchor").click(); + startExport(); } - function startExport(sidebarHtml) { - var marker; - + function startExport() { var locationFilter = new L.LocationFilter({ enableButton: false, adjustButton: false }).addTo(map); - locationFilter.on("change", filterChanged); + locationFilter.on("change", update); - map.on("moveend", mapMoved); - map.on("baselayerchange", htmlUrlChanged); + map.on("moveend", update); $("#sidebar_title").html(I18n.t('export.start_rjs.export')); - $("#sidebar_content").html(sidebarHtml); $("#maxlat,#minlon,#maxlon,#minlat").change(boundsChanged); $("#drag_box").click(enableFilter); - $("#add_marker").click(startMarker); - - $("#format_osm,#format_mapnik,#format_html").click(formatChanged); - - $("#mapnik_scale").change(mapnikSizeChanged); - openSidebar(); - if (map.getMapBaseLayerId() == "mapnik") { - $("#format_mapnik").prop("checked", true); - } - setBounds(map.getBounds()); - formatChanged(); - - $("body").removeClass("site-index").addClass("site-export"); $("#sidebar").one("closed", function () { - $("body").removeClass("site-export").addClass("site-index"); - map.removeLayer(locationFilter); - clearMarker(); - - map.off("moveend", mapMoved); - map.off("baselayerchange", htmlUrlChanged); - locationFilter.off("change", filterChanged); + map.off("moveend", update); + locationFilter.off("change", update); }); function getBounds() { @@ -63,22 +34,6 @@ function initializeExport(map) { L.latLng($("#maxlat").val(), $("#maxlon").val())); } - function getScale() { - var bounds = map.getBounds(), - centerLat = bounds.getCenter().lat, - halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180), - meters = halfWorldMeters * (bounds.getEast() - bounds.getWest()) / 180, - pixelsPerMeter = map.getSize().x / meters, - metersPerPixel = 1 / (92 * 39.3701); - return Math.round(1 / (pixelsPerMeter * metersPerPixel)); - } - - function getMercatorBounds() { - var bounds = getBounds(); - return L.bounds(L.CRS.EPSG3857.project(bounds.getSouthWest()), - L.CRS.EPSG3857.project(bounds.getNorthEast())); - } - function boundsChanged() { var bounds = getBounds(); @@ -87,7 +42,6 @@ function initializeExport(map) { enableFilter(); validateControls(); - mapnikSizeChanged(); } function enableFilter() { @@ -99,186 +53,21 @@ function initializeExport(map) { locationFilter.enable(); } - function filterChanged() { - setBounds(locationFilter.getBounds()); + function update() { + setBounds(locationFilter.isEnabled() ? locationFilter.getBounds() : map.getBounds()); validateControls(); } - function startMarker() { - $("#add_marker").html(I18n.t('export.start_rjs.click_add_marker')); - - map.on("click", endMarker); - - return false; - } - - function endMarker(event) { - map.off("click", endMarker); - - $("#add_marker").html(I18n.t('export.start_rjs.change_marker')); - $("#marker_inputs").show(); - - var latlng = event.latlng; - - if (marker) { - map.removeLayer(marker); - } - - marker = L.marker(latlng).addTo(map); - - $("#marker_lon").val(latlng.lng.toFixed(5)); - $("#marker_lat").val(latlng.lat.toFixed(5)); - - htmlUrlChanged(); - } - - function clearMarker() { - $("#marker_lon,#marker_lat").val(""); - $("#marker_inputs").hide(); - $("#add_marker").html(I18n.t('export.start_rjs.add_marker')); - - if (marker) { - map.removeLayer(marker); - } - } - - function mapMoved() { - if (!locationFilter.isEnabled()) { - setBounds(map.getBounds()); - validateControls(); - } - } - function setBounds(bounds) { var precision = zoomPrecision(map.getZoom()); - $("#minlon").val(bounds.getWest().toFixed(precision)); $("#minlat").val(bounds.getSouth().toFixed(precision)); $("#maxlon").val(bounds.getEast().toFixed(precision)); $("#maxlat").val(bounds.getNorth().toFixed(precision)); - - mapnikSizeChanged(); - htmlUrlChanged(); } function validateControls() { - var bounds = getBounds(); - - var tooLarge = bounds.getSize() > OSM.MAX_REQUEST_AREA; - if (tooLarge) { - $("#export_osm_too_large").show(); - } else { - $("#export_osm_too_large").hide(); - } - - var max_scale = maxMapnikScale(); - var disabled = true; - - if ($("#format_osm").prop("checked")) { - disabled = tooLarge; - } else if ($("#format_mapnik").prop("checked")) { - disabled = $("#mapnik_scale").val() < max_scale; - } - - $("#export_commit").prop("disabled", disabled); - $("#mapnik_max_scale").html(roundScale(max_scale)); - } - - function htmlUrlChanged() { - var bounds = getBounds(); - var layerName = map.getMapBaseLayerId(); - - var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBoxString() + "&layer=" + layerName; - var markerUrl = ""; - - if ($("#marker_lat").val() && $("#marker_lon").val()) { - markerUrl = "&mlat=" + $("#marker_lat").val() + "&mlon=" + $("#marker_lon").val(); - url += "&marker=" + $("#marker_lat").val() + "," + $("#marker_lon").val(); - } - - var html = ''; - - // Create "larger map" link - var center = bounds.getCenter(); - - var zoom = map.getBoundsZoom(bounds); - - var layers = map.getLayersCode(); - - var text = I18n.t('export.start_rjs.view_larger_map'); - var escaped = []; - - for (var i = 0; i < text.length; ++i) { - var c = text.charCodeAt(i); - escaped.push(c < 127 ? text.charAt(i) : "&#" + c + ";"); - } - - html += '
'+escaped.join("")+''; - - $("#export_html_text").val(html); - - if ($("#format_html").prop("checked")) { - $("#export_html_text").prop("selected", true); - } - } - - function formatChanged() { - $("#export_commit").show(); - - if ($("#format_osm").prop("checked")) { - $("#export_osm").show(); - } else { - $("#export_osm").hide(); - } - - if ($("#format_mapnik").prop("checked")) { - $("#mapnik_scale").val(getScale()); - $("#export_mapnik").show(); - - mapnikSizeChanged(); - } else { - $("#export_mapnik").hide(); - } - - if ($("#format_html").prop("checked")) { - $("#export_html").show(); - $("#export_commit").hide(); - $("#export_html_text").prop("selected", true); - } else { - $("#export_html").hide(); - - clearMarker(); - } - - validateControls(); - } - - function maxMapnikScale() { - var size = getMercatorBounds().getSize(); - - return Math.floor(Math.sqrt(size.x * size.y / 0.3136)); - } - - function mapnikImageSize(scale) { - var size = getMercatorBounds().getSize(); - - return {w: Math.round(size.x / scale / 0.00028), - h: Math.round(size.y / scale / 0.00028)}; - } - - function roundScale(scale) { - var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2); - - return precision * Math.ceil(scale / precision); - } - - function mapnikSizeChanged() { - var size = mapnikImageSize($("#mapnik_scale").val()); - - $("#mapnik_image_width").html(size.w); - $("#mapnik_image_height").html(size.h); - - validateControls(); + $("#export_osm_too_large").toggle(getBounds().getSize() > OSM.MAX_REQUEST_AREA); } } } diff --git a/app/assets/javascripts/leaflet.share.js b/app/assets/javascripts/leaflet.share.js index bea877e668..7880abe140 100644 --- a/app/assets/javascripts/leaflet.share.js +++ b/app/assets/javascripts/leaflet.share.js @@ -1,5 +1,10 @@ L.OSM.share = function (options) { - var control = L.control(options); + var control = L.control(options), + marker = L.marker([0, 0], {draggable: true}), + locationFilter = new L.LocationFilter({ + enableButton: false, + adjustButton: false + }); control.onAdd = function (map) { var $container = $('
') @@ -29,6 +34,8 @@ L.OSM.share = function (options) { $('

') .text(I18n.t('javascripts.share.title'))); + // Link + var $linkSection = $('
') .attr('class', 'section share-link') .appendTo($ui); @@ -48,6 +55,135 @@ L.OSM.share = function (options) { .append($shortLink = $('') .text(I18n.t('javascripts.share.short_link')))); + // Embeddable HTML + + var $embedSection = $('
') + .attr('class', 'section share-html') + .appendTo($ui); + + $('

') + .text(I18n.t('javascripts.share.embed')) + .appendTo($embedSection); + + var $form = $('
') + .attr('class', 'standard-form') + .attr('action', '/export/finish') + .attr('method', 'post') + .appendTo($embedSection); + + $('
') + .attr('class', 'form-row') + .appendTo($form) + .append( + $('