From: Tom Hughes Date: Sat, 12 Aug 2023 13:56:27 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/pull/4149' X-Git-Tag: live~1848 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/491a61266cef413405e0dd98455545c64a30841b?hp=d62e9a0dbc2f25dea34d2d5a14bebc26791b8fec Merge remote-tracking branch 'upstream/pull/4149' --- diff --git a/app/assets/javascripts/user.js b/app/assets/javascripts/user.js index 964f187f9..146d876f7 100644 --- a/app/assets/javascripts/user.js +++ b/app/assets/javascripts/user.js @@ -1,8 +1,11 @@ //= require leaflet.locatecontrol/src/L.Control.Locate $(document).ready(function () { + var defaultHomeZoom = 12; + var map, marker, deleted_lat, deleted_lon; + if ($("#map").length) { - var map = L.map("map", { + map = L.map("map", { attributionControl: false, zoomControl: false }).addLayer(new L.OSM.Mapnik()); @@ -35,13 +38,17 @@ $(document).ready(function () { .addClass("control-button"); if (OSM.home) { - map.setView([OSM.home.lat, OSM.home.lon], 12); + map.setView([OSM.home.lat, OSM.home.lon], defaultHomeZoom); } else { map.setView([0, 0], 0); } if ($("#map").hasClass("set_location")) { - var marker = L.marker([0, 0], { icon: OSM.getUserIcon() }); + marker = L.marker([0, 0], { + icon: OSM.getUserIcon(), + keyboard: false, + interactive: false + }); if (OSM.home) { marker.setLatLng([OSM.home.lat, OSM.home.lon]); @@ -49,18 +56,65 @@ $(document).ready(function () { } map.on("click", function (e) { - if ($("#updatehome").is(":checked")) { - var zoom = map.getZoom(), - precision = OSM.zoomPrecision(zoom), - location = e.latlng.wrap(); + if (!$("#updatehome").is(":checked")) return; + + var zoom = map.getZoom(), + precision = OSM.zoomPrecision(zoom), + location = e.latlng.wrap(); + + $("#home_lat").val(location.lat.toFixed(precision)); + $("#home_lon").val(location.lng.toFixed(precision)); + + deleted_lat = null; + deleted_lon = null; + respondToHomeUpdate(); + }).on("moveend", function () { + var lat = $("#home_lat").val().trim(), + lon = $("#home_lon").val().trim(), + location; + + try { + if (lat && lon) { + location = L.latLng(lat, lon); + } + } catch (error) { + // keep location undefined + } - $("#home_message").hide(); - $("#home_lat").val(location.lat.toFixed(precision)); - $("#home_lon").val(location.lng.toFixed(precision)); + $("#home_show").prop("disabled", !location || isCloseEnoughToMapCenter(location)); + }); - marker.setLatLng(e.latlng); - marker.addTo(map); - } + $("#home_lat, #home_lon").on("input", function () { + deleted_lat = null; + deleted_lon = null; + respondToHomeUpdate(); + }); + + $("#home_show").click(function () { + var lat = $("#home_lat").val(), + lon = $("#home_lon").val(); + + map.setView([lat, lon], defaultHomeZoom); + }); + + $("#home_delete").click(function () { + var lat = $("#home_lat").val(), + lon = $("#home_lon").val(); + + $("#home_lat, #home_lon").val(""); + deleted_lat = lat; + deleted_lon = lon; + respondToHomeUpdate(); + $("#home_undelete").trigger("focus"); + }); + + $("#home_undelete").click(function () { + $("#home_lat").val(deleted_lat); + $("#home_lon").val(deleted_lon); + deleted_lat = null; + deleted_lon = null; + respondToHomeUpdate(); + $("#home_delete").trigger("focus"); }); } else { $("[data-user]").each(function () { @@ -73,6 +127,41 @@ $(document).ready(function () { } } + function respondToHomeUpdate() { + var lat = $("#home_lat").val().trim(), + lon = $("#home_lon").val().trim(), + location; + + try { + if (lat && lon) { + location = L.latLng(lat, lon); + } + $("#home_lat, #home_lon").removeClass("is-invalid"); + } catch (error) { + if (lat && isNaN(lat)) $("#home_lat").addClass("is-invalid"); + if (lon && isNaN(lon)) $("#home_lon").addClass("is-invalid"); + } + + $("#home_message").toggleClass("invisible", Boolean(location)); + $("#home_show").prop("hidden", !location); + $("#home_delete").prop("hidden", !location); + $("#home_undelete").prop("hidden", !(!location && deleted_lat && deleted_lon)); + if (location) { + marker.setLatLng([lat, lon]); + marker.addTo(map); + map.panTo([lat, lon]); + } else { + marker.removeFrom(map); + } + } + + function isCloseEnoughToMapCenter(location) { + var inputPt = map.latLngToContainerPoint(location), + centerPt = map.latLngToContainerPoint(map.getCenter()); + + return centerPt.distanceTo(inputPt) < 10; + } + function updateAuthUID() { var provider = $("select#user_auth_provider").val(); diff --git a/app/controllers/diary_entries_controller.rb b/app/controllers/diary_entries_controller.rb index ea9aacb21..018343d7c 100644 --- a/app/controllers/diary_entries_controller.rb +++ b/app/controllers/diary_entries_controller.rb @@ -280,7 +280,7 @@ class DiaryEntriesController < ApplicationController @lon = @diary_entry.longitude @lat = @diary_entry.latitude @zoom = 12 - elsif current_user.home_lat.nil? || current_user.home_lon.nil? + elsif !current_user.has_home? @lon = params[:lon] || -0.1 @lat = params[:lat] || 51.5 @zoom = params[:zoom] || 4 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index bb09f3a49..4b3a22cd3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -54,7 +54,7 @@ module ApplicationHelper if current_user data[:user] = current_user.id.to_json - data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } unless current_user.home_lon.nil? || current_user.home_lat.nil? + data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } if current_user.has_home? end data[:location] = session[:location] if session[:location] diff --git a/app/models/user.rb b/app/models/user.rb index c809b6192..41f249d4e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -238,8 +238,12 @@ class User < ApplicationRecord @preferred_languages ||= Locale.list(languages) end + def has_home? + home_lat && home_lon + end + def nearby(radius = Settings.nearby_radius, num = Settings.nearby_users) - if home_lon && home_lat + if has_home? gc = OSM::GreatCircle.new(home_lat, home_lon) sql_for_area = QuadTile.sql_for_area(gc.bounds(radius), "home_") sql_for_distance = gc.sql_for_distance("home_lat", "home_lon") @@ -401,6 +405,6 @@ class User < ApplicationRecord end def update_tile - self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if home_lat && home_lon + self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if has_home? end end diff --git a/app/views/api/users/_user.json.jbuilder b/app/views/api/users/_user.json.jbuilder index 15f0685ac..b84916010 100644 --- a/app/views/api/users/_user.json.jbuilder +++ b/app/views/api/users/_user.json.jbuilder @@ -46,7 +46,7 @@ json.user do end if current_user && current_user == user && can?(:details, User) - if user.home_lat && user.home_lon + if user.has_home? json.home do json.lat user.home_lat json.lon user.home_lon diff --git a/app/views/api/users/_user.xml.builder b/app/views/api/users/_user.xml.builder index 1791c60ef..23ec1d34d 100644 --- a/app/views/api/users/_user.xml.builder +++ b/app/views/api/users/_user.xml.builder @@ -25,7 +25,7 @@ xml.tag! "user", :id => user.id, end end if current_user && current_user == user && can?(:details, User) - if user.home_lat && user.home_lon + if user.has_home? xml.tag! "home", :lat => user.home_lat, :lon => user.home_lon, :zoom => user.home_zoom diff --git a/app/views/dashboards/_contact.html.erb b/app/views/dashboards/_contact.html.erb index 7785c0552..aba6094b2 100644 --- a/app/views/dashboards/_contact.html.erb +++ b/app/views/dashboards/_contact.html.erb @@ -11,7 +11,7 @@

<%= link_to contact.display_name, user_path(contact) %> - <% if @user.home_lon and @user.home_lat and contact.home_lon and contact.home_lat %> + <% if @user.has_home? and contact.has_home? %> <% distance = @user.distance(contact) %> <% if distance < 1 %> (<%= t ".m away", :count => (distance * 1000).round %>) diff --git a/app/views/dashboards/show.html.erb b/app/views/dashboards/show.html.erb index d0344ce79..eb3ceef6c 100644 --- a/app/views/dashboards/show.html.erb +++ b/app/views/dashboards/show.html.erb @@ -5,7 +5,7 @@

<% if current_user and @user.id == current_user.id %>
- <% if @user.home_lat.nil? or @user.home_lon.nil? %> + <% if !@user.has_home? %>

<%= t(".no_home_location_html", :edit_profile_link => link_to(t(".edit_your_profile"), edit_profile_path)) %>

diff --git a/app/views/layouts/map.html.erb b/app/views/layouts/map.html.erb index 6d983d30e..40f06a899 100644 --- a/app/views/layouts/map.html.erb +++ b/app/views/layouts/map.html.erb @@ -4,7 +4,7 @@ <% content_for(:body_class) { "map-layout" } %> -<% if current_user and !current_user.home_lon.nil? and !current_user.home_lat.nil? %> +<% if current_user&.has_home? %> <% content_for :greeting do %> <%= link_to t("layouts.home"), "#", diff --git a/app/views/profiles/edit.html.erb b/app/views/profiles/edit.html.erb index 5bf7426f2..cac657ff1 100644 --- a/app/views/profiles/edit.html.erb +++ b/app/views/profiles/edit.html.erb @@ -42,13 +42,18 @@
<%= t ".home location" -%> -

hidden<% end %>><%= t ".no home location" %>

+

<%= t ".no home location" %>

<%= f.text_field :home_lat, :wrapper_class => "col-sm-4", :id => "home_lat" %> <%= f.text_field :home_lon, :wrapper_class => "col-sm-4", :id => "home_lon" %> +
+ + + +
- checked="checked" <% end %> id="updatehome" /> + checked <% end %> id="updatehome" />
<%= tag.div "", :id => "map", :class => "content_map set_location border border-grey rounded" %> diff --git a/config/locales/en.yml b/config/locales/en.yml index c05b92d44..e14c5806c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1754,6 +1754,9 @@ en: home location: "Home Location" no home location: "You have not entered your home location." update home location on click: "Update home location when I click on the map?" + show: "Show" + delete: "Delete" + undelete: "Undo delete" update: success: Profile updated. failure: Couldn't update profile.