From: Tom Hughes Date: Sun, 13 Apr 2025 10:12:14 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/pull/5925' X-Git-Tag: live~88 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/283e034b562ed4786d9f9fc6020e2c61fd1dca02?hp=b0a4438d5d5b314bab5b60a0fadd87ca5eec9119 Merge remote-tracking branch 'upstream/pull/5925' --- diff --git a/app/assets/javascripts/leaflet.key.js b/app/assets/javascripts/leaflet.key.js index a5d7acb43..b432bcf8f 100644 --- a/app/assets/javascripts/leaflet.key.js +++ b/app/assets/javascripts/leaflet.key.js @@ -27,7 +27,7 @@ L.OSM.key = function (options) { } function updateButton() { - const disabled = OSM.LAYERS_WITH_MAP_KEY.indexOf(map.getMapBaseLayerId()) === -1; + const disabled = !map.getMapBaseLayer().options.hasLegend; button .toggleClass("disabled", disabled) .attr("data-bs-original-title", diff --git a/app/assets/javascripts/osm.js.erb b/app/assets/javascripts/osm.js.erb index d73d1c163..31f92da84 100644 --- a/app/assets/javascripts/osm.js.erb +++ b/app/assets/javascripts/osm.js.erb @@ -27,8 +27,7 @@ OSM = { DEFAULT_LOCALE: <%= I18n.default_locale.to_json %>, - LAYER_DEFINITIONS: <%= MapLayers::full_definitions("config/layers.yml").to_json %>, - LAYERS_WITH_MAP_KEY: <%= YAML.load_file(Rails.root.join("config/key.yml")).keys.to_json %>, + LAYER_DEFINITIONS: <%= MapLayers::full_definitions("config/layers.yml", :legends => "config/key.yml").to_json %>, MARKER_BLUE: <%= image_path("marker-blue.png").to_json %>, MARKER_GREEN: <%= image_path("marker-green.png").to_json %>, diff --git a/config/key.yml b/config/key.yml index 798d9ca54..775cdf461 100644 --- a/config/key.yml +++ b/config/key.yml @@ -104,6 +104,44 @@ mapnik: - { min_zoom: 15, name: private, image: private.png } - { min_zoom: 15, name: destination, image: destination.png } - { min_zoom: 12, name: construction, image: construction.png } +cyclosm: + # bicycle routes: roads.mss, road-colors.mss + - { min_zoom: 2, name: international_bike_route, width: 50, height: 1, fill: "#ff00ff", opacity: 0.75 } + - { min_zoom: 8, name: international_bike_route, width: 50, height: 1, fill: "#ff00ff", opacity: 0.6 } + - { min_zoom: 9, name: international_bike_route, width: 50, height: 2, fill: "#ff00ff", opacity: 0.6 } + - { min_zoom: 11, name: international_bike_route, width: 50, height: 3, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 12, name: international_bike_route, width: 50, height: 4, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 14, name: international_bike_route, width: 50, height: 5, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 15, name: international_bike_route, width: 50, height: 6, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 16, name: international_bike_route, width: 50, height: 7, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 17, name: international_bike_route, width: 50, height: 10, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 18, name: international_bike_route, width: 50, height: 14, fill: "#ff00ff", opacity: 0.25 } + - { min_zoom: 5, name: national_bike_route, width: 50, height: 1, fill: "#aa00ff", opacity: 0.75 } + - { min_zoom: 8, name: national_bike_route, width: 50, height: 1, fill: "#aa00ff", opacity: 0.6 } + - { min_zoom: 9, name: national_bike_route, width: 50, height: 2, fill: "#aa00ff", opacity: 0.6 } + - { min_zoom: 11, name: national_bike_route, width: 50, height: 3, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 12, name: national_bike_route, width: 50, height: 4, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 14, name: national_bike_route, width: 50, height: 5, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 15, name: national_bike_route, width: 50, height: 6, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 16, name: national_bike_route, width: 50, height: 7, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 17, name: national_bike_route, width: 50, height: 10, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 18, name: national_bike_route, width: 50, height: 14, fill: "#aa00ff", opacity: 0.25 } + - { min_zoom: 8, name: regional_bike_route, width: 50, height: 1, fill: "#5500ff", opacity: 0.6 } + - { min_zoom: 9, name: regional_bike_route, width: 50, height: 2, fill: "#5500ff", opacity: 0.6 } + - { min_zoom: 11, name: regional_bike_route, width: 50, height: 3, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 12, name: regional_bike_route, width: 50, height: 4, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 14, name: regional_bike_route, width: 50, height: 5, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 15, name: regional_bike_route, width: 50, height: 6, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 16, name: regional_bike_route, width: 50, height: 7, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 17, name: regional_bike_route, width: 50, height: 10, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 18, name: regional_bike_route, width: 50, height: 14, fill: "#5500ff", opacity: 0.25 } + - { min_zoom: 11, name: local_bike_route, width: 50, height: 3, fill: "#0000ff", opacity: 0.25 } + - { min_zoom: 12, name: local_bike_route, width: 50, height: 4, fill: "#0000ff", opacity: 0.25 } + - { min_zoom: 14, name: local_bike_route, width: 50, height: 5, fill: "#0000ff", opacity: 0.25 } + - { min_zoom: 15, name: local_bike_route, width: 50, height: 6, fill: "#0000ff", opacity: 0.25 } + - { min_zoom: 16, name: local_bike_route, width: 50, height: 7, fill: "#0000ff", opacity: 0.25 } + - { min_zoom: 17, name: local_bike_route, width: 50, height: 10, fill: "#0000ff", opacity: 0.25 } + - { min_zoom: 18, name: local_bike_route, width: 50, height: 14, fill: "#0000ff", opacity: 0.25 } cyclemap: - { min_zoom: 5, name: motorway, width: 50, height: 2, fill: "#9a9ab1" } - { min_zoom: 9, name: motorway, width: 50, height: 3, fill: "#9a9ab1" } @@ -124,17 +162,17 @@ cyclemap: - { min_zoom: 17, name: track, width: 50, height: 5, fill: white, casing: "#999", casing-dasharray: "5 3", casing-dashoffset: 1 } - { min_zoom: 13, name: bridleway, width: 52, height: 3, line: green, line-width: 1.5, line-dasharray: "4 2" } - { min_zoom: 8, name: cycleway, width: 50, height: 3, line: "#0100fe", line-width: 1.5, line-dasharray: "6 2" } - - { min_zoom: 5, name: cycleway_national, width: 50, height: 2, fill: "#fe0000" } - - { min_zoom: 12, name: cycleway_national, width: 50, height: 3, fill: "#fe0000" } - - { min_zoom: 13, name: cycleway_national, width: 50, height: 12, fill: "#ffb3b3" } - - { min_zoom: 7, name: cycleway_regional, width: 50, height: 2, fill: "#b638fb" } - - { min_zoom: 12, name: cycleway_regional, width: 50, height: 3, fill: "#b638fb" } - - { min_zoom: 13, name: cycleway_regional, width: 50, height: 10, fill: "#ddb5d9" } - - { min_zoom: 8, name: cycleway_local, width: 50, height: 2, fill: "#0100fe" } - - { min_zoom: 12, name: cycleway_local, width: 50, height: 3, fill: "#0100fe" } - - { min_zoom: 13, name: cycleway_local, width: 50, height: 8, fill: "#b2b2ff" } - - { min_zoom: 10, name: cycleway_mtb, width: 50, height: 2, fill: "#ff7b1c" } - - { min_zoom: 13, name: cycleway_mtb, width: 50, height: 6, fill: "#fbcaa3" } + - { min_zoom: 5, name: national_bike_route, width: 50, height: 2, fill: "#fe0000" } + - { min_zoom: 12, name: national_bike_route, width: 50, height: 3, fill: "#fe0000" } + - { min_zoom: 13, name: national_bike_route, width: 50, height: 12, fill: "#ffb3b3" } + - { min_zoom: 7, name: regional_bike_route, width: 50, height: 2, fill: "#b638fb" } + - { min_zoom: 12, name: regional_bike_route, width: 50, height: 3, fill: "#b638fb" } + - { min_zoom: 13, name: regional_bike_route, width: 50, height: 10, fill: "#ddb5d9" } + - { min_zoom: 8, name: local_bike_route, width: 50, height: 2, fill: "#0100fe" } + - { min_zoom: 12, name: local_bike_route, width: 50, height: 3, fill: "#0100fe" } + - { min_zoom: 13, name: local_bike_route, width: 50, height: 8, fill: "#b2b2ff" } + - { min_zoom: 10, name: mountain_bike_route, width: 50, height: 2, fill: "#ff7b1c" } + - { min_zoom: 13, name: mountain_bike_route, width: 50, height: 6, fill: "#fbcaa3" } - { min_zoom: 13, name: footway, width: 50, height: 3, line: "#bd6d6e", line-width: 1.5, line-dasharray: "6 2" } - { min_zoom: 7, name: rail, width: 50, height: 3, line: "#999999", line-width: 1.5 } - { min_zoom: 14, name: rail, width: 50, height: 4, fill: "#999999", line: white, line-dasharray: 4, line-width: 2 } diff --git a/config/locales/en.yml b/config/locales/en.yml index c4c53f059..35ba0650b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2529,10 +2529,11 @@ en: track: "Track" bridleway: "Bridleway" cycleway: "Cycleway" - cycleway_national: "National cycleway" - cycleway_regional: "Regional cycleway" - cycleway_local: "Local cycleway" - cycleway_mtb: "Mountain bike route" + international_bike_route: "International bike route" + national_bike_route: "National bike route" + regional_bike_route: "Regional bike route" + local_bike_route: "Local bike route" + mountain_bike_route: "Mountain bike route" footway: "Footway" rail: "Railway" train: "Train" diff --git a/lib/map_layers.rb b/lib/map_layers.rb index 8a1bdea79..f0727ed92 100644 --- a/lib/map_layers.rb +++ b/lib/map_layers.rb @@ -1,5 +1,6 @@ module MapLayers - def self.full_definitions(layers_filename) + def self.full_definitions(layers_filename, legends: nil) + legended_layers = YAML.load_file(Rails.root.join(legends)).keys if legends YAML.load_file(Rails.root.join(layers_filename)) .reject { |layer| layer["apiKeyId"] && !Settings[layer["apiKeyId"]] } .map do |layer| @@ -7,6 +8,7 @@ module MapLayers layer["apikey"] = Settings[layer["apiKeyId"]] layer.delete "apiKeyId" end + layer["hasLegend"] = true if legended_layers&.include?(layer["layerId"]) layer end end diff --git a/test/system/history_test.rb b/test/system/history_test.rb index cb3647354..01652b6b0 100644 --- a/test/system/history_test.rb +++ b/test/system/history_test.rb @@ -176,6 +176,16 @@ class HistoryTest < ApplicationSystemTestCase end end + test "changeset bbox is shown on the map and clickable" do + user = create(:user) + changeset = create(:changeset, :user => user, :num_changes => 1, :bbox => [50, 50, 51, 51]) + + visit "#{user_path(user)}/history" + find_by_id("map").click + + assert_current_path changeset_path(changeset) + end + private def create_visible_changeset(user, comment) diff --git a/test/system/search_test.rb b/test/system/search_test.rb index bf05f9212..0292e67f0 100644 --- a/test/system/search_test.rb +++ b/test/system/search_test.rb @@ -1,7 +1,13 @@ require "application_system_test_case" class SearchTest < ApplicationSystemTestCase - test "click on 'where is this' sets search input value and makes reverse geocoding request with zoom" do + def setup + stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/search\?}) + .to_return(:status => 404) + + stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?}) + .to_return(:status => 404) + stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?.*zoom=$}) .to_return(:status => 400, :body => <<-BODY) @@ -27,7 +33,9 @@ class SearchTest < ApplicationSystemTestCase BODY + end + test "click on 'where is this' sets search input value and makes reverse geocoding request with zoom" do visit "/#map=15/51.76320/-0.00760" assert_field "Search", :with => "" @@ -37,28 +45,28 @@ class SearchTest < ApplicationSystemTestCase assert_link "Broxbourne, Hertfordshire, East of England, England, United Kingdom" end - test "query search link sets search input value" do - stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?}) - .to_return(:status => 404) + test "'Show address' from context menu makes reverse geocoding request with zoom" do + visit "/#map=15/51.76320/-0.00760" + + find_by_id("map").right_click + click_on "Show address" + assert_link "Broxbourne, Hertfordshire, East of England, England, United Kingdom" + end + + test "query search link sets search input value" do visit search_path(:query => "2.341, 7.896") assert_field "Search", :with => "2.341, 7.896" end test "latlon search link sets search input value" do - stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?}) - .to_return(:status => 404) - visit search_path(:lat => "4.321", :lon => "9.876") assert_field "Search", :with => "4.321, 9.876" end test "search adds viewbox param to Nominatim link" do - stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/search\?}) - .to_return(:status => 404) - visit "/" fill_in "query", :with => "paris" @@ -68,9 +76,6 @@ class SearchTest < ApplicationSystemTestCase end test "search adds zoom param to reverse Nominatim link" do - stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?}) - .to_return(:status => 404) - visit "/#map=7/1.234/6.789" fill_in "query", :with => "60 30" diff --git a/test/system/site_test.rb b/test/system/site_test.rb index d7b9f279e..df7682fe9 100644 --- a/test/system/site_test.rb +++ b/test/system/site_test.rb @@ -28,7 +28,7 @@ class SiteTest < ApplicationSystemTestCase end test "tooltip shows for Map Key button on a layer without a key provided" do - visit "/#layers=Y" # assumes that CyclOSM layer has no map key + visit "/#layers=H" # assumes that HOT layer has no map key assert_no_selector ".tooltip" button = find ".control-key .control-button"