]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/5598'
authorTom Hughes <tom@compton.nu>
Thu, 6 Feb 2025 20:27:32 +0000 (20:27 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 6 Feb 2025 20:27:32 +0000 (20:27 +0000)
1  2 
app/assets/javascripts/osm.js.erb

index 749cf5b7736767b6e52a59e70c02babac07d9022,9de737bcefb26499124b76d63aa59b74d2bc08dc..030c51a08e6901b0e1ce524f851e2c6430ce6466
@@@ -4,44 -4,45 +4,44 @@@
  //= depend_on key.yml
  
  OSM = {
 -<% if defined?(Settings.matomo) %>
 -  MATOMO:                  <%= Settings.matomo.to_json %>,
 -<% end %>
 -
 -  MAX_REQUEST_AREA:        <%= Settings.max_request_area.to_json %>,
 -  SERVER_PROTOCOL:         <%= Settings.server_protocol.to_json %>,
 -  SERVER_URL:              <%= Settings.server_url.to_json %>,
 -  API_VERSION:             <%= Settings.api_version.to_json %>,
 -  STATUS:                  <%= Settings.status.to_json %>,
 -  MAX_NOTE_REQUEST_AREA:   <%= Settings.max_note_request_area.to_json %>,
 -  OVERPASS_URL:            <%= Settings.overpass_url.to_json %>,
 -  OVERPASS_CREDENTIALS:    <%= Settings.overpass_credentials.to_json %>,
 -  NOMINATIM_URL:           <%= Settings.nominatim_url.to_json %>,
 -  GRAPHHOPPER_URL:         <%= Settings.graphhopper_url.to_json %>,
 -  FOSSGIS_OSRM_URL:        <%= Settings.fossgis_osrm_url.to_json %>,
 -  FOSSGIS_VALHALLA_URL:    <%= Settings.fossgis_valhalla_url.to_json %>,
 -  DEFAULT_LOCALE:          <%= I18n.default_locale.to_json %>,
 -
 -<% if Settings.key?(:thunderforest_key) %>
 -  THUNDERFOREST_KEY:       <%= Settings.thunderforest_key.to_json %>,
 -<% end %>
 -
 -<% if Settings.key?(:tracestrack_key) %>
 -  TRACESTRACK_KEY:         <%= Settings.tracestrack_key.to_json %>,
 -<% end %>
 -
 -  LAYER_DEFINITIONS:       <%= YAML.load_file(Rails.root.join("config/layers.yml")).to_json %>,
 -  LAYERS_WITH_MAP_KEY:     <%= YAML.load_file(Rails.root.join("config/key.yml")).keys.to_json %>,
 -
 -  MARKER_GREEN:            <%= image_path("marker-green.png").to_json %>,
 -  MARKER_RED:              <%= image_path("marker-red.png").to_json %>,
 -
 -  MARKER_ICON:             <%= image_path("leaflet/dist/images/marker-icon.png").to_json %>,
 -  MARKER_ICON_2X:          <%= image_path("leaflet/dist/images/marker-icon-2x.png").to_json %>,
 -  MARKER_SHADOW:           <%= image_path("leaflet/dist/images/marker-shadow.png").to_json %>,
 -
 -  NEW_NOTE_MARKER:         <%= image_path("new_note_marker.svg").to_json %>,
 -  OPEN_NOTE_MARKER:        <%= image_path("open_note_marker.svg").to_json %>,
 -  CLOSED_NOTE_MARKER:      <%= image_path("closed_note_marker.svg").to_json %>,
 +  ...<%=
 +    %i[
 +      matomo
 +      max_request_area
 +      server_protocol
 +      server_url
 +      api_version
 +      status
 +      max_note_request_area
 +      overpass_url
 +      overpass_credentials
 +      nominatim_url
 +      graphhopper_url
 +      fossgis_osrm_url
 +      fossgis_valhalla_url
 +      thunderforest_key
 +      tracestrack_key
 +    ]
 +      .each_with_object({}) do |key, hash|
 +        hash[key.to_s.upcase] = Settings.send(key) if Settings.respond_to?(key)
 +      end.to_json
 +  %>,
 +
 +  DEFAULT_LOCALE: <%= I18n.default_locale.to_json %>,
 +
 +  LAYER_DEFINITIONS: <%= YAML.load_file(Rails.root.join("config/layers.yml")).to_json %>,
 +  LAYERS_WITH_MAP_KEY: <%= YAML.load_file(Rails.root.join("config/key.yml")).keys.to_json %>,
 +
 +  MARKER_GREEN: <%= image_path("marker-green.png").to_json %>,
 +  MARKER_RED: <%= image_path("marker-red.png").to_json %>,
 +
 +  MARKER_ICON: <%= image_path("leaflet/dist/images/marker-icon.png").to_json %>,
 +  MARKER_ICON_2X: <%= image_path("leaflet/dist/images/marker-icon-2x.png").to_json %>,
 +  MARKER_SHADOW: <%= image_path("leaflet/dist/images/marker-shadow.png").to_json %>,
 +
 +  NEW_NOTE_MARKER: <%= image_path("new_note_marker.svg").to_json %>,
 +  OPEN_NOTE_MARKER: <%= image_path("open_note_marker.svg").to_json %>,
 +  CLOSED_NOTE_MARKER: <%= image_path("closed_note_marker.svg").to_json %>,
  
    apiUrl: function (object) {
      var apiType = object.type === "note" ? "notes" : object.type;
    },
  
    params: function (search) {
 -    var params = {};
 -
 -    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);
 -
 -      try {
 -        params[key] = decodeURIComponent(val);
 -      } catch (e) {
 -        // Ignore parse exceptions
 -      }
 -    }
 -
 -    return params;
 +    var query = search || window.location.search;
 +    return Object.fromEntries(new URLSearchParams(query));
    },
  
    mapParams: function (search) {
 -    var params = OSM.params(search), mapParams = {}, match;
 +    var params = OSM.params(search), mapParams = {};
  
      if (params.mlon && params.mlat) {
        mapParams.marker = true;
      }
  
      // Old-style object parameters; still in use for edit links e.g. /edit?way=1234
-     if (params.node) {
-       mapParams.object = { type: "node", id: parseInt(params.node, 10) };
-     } else if (params.way) {
-       mapParams.object = { type: "way", id: parseInt(params.way, 10) };
-     } else if (params.relation) {
-       mapParams.object = { type: "relation", id: parseInt(params.relation, 10) };
-     } else if (params.note) {
-       mapParams.object = { type: "note", id: parseInt(params.note, 10) };
+     for (const type of ["node", "way", "relation", "note"]) {
+       if (params[type]) {
+         mapParams.object = { type, id: parseInt(params[type], 10) };
+       }
      }
  
      var hash = OSM.parseHash(location.hash);
  
      const loc = Cookies.get("_osm_location")?.split("|");
  
+     function bboxToLatLngBounds({ minlon, minlat, maxlon, maxlat }) {
+       return L.latLngBounds([minlat, minlon], [maxlat, maxlon]);
+     }
      // Decide on a map starting position. Various ways of doing this.
      if (hash.center) {
        mapParams.lon = hash.center.lng;
        mapParams.lat = hash.center.lat;
        mapParams.zoom = hash.zoom;
      } else if (params.bbox) {
-       var bbox = params.bbox.split(",");
-       mapParams.bounds = L.latLngBounds(
-         [parseFloat(bbox[1]), parseFloat(bbox[0])],
-         [parseFloat(bbox[3]), parseFloat(bbox[2])]);
+       const [minlon, minlat, maxlon, maxlat] = params.bbox.split(",");
+       mapParams.bounds = bboxToLatLngBounds({ minlon, minlat, maxlon, maxlat });
      } else if (params.minlon && params.minlat && params.maxlon && params.maxlat) {
-       mapParams.bounds = L.latLngBounds(
-         [parseFloat(params.minlat), parseFloat(params.minlon)],
-         [parseFloat(params.maxlat), parseFloat(params.maxlon)]);
+       mapParams.bounds = bboxToLatLngBounds(params);
      } else if (params.mlon && params.mlat) {
-       mapParams.lon = parseFloat(params.mlon);
-       mapParams.lat = parseFloat(params.mlat);
-       mapParams.zoom = parseInt(params.zoom || 12, 10);
+       mapParams.lon = params.mlon;
+       mapParams.lat = params.mlat;
+       mapParams.zoom = params.zoom || 12;
      } else if (loc) {
-       mapParams.lon = parseFloat(loc[0]);
-       mapParams.lat = parseFloat(loc[1]);
-       mapParams.zoom = parseInt(loc[2], 10);
+       [mapParams.lon, mapParams.lat, mapParams.zoom] = loc;
      } else if (OSM.home) {
        mapParams.lon = OSM.home.lon;
        mapParams.lat = OSM.home.lat;
        mapParams.zoom = 10;
      } else if (OSM.location) {
-       mapParams.bounds = L.latLngBounds(
-         [OSM.location.minlat, OSM.location.minlon],
-         [OSM.location.maxlat, OSM.location.maxlon]
-       );
+       mapParams.bounds = bboxToLatLngBounds(OSM.location);
      } else {
        mapParams.lon = -0.1;
        mapParams.lat = 51.5;
-       mapParams.zoom = parseInt(params.zoom || 5, 10);
+       mapParams.zoom = params.zoom || 5;
      }
  
+     if (typeof mapParams.lat === "string") mapParams.lat = parseFloat(mapParams.lat);
+     if (typeof mapParams.lon === "string") mapParams.lon = parseFloat(mapParams.lon);
+     if (typeof mapParams.zoom === "string") mapParams.zoom = parseInt(mapParams.zoom, 10);
      mapParams.layers = hash.layers || (loc && loc[3]) || "";
  
      var scale = parseFloat(params.scale);
      return 6372795 * 2 * Math.asin(
        Math.sqrt(
          Math.pow(Math.sin(latdiff / 2), 2) +
 -        Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(lngdiff / 2), 2)
 +        (Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(lngdiff / 2), 2))
        ));
    }
  };