Files
nairobi/app/components/shared/map_location_component.rb
Javi Martín 288f62cdd2 Use coordinates as marker labels when there's only one mappable
When editing/showing a proposal or an investment, the most relevant
information regarding the marker are the coordinates. The title of the
proposal or investment is redundant because we already know the marker
is about that proposal/investment.

There's one problem with this approach, though: when editing a proposal
or an investment, the aria-label of the marker isn't updated
automatically when we move the marker to a different place. This
behaviour will only affect people who use both a screen reader and a
mouse, since keyboard users can't change the position of the marker in
the first place. We'll deal with this issue when we make it possible to
change the position of a marker using the keyboard.
2025-11-17 15:39:36 +01:00

95 lines
2.5 KiB
Ruby

class Shared::MapLocationComponent < ApplicationComponent
attr_reader :investments_coordinates, :form, :geozones_data
def initialize(map_location, investments_coordinates: nil, form: nil, geozones_data: nil)
@map_location = map_location
@investments_coordinates = investments_coordinates
@form = form
@geozones_data = geozones_data
end
def map_location
@map_location ||= MapLocation.new
end
private
def editable?
form.present?
end
def show_remove_marker_button?
editable? && map_location.mappable.present?
end
def latitude
map_location.latitude.presence || Setting["map.latitude"]
end
def longitude
map_location.longitude.presence || Setting["map.longitude"]
end
def zoom
map_location.zoom.presence || Setting["map.zoom"]
end
def remove_marker_label
t("proposals.form.map_remove_marker")
end
def remove_marker_id
"remove-marker-#{dom_id(map_location)}"
end
def remove_marker
button_tag remove_marker_label,
id: remove_marker_id,
class: "map-location-remove-marker",
type: "button"
end
def data
{
map: "",
map_center_latitude: latitude,
map_center_longitude: longitude,
map_zoom: zoom,
map_tiles_provider: Rails.application.secrets.map_tiles_provider,
map_tiles_provider_attribution: Rails.application.secrets.map_tiles_provider_attribution,
marker_editable: editable?,
marker_remove_selector: "##{remove_marker_id}",
marker_investments_coordinates: investments_coordinates,
marker_latitude: map_location.latitude.presence,
marker_longitude: map_location.longitude.presence,
marker_title: marker_coordinates_text,
marker_clustering: feature?("map.feature.marker_clustering"),
geozones: geozones_data
}.merge(input_selectors)
end
def marker_coordinates_text
return unless map_location.available?
t("proposals.form.map_marker_coordinates",
latitude: map_location.latitude,
longitude: map_location.longitude)
end
def input_selectors
if form
{
latitude_input_selector: "##{input_id(:latitude)}",
longitude_input_selector: "##{input_id(:longitude)}",
zoom_input_selector: "##{input_id(:zoom)}"
}
else
{}
end
end
def input_id(attribute)
form.hidden_field(attribute).match(/ id="([^"]+)"/)[1]
end
end