]> git.openstreetmap.org Git - rails.git/blobdiff - app/assets/javascripts/leaflet.share.js
Further usage of URLSearchParams
[rails.git] / app / assets / javascripts / leaflet.share.js
index 0b868d2cac6cf31bdd8688c854a0368559031295..e89608afda7dce94c127d208942be2ee9083c91e 100644 (file)
@@ -8,6 +8,7 @@ L.OSM.share = function (options) {
 
   control.onAddPane = function (map, button, $ui) {
     // Link / Embed
+    $("#content").addClass("overlay-right-sidebar");
 
     var $linkSection = $("<div>")
       .attr("class", "share-link p-3 border-bottom border-secondary-subtle")
@@ -129,7 +130,12 @@ L.OSM.share = function (options) {
     $("<div>")
       .attr("id", "export-warning")
       .attr("class", "text-body-secondary")
-      .text(I18n.t("javascripts.share.only_standard_layer"))
+      .text(I18n.t("javascripts.share.only_layers_exported_as_image"))
+      .append(
+        $("<ul>").append(
+          map.baseLayers
+            .filter(layer => layer.options.canDownloadImage)
+            .map(layer => $("<li>").text(layer.options.name))))
       .appendTo($imageSection);
 
     $form = $("<form>")
@@ -159,6 +165,7 @@ L.OSM.share = function (options) {
     $("<div>")
       .appendTo($form)
       .attr("class", "row mb-3")
+      .attr("id", "mapnik_scale_row")
       .append($("<label>")
         .attr("for", "mapnik_scale")
         .attr("class", "col-auto col-form-label")
@@ -194,19 +201,31 @@ L.OSM.share = function (options) {
             .attr("class", "form-check-input")
             .bind("change", toggleFilter))));
 
-    ["minlon", "minlat", "maxlon", "maxlat"].forEach(function (name) {
+    const mapnikNames = ["minlon", "minlat", "maxlon", "maxlat", "lat", "lon"];
+
+    for (const name of mapnikNames) {
       $("<input>")
         .attr("id", "mapnik_" + name)
         .attr("name", name)
         .attr("type", "hidden")
         .appendTo($form);
-    });
+    }
 
-    $("<input>")
-      .attr("name", "format")
-      .attr("value", "mapnik")
-      .attr("type", "hidden")
-      .appendTo($form);
+    const hiddenExportDefaults = {
+      format: "mapnik",
+      zoom: map.getZoom(),
+      width: 0,
+      height: 0
+    };
+
+    for (const name in hiddenExportDefaults) {
+      $("<input>")
+        .attr("id", "map_" + name)
+        .attr("name", name)
+        .attr("value", hiddenExportDefaults[name])
+        .attr("type", "hidden")
+        .appendTo($form);
+    }
 
     var csrf_param = $("meta[name=csrf-param]").attr("content"),
         csrf_token = $("meta[name=csrf-token]").attr("content");
@@ -218,6 +237,7 @@ L.OSM.share = function (options) {
       .appendTo($form);
 
     var args = {
+      layer: "<span id=\"mapnik_image_layer\"></span>",
       width: "<span id=\"mapnik_image_width\"></span>",
       height: "<span id=\"mapnik_image_height\"></span>"
     };
@@ -239,7 +259,7 @@ L.OSM.share = function (options) {
 
     marker.on("dragend", movedMarker);
     map.on("move", movedMap);
-    map.on("moveend layeradd layerremove", update);
+    map.on("moveend baselayerchange overlayadd overlayremove", update);
 
     $ui
       .on("show", shown)
@@ -312,7 +332,8 @@ L.OSM.share = function (options) {
     }
 
     function update() {
-      var canEmbed = map.getMapBaseLayerId() !== "tracestracktopo";
+      const layer = map.getMapBaseLayer();
+      var canEmbed = Boolean(layer && layer.options.canEmbed);
       var bounds = map.getBounds();
 
       $("#link_marker")
@@ -328,14 +349,14 @@ L.OSM.share = function (options) {
       $("#short_link").attr("href", map.getShortUrl(marker));
       $("#long_link").attr("href", map.getUrl(marker));
 
-      var params = {
+      const params = new URLSearchParams({
         bbox: bounds.toBBoxString(),
         layer: map.getMapBaseLayerId()
-      };
+      });
 
       if (map.hasLayer(marker)) {
         var latLng = marker.getLatLng().wrap();
-        params.marker = latLng.lat + "," + latLng.lng;
+        params.set("marker", latLng.lat + "," + latLng.lng);
       }
 
       $("#embed_link")
@@ -348,7 +369,7 @@ L.OSM.share = function (options) {
 
       $("#embed_html").val(
         "<iframe width=\"425\" height=\"350\" src=\"" +
-          escapeHTML(OSM.SERVER_PROTOCOL + "://" + OSM.SERVER_URL + "/export/embed.html?" + $.param(params)) +
+          escapeHTML(OSM.SERVER_PROTOCOL + "://" + OSM.SERVER_URL + "/export/embed.html?" + params) +
           "\" style=\"border: 1px solid black\"></iframe><br/>" +
           "<small><a href=\"" + escapeHTML(map.getUrl(marker)) + "\">" +
           escapeHTML(I18n.t("javascripts.share.view_larger_map")) + "</a></small>");
@@ -380,16 +401,25 @@ L.OSM.share = function (options) {
         $("#mapnik_scale").val(scale);
       }
 
-      $("#mapnik_image_width").text(Math.round(size.x / scale / 0.00028));
-      $("#mapnik_image_height").text(Math.round(size.y / scale / 0.00028));
+      const mapWidth = Math.round(size.x / scale / 0.00028);
+      const mapHeight = Math.round(size.y / scale / 0.00028);
+      $("#mapnik_image_width").text(mapWidth);
+      $("#mapnik_image_height").text(mapHeight);
 
-      if (map.getMapBaseLayerId() === "mapnik") {
-        $("#export-image").show();
-        $("#export-warning").hide();
-      } else {
-        $("#export-image").hide();
-        $("#export-warning").show();
-      }
+      const canDownloadImage = Boolean(layer && layer.options.canDownloadImage);
+
+      $("#mapnik_image_layer").text(canDownloadImage ? layer.options.name : "");
+      $("#map_format").val(canDownloadImage ? layer.options.layerId : "");
+
+      $("#map_zoom").val(map.getZoom());
+      $("#mapnik_lon").val(map.getCenter().lng);
+      $("#mapnik_lat").val(map.getCenter().lat);
+      $("#map_width").val(mapWidth);
+      $("#map_height").val(mapHeight);
+
+      $("#export-image").toggle(canDownloadImage);
+      $("#export-warning").toggle(!canDownloadImage);
+      $("#mapnik_scale_row").toggle(canDownloadImage && layer.options.layerId === "mapnik");
     }
 
     function select() {