From b816f5b27e8d803294e333442b61d45aa4ce1eeb Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sun, 5 Jan 2025 17:28:36 +0300 Subject: [PATCH 1/4] Remove 'center' argument of addChangeset() It is always set to true. --- app/assets/javascripts/index/changeset.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/index/changeset.js b/app/assets/javascripts/index/changeset.js index 75a1f7b4d..257dad5bc 100644 --- a/app/assets/javascripts/index/changeset.js +++ b/app/assets/javascripts/index/changeset.js @@ -12,13 +12,12 @@ OSM.Changeset = function (map) { page.load = function (path, id) { if (id) currentChangesetId = id; initialize(); - addChangeset(currentChangesetId, true); + addChangeset(currentChangesetId); }; - function addChangeset(id, center) { + function addChangeset(id) { map.addObject({ type: "changeset", id: parseInt(id, 10) }, function (bounds) { - if (!window.location.hash && bounds.isValid() && - (center || !map.getBounds().contains(bounds))) { + if (!window.location.hash && bounds.isValid()) { OSM.router.withoutMoveListener(function () { map.fitBounds(bounds); }); From bb4720f09b42749746151dae1d0348f062696574 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sun, 5 Jan 2025 17:35:37 +0300 Subject: [PATCH 2/4] Move changeset data to a helper --- app/helpers/changesets_helper.rb | 16 ++++++++++++++++ app/views/changesets/_changeset.html.erb | 14 +------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/helpers/changesets_helper.rb b/app/helpers/changesets_helper.rb index ae953c583..4605658f6 100644 --- a/app/helpers/changesets_helper.rb +++ b/app/helpers/changesets_helper.rb @@ -41,4 +41,20 @@ module ChangesetsHelper t "changesets.index.title" end end + + def changeset_data(changeset) + changeset_data = { :id => changeset.id } + + if changeset.bbox_valid? + bbox = changeset.bbox.to_unscaled + changeset_data[:bbox] = { + :minlon => bbox.min_lon, + :minlat => bbox.min_lat, + :maxlon => bbox.max_lon, + :maxlat => bbox.max_lat + } + end + + changeset_data + end end diff --git a/app/views/changesets/_changeset.html.erb b/app/views/changesets/_changeset.html.erb index 2a3f65859..e29cf01b0 100644 --- a/app/views/changesets/_changeset.html.erb +++ b/app/views/changesets/_changeset.html.erb @@ -1,16 +1,4 @@ -<% changeset_data = { :id => changeset.id } - - if changeset.bbox_valid? - bbox = changeset.bbox.to_unscaled - changeset_data[:bbox] = { - :minlon => bbox.min_lon, - :minlat => bbox.min_lat, - :maxlon => bbox.max_lon, - :maxlat => bbox.max_lat - } - end %> - -<%= tag.li :id => "changeset_#{changeset.id}", :data => { :changeset => changeset_data }, :class => "list-group-item list-group-item-action" do %> +<%= tag.li :id => "changeset_#{changeset.id}", :data => { :changeset => changeset_data(changeset) }, :class => "list-group-item list-group-item-action" do %>

<%= changeset.tags["comment"].to_s.presence || t("browse.no_comment") %> From 0b0569f150afc4bfc3acefbdc477f50eb56ffeae Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sun, 5 Jan 2025 17:57:31 +0300 Subject: [PATCH 3/4] Write details attribute to changeset page --- app/views/changesets/show.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/changesets/show.html.erb b/app/views/changesets/show.html.erb index a47049e99..167bcb5cb 100644 --- a/app/views/changesets/show.html.erb +++ b/app/views/changesets/show.html.erb @@ -6,7 +6,9 @@

<%= linkify(@changeset.tags["comment"].to_s.presence || t("browse.no_comment")) %>

-

<%= changeset_details(@changeset) %>

+ <%= tag.p :class => "details", :data => { :changeset => changeset_data(@changeset) } do %> + <%= changeset_details(@changeset) %> + <% end %> <%= render :partial => "browse/tag_details", :object => @changeset.tags.except("comment") %> From c887f1d7b29ff6a125ebe70ff15609a005f99fba Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sun, 5 Jan 2025 17:59:47 +0300 Subject: [PATCH 4/4] Use details attribute to render changeset bounding box Do this instead of using L.OSM.DataLayer. DataLayer makes an extra request just to get the bbox. Also it expects bbox to always exist, which is not true for some changesets. --- app/assets/javascripts/index/changeset.js | 21 ++++++++---------- app/assets/javascripts/leaflet.map.js | 27 +++++++++++++++-------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/index/changeset.js b/app/assets/javascripts/index/changeset.js index 257dad5bc..caf40f6b6 100644 --- a/app/assets/javascripts/index/changeset.js +++ b/app/assets/javascripts/index/changeset.js @@ -1,29 +1,26 @@ OSM.Changeset = function (map) { var page = {}, - content = $("#sidebar_content"), - currentChangesetId; + content = $("#sidebar_content"); - page.pushstate = page.popstate = function (path, id) { + page.pushstate = page.popstate = function (path) { OSM.loadSidebarContent(path, function () { - page.load(path, id); + page.load(); }); }; - page.load = function (path, id) { - if (id) currentChangesetId = id; - initialize(); - addChangeset(currentChangesetId); - }; + page.load = function () { + const changesetData = content.find("[data-changeset]").data("changeset"); + changesetData.type = "changeset"; - function addChangeset(id) { - map.addObject({ type: "changeset", id: parseInt(id, 10) }, function (bounds) { + initialize(); + map.addObject(changesetData, function (bounds) { if (!window.location.hash && bounds.isValid()) { OSM.router.withoutMoveListener(function () { map.fitBounds(bounds); }); } }); - } + }; function updateChangeset(method, url, include_data) { var data; diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index 6537b0b23..5e6112fc0 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -267,7 +267,7 @@ L.OSM.Map = L.Map.extend({ this.removeObject(); - if (object.type === "note") { + if (object.type === "note" || object.type === "changeset") { this._objectLoader = { abort: function () {} }; @@ -275,18 +275,27 @@ L.OSM.Map = L.Map.extend({ this._object = object; this._objectLayer = L.featureGroup().addTo(this); - L.circleMarker(object.latLng, haloStyle).addTo(this._objectLayer); + if (object.type === "note") { + L.circleMarker(object.latLng, haloStyle).addTo(this._objectLayer); - if (object.icon) { - L.marker(object.latLng, { - icon: object.icon, - opacity: 1, - interactive: true - }).addTo(this._objectLayer); + if (object.icon) { + L.marker(object.latLng, { + icon: object.icon, + opacity: 1, + interactive: true + }).addTo(this._objectLayer); + } + } else if (object.type === "changeset") { + if (object.bbox) { + L.rectangle([ + [object.bbox.minlat, object.bbox.minlon], + [object.bbox.maxlat, object.bbox.maxlon] + ], changesetStyle).addTo(this._objectLayer); + } } if (callback) callback(this._objectLayer.getBounds()); - } else { // element or changeset handled by L.OSM.DataLayer + } else { // element handled by L.OSM.DataLayer var map = this; this._objectLoader = $.ajax({ url: OSM.apiUrl(object),