Files
grecia/app/assets/javascripts/map.js
Javi Martín af6a494344 Apply JavaScript rule to use the dot notation
We were using the dot notation in most places, but not everywhere.
2019-09-11 14:03:24 +02:00

132 lines
5.0 KiB
JavaScript

(function() {
"use strict";
App.Map = {
initialize: function() {
$("*[data-map]").each(function() {
App.Map.initializeMap(this);
});
$(".js-toggle-map").on({
click: function() {
App.Map.toggleMap();
}
});
},
initializeMap: function(element) {
var addMarkerInvestments, clearFormfields, createMarker, editable, getPopupContent, latitudeInputSelector, longitudeInputSelector, map, mapAttribution, mapCenterLatLng, mapCenterLatitude, mapCenterLongitude, mapTilesProvider, marker, markerIcon, markerLatitude, markerLongitude, moveOrPlaceMarker, openMarkerPopup, removeMarker, removeMarkerSelector, updateFormfields, zoom, zoomInputSelector;
App.Map.cleanInvestmentCoordinates(element);
mapCenterLatitude = $(element).data("map-center-latitude");
mapCenterLongitude = $(element).data("map-center-longitude");
markerLatitude = $(element).data("marker-latitude");
markerLongitude = $(element).data("marker-longitude");
zoom = $(element).data("map-zoom");
mapTilesProvider = $(element).data("map-tiles-provider");
mapAttribution = $(element).data("map-tiles-provider-attribution");
latitudeInputSelector = $(element).data("latitude-input-selector");
longitudeInputSelector = $(element).data("longitude-input-selector");
zoomInputSelector = $(element).data("zoom-input-selector");
removeMarkerSelector = $(element).data("marker-remove-selector");
addMarkerInvestments = $(element).data("marker-investments-coordinates");
editable = $(element).data("marker-editable");
marker = null;
markerIcon = L.divIcon({
className: "map-marker",
iconSize: [30, 30],
iconAnchor: [15, 40],
html: '<div class="map-icon"></div>'
});
createMarker = function(latitude, longitude) {
var markerLatLng;
markerLatLng = new L.LatLng(latitude, longitude);
marker = L.marker(markerLatLng, {
icon: markerIcon,
draggable: editable
});
if (editable) {
marker.on("dragend", updateFormfields);
}
marker.addTo(map);
return marker;
};
removeMarker = function(e) {
e.preventDefault();
if (marker) {
map.removeLayer(marker);
marker = null;
}
clearFormfields();
};
moveOrPlaceMarker = function(e) {
if (marker) {
marker.setLatLng(e.latlng);
} else {
marker = createMarker(e.latlng.lat, e.latlng.lng);
}
updateFormfields();
};
updateFormfields = function() {
$(latitudeInputSelector).val(marker.getLatLng().lat);
$(longitudeInputSelector).val(marker.getLatLng().lng);
$(zoomInputSelector).val(map.getZoom());
};
clearFormfields = function() {
$(latitudeInputSelector).val("");
$(longitudeInputSelector).val("");
$(zoomInputSelector).val("");
};
openMarkerPopup = function(e) {
marker = e.target;
$.ajax("/investments/" + marker.options.id + "/json_data", {
type: "GET",
dataType: "json",
success: function(data) {
e.target.bindPopup(getPopupContent(data)).openPopup();
}
});
};
getPopupContent = function(data) {
return "<a href='/budgets/" + data.budget_id + "/investments/" + data.investment_id + "'>" + data.investment_title + "</a>";
};
mapCenterLatLng = new L.LatLng(mapCenterLatitude, mapCenterLongitude);
map = L.map(element.id).setView(mapCenterLatLng, zoom);
L.tileLayer(mapTilesProvider, {
attribution: mapAttribution
}).addTo(map);
if (markerLatitude && markerLongitude && !addMarkerInvestments) {
marker = createMarker(markerLatitude, markerLongitude);
}
if (editable) {
$(removeMarkerSelector).on("click", removeMarker);
map.on("zoomend", updateFormfields);
map.on("click", moveOrPlaceMarker);
}
if (addMarkerInvestments) {
addMarkerInvestments.forEach(function(coordinates) {
if (App.Map.validCoordinates(coordinates)) {
marker = createMarker(coordinates.lat, coordinates.long);
marker.options.id = coordinates.investment_id;
marker.on("click", openMarkerPopup);
}
});
}
},
toggleMap: function() {
$(".map").toggle();
$(".js-location-map-remove-marker").toggle();
},
cleanInvestmentCoordinates: function(element) {
var clean_markers, markers;
markers = $(element).attr("data-marker-investments-coordinates");
if (markers != null) {
clean_markers = markers.replace(/-?(\*+)/g, null);
$(element).attr("data-marker-investments-coordinates", clean_markers);
}
},
validCoordinates: function(coordinates) {
return App.Map.isNumeric(coordinates.lat) && App.Map.isNumeric(coordinates.long);
},
isNumeric: function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
};
}).call(this);