From: Tom Hughes Date: Sun, 6 Apr 2025 09:03:31 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/pull/5877' X-Git-Tag: live~72 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/33a785ff919f1e74ba786464bdf90d8dce369dcc?hp=8308ac960bbeb45313494f9bb16a0d0ca8b1cea7 Merge remote-tracking branch 'upstream/pull/5877' --- diff --git a/Dockerfile b/Dockerfile index 5df13d717..884d69ef1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,10 +42,10 @@ RUN mkdir -p /app WORKDIR /app # Install Ruby packages -ADD Gemfile Gemfile.lock /app/ +COPY Gemfile Gemfile.lock /app/ RUN bundle install # Install NodeJS packages using yarn -ADD package.json yarn.lock /app/ -ADD bin/yarn /app/bin/ +COPY package.json yarn.lock /app/ +COPY bin/yarn /app/bin/ RUN bundle exec bin/yarn install diff --git a/app/assets/javascripts/diary_entry.js b/app/assets/javascripts/diary_entry.js index e43446094..041e49f7e 100644 --- a/app/assets/javascripts/diary_entry.js +++ b/app/assets/javascripts/diary_entry.js @@ -30,8 +30,7 @@ $(function () { zoomControl: false }).addLayer(new L.OSM.Mapnik()); - L.OSM.zoom({ position: position }) - .addTo(map); + L.OSM.zoom({ position }).addTo(map); map.setView(centre, params.zoom); diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index b3ec71b92..be2a015b3 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -1,7 +1,6 @@ //= require_self //= require leaflet.sidebar //= require leaflet.sidebar-pane -//= require leaflet.locatecontrol/dist/L.Control.Locate.umd //= require leaflet.locate //= require leaflet.layers //= require leaflet.key @@ -111,39 +110,30 @@ $(function () { } addControlGroup([ - L.OSM.zoom({ position: position }), - L.OSM.locate({ position: position }) + L.OSM.zoom({ position }), + L.OSM.locate({ position }) ]); addControlGroup([ L.OSM.layers({ - position: position, - layers: map.baseLayers, - sidebar: sidebar - }), - L.OSM.key({ - position: position, - sidebar: sidebar + position, + sidebar, + layers: map.baseLayers }), + L.OSM.key({ position, sidebar }), L.OSM.share({ - "position": position, - "sidebar": sidebar, + position, + sidebar, "short": true }) ]); addControlGroup([ - L.OSM.note({ - position: position, - sidebar: sidebar - }) + L.OSM.note({ position, sidebar }) ]); addControlGroup([ - L.OSM.query({ - position: position, - sidebar: sidebar - }) + L.OSM.query({ position, sidebar }) ]); L.control.scale() diff --git a/app/assets/javascripts/index/history.js b/app/assets/javascripts/index/history.js index 9f883367a..1a23ac7b1 100644 --- a/app/assets/javascripts/index/history.js +++ b/app/assets/javascripts/index/history.js @@ -104,6 +104,10 @@ OSM.History = function (map) { function displayFirstChangesets(html) { $("#sidebar_content .changesets").html(html); + + if (location.pathname === "/history") { + setPaginationMapHashes(); + } } function displayMoreChangesets(div, html) { @@ -130,29 +134,34 @@ OSM.History = function (map) { nextNewList.children().appendTo(oldList); nextNewList.remove(); } + + if (location.pathname === "/history") { + setPaginationMapHashes(); + } + } + + function setPaginationMapHashes() { + $("#sidebar .pagination a").each(function () { + $(this).prop("hash", OSM.formatHash({ + center: map.getCenter(), + zoom: map.getZoom() + })); + }); } function loadFirstChangesets() { const data = new URLSearchParams(); - const params = new URLSearchParams(location.search); disableChangesetIntersectionObserver(); if (location.pathname === "/history") { - data.set("bbox", map.getBounds().wrap().toBBoxString()); + setBboxFetchData(data); const feedLink = $("link[type=\"application/atom+xml\"]"), feedHref = feedLink.attr("href").split("?")[0]; feedLink.attr("href", feedHref + "?" + data); } - data.set("list", "1"); - - if (params.has("before")) { - data.set("before", params.get("before")); - } - if (params.has("after")) { - data.set("after", params.get("after")); - } + setListFetchData(data, location); fetch(location.pathname + "?" + data) .then(response => response.text()) @@ -160,13 +169,15 @@ OSM.History = function (map) { displayFirstChangesets(html); enableChangesetIntersectionObserver(); - if (params.has("before")) { + if (data.has("before")) { const [firstItem] = $("#sidebar_content .changesets ol").children().first(); firstItem?.scrollIntoView(); - } - if (params.has("after")) { + } else if (data.has("after")) { const [lastItem] = $("#sidebar_content .changesets ol").children().last(); lastItem?.scrollIntoView(false); + } else { + const [sidebar] = $("#sidebar"); + sidebar.scrollTop = 0; } updateMap(); @@ -179,14 +190,51 @@ OSM.History = function (map) { const div = $(this).parents(".changeset_more"); - $(this).hide(); - div.find(".loader").show(); + div.find(".pagination").addClass("invisible"); + div.find("[hidden]").prop("hidden", false); - $.get($(this).attr("href"), function (html) { - displayMoreChangesets(div, html); - enableChangesetIntersectionObserver(); - updateMap(); - }); + const data = new URLSearchParams(); + + if (location.pathname === "/history") { + setBboxFetchData(data); + } + + const url = new URL($(this).attr("href"), location); + setListFetchData(data, url); + + fetch(url.pathname + "?" + data) + .then(response => response.text()) + .then(function (html) { + displayMoreChangesets(div, html); + enableChangesetIntersectionObserver(); + + updateMap(); + }); + } + + function setBboxFetchData(data) { + const crs = map.options.crs; + const sw = map.getBounds().getSouthWest(); + const ne = map.getBounds().getNorthEast(); + const swClamped = crs.unproject(crs.project(sw)); + const neClamped = crs.unproject(crs.project(ne)); + + if (sw.lat >= swClamped.lat || ne.lat <= neClamped.lat || ne.lng - sw.lng < 360) { + data.set("bbox", map.getBounds().wrap().toBBoxString()); + } + } + + function setListFetchData(data, url) { + const params = new URLSearchParams(url.search); + + data.set("list", "1"); + + if (params.has("before")) { + data.set("before", params.get("before")); + } + if (params.has("after")) { + data.set("after", params.get("after")); + } } function reloadChangesetsBecauseOfMapMovement() { diff --git a/app/assets/javascripts/index/layers/data.js b/app/assets/javascripts/index/layers/data.js index 6452c2a41..6c8bdc025 100644 --- a/app/assets/javascripts/index/layers/data.js +++ b/app/assets/javascripts/index/layers/data.js @@ -2,21 +2,6 @@ OSM.initializeDataLayer = function (map) { let dataLoader, loadedBounds; const dataLayer = map.dataLayer; - dataLayer.setStyle({ - way: { - weight: 3, - color: "#000000", - opacity: 0.4 - }, - area: { - weight: 3, - color: "#ff0000" - }, - node: { - color: "#00ff00" - } - }); - dataLayer.isWayArea = function () { return false; }; @@ -132,6 +117,8 @@ OSM.initializeDataLayer = function (map) { if (map._objectLayer) { map._objectLayer.bringToFront(); } + + dataLoader = null; }) .catch(function (error) { if (error.name === "AbortError") return; @@ -139,9 +126,10 @@ OSM.initializeDataLayer = function (map) { displayLoadError(error?.message, () => { $("#browse_status").empty(); }); + + dataLoader = null; }) .finally(() => { - dataLoader = null; spanLoading.remove(); }); } diff --git a/app/assets/javascripts/leaflet.locate.js b/app/assets/javascripts/leaflet.locate.js index d270d6499..8fc182f38 100644 --- a/app/assets/javascripts/leaflet.locate.js +++ b/app/assets/javascripts/leaflet.locate.js @@ -1,3 +1,5 @@ +//= require leaflet.locatecontrol/dist/L.Control.Locate.umd + L.OSM.locate = function (options) { const control = L.control.locate({ icon: "icon geolocate", diff --git a/app/assets/javascripts/osm.js.erb b/app/assets/javascripts/osm.js.erb index 6762ce6b0..d73d1c163 100644 --- a/app/assets/javascripts/osm.js.erb +++ b/app/assets/javascripts/osm.js.erb @@ -158,11 +158,11 @@ OSM = { layers = args.getLayersCode(); } else if (args instanceof URLSearchParams) { center = args.get("center") || L.latLng(args.get("lat"), args.get("lon")); - zoom = args.get("zoom"); + zoom = Number(args.get("zoom")); layers = args.get("layers") || ""; } else { center = args.center || L.latLng(args.lat, args.lon); - zoom = args.zoom; + zoom = Number(args.zoom); layers = args.layers || ""; } diff --git a/app/assets/javascripts/user.js b/app/assets/javascripts/user.js index a2516984e..5f8a931e3 100644 --- a/app/assets/javascripts/user.js +++ b/app/assets/javascripts/user.js @@ -1,4 +1,4 @@ -//= require leaflet.locatecontrol/dist/L.Control.Locate.umd +//= require leaflet.locate (function () { $(document).on("change", "#user_all", function () { @@ -18,30 +18,9 @@ $(function () { const position = $("html").attr("dir") === "rtl" ? "topleft" : "topright"; - L.OSM.zoom({ position: position }) - .addTo(map); - - const locate = L.control.locate({ - position: position, - icon: "icon geolocate", - iconLoading: "icon geolocate", - strings: { - title: OSM.i18n.t("javascripts.map.locate.title"), - popup: function (options) { - return OSM.i18n.t("javascripts.map.locate." + options.unit + "Popup", { count: options.distance }); - } - } - }).addTo(map); - - const locateContainer = locate.getContainer(); + L.OSM.zoom({ position }).addTo(map); - $(locateContainer) - .removeClass("leaflet-control-locate leaflet-bar") - .addClass("control-locate") - .children("a") - .attr("href", "#") - .removeClass("leaflet-bar-part leaflet-bar-part-single") - .addClass("control-button"); + L.OSM.locate({ position }).addTo(map); if (OSM.home) { map.setView([OSM.home.lat, OSM.home.lon], defaultHomeZoom); diff --git a/app/assets/javascripts/welcome.js b/app/assets/javascripts/welcome.js index 5ce6afdcc..dc269a310 100644 --- a/app/assets/javascripts/welcome.js +++ b/app/assets/javascripts/welcome.js @@ -15,10 +15,6 @@ $(function () { $(".start-mapping").addClass("loading"); if (navigator.geolocation) { - // handle firefox's weird implementation - // https://bugzilla.mozilla.org/show_bug.cgi?id=675533 - window.setTimeout(manualEdit, 4000); - navigator.geolocation.getCurrentPosition(geoSuccess, manualEdit); } else { manualEdit(); diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 27d58f84e..9fff025d0 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -620,11 +620,6 @@ tr.turn { z-index: 2; /* needs to be higher than Bootstrap's stretched link ::after z-index */ } } - - .changeset_more .loader { - display: none; - width: 100%; - } } /* Rules for the browse sidebar */ @@ -679,12 +674,6 @@ tr.turn { > * { margin: -1px; } - #minlon { - /*rtl:ignore*/ float: left; - } - #maxlon { - /*rtl:ignore*/ float: right; - } } } diff --git a/app/views/changesets/index.html.erb b/app/views/changesets/index.html.erb index 3f25cf134..cd59d14c8 100644 --- a/app/views/changesets/index.html.erb +++ b/app/views/changesets/index.html.erb @@ -1,11 +1,15 @@ <% if @newer_changesets_id %> -
- <%= link_to t(".load_more"), url_for(@params.merge(:before => nil, :after => @newer_changesets_id)), :class => "btn btn-primary" %> -
+
+ +
    +
  • + <%= link_to t(".newer_changesets"), url_for(:after => @newer_changesets_id), :class => "page-link" %> +
  • +
<% end %> <% if @changesets.present? %> @@ -20,12 +24,16 @@

<%= params[:before] ? t(".no_more") : t(".empty") %>

<% end %> <% if @older_changesets_id -%> -
- <%= link_to t(".load_more"), url_for(@params.merge(:before => @older_changesets_id, :after => nil)), :class => "btn btn-primary" %> -
+
+ +
    +
  • + <%= link_to t(".older_changesets"), url_for(:before => @older_changesets_id), :class => "page-link" %> +
  • +
<% end -%> diff --git a/app/views/dashboards/_contact.html.erb b/app/views/dashboards/_contact.html.erb index fc99ada79..cea6c2b29 100644 --- a/app/views/dashboards/_contact.html.erb +++ b/app/views/dashboards/_contact.html.erb @@ -4,7 +4,7 @@ :icon => type == "following" ? "MARKER_BLUE" : "MARKER_GREEN", :description => render(:partial => "popup", :object => contact, :locals => { :type => type }) } %> -<%= tag.div :class => "clearfix row", :data => { :user => user_data } do %> +<%= tag.div :class => "row", :data => { :user => user_data } do %>
<%= user_thumbnail contact %>
@@ -32,7 +32,7 @@