Files
grecia/app/components/shared/map_location_component.rb
Javi Martín 99696cb302 Add aria-label to markers in admin map settings
We forgot to do so in commit b896fc4bb. Back then, we said:

> Note that we aren't providing a proper aria-label for markers on the
> map we use in the form to create a proposal or an investment. Adding
> one isn't trivial given the current code, and keyboard users can't add
> a marker in the first place. We'll have to revisit this issue when we
> add keyboard support for this.

However, in the admin section, the marker is already there, so it should
have a label. In this case, we're using the coordinates as label because
it's the most relevant text for the marker in the context of a form. We
could also use "Default map location" instead, but that information is
already present on the page.

Axe was reporting the same accessibility error we mentioned in commit
b896fc4bb in this situation.
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: map_location.title.presence || 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