1 //= require download_util
3 export default function (map) {
4 const locationFilter = new L.LocationFilter({
7 }).on("change", update);
10 return L.latLngBounds(
11 { lat: $("#minlat").val(), lng: $("#minlon").val() },
12 { lat: $("#maxlat").val(), lng: $("#maxlon").val() });
15 function boundsChanged() {
16 const bounds = getBounds();
17 map.fitBounds(bounds);
18 locationFilter.setBounds(bounds);
19 locationFilter.enable();
23 function enableFilter(e) {
26 $("#drag_box").hide();
28 locationFilter.setBounds(map.getBounds().pad(-0.2));
29 locationFilter.enable();
34 setBounds(locationFilter.isEnabled() ? locationFilter.getBounds() : map.getBounds());
38 async function showConfirmationModal() {
39 const $modal = $("#export_confirmation");
40 const $downloadButton = $modal.find("[data-action=\"download\"]");
41 $modal.appendTo("body").modal("show");
43 return new Promise(resolve => {
44 const onOkClick = () => {
49 const onModalHidden = () => {
50 $downloadButton.off("click", onOkClick);
51 $modal.off("hidden.bs.modal", onModalHidden);
55 $downloadButton.on("click", onOkClick);
56 $modal.on("hidden.bs.modal", onModalHidden);
60 function setBounds(bounds) {
61 const sw = OSM.cropLocation(bounds.getSouthWest(), map.getZoom());
62 $("#minlon").val(sw.lng);
63 $("#minlat").val(sw.lat);
64 const ne = OSM.cropLocation(bounds.getNorthEast(), map.getZoom());
65 $("#maxlon").val(ne.lng);
66 $("#maxlat").val(ne.lat);
68 $("#export_overpass").prop("search", `?bbox=${sw.lng},${sw.lat},${ne.lng},${ne.lat}`);
71 function validateControls() {
72 $("#export_osm_too_large").toggle(getBounds().getSize() > OSM.MAX_REQUEST_AREA);
73 $("#export_commit").toggle(getBounds().getSize() < OSM.MAX_REQUEST_AREA);
76 function checkSubmit(e) {
77 if (getBounds().getSize() > OSM.MAX_REQUEST_AREA) e.preventDefault();
82 OSM.loadSidebarContent(path)
88 .addLayer(locationFilter)
89 .on("moveend", update);
91 $("#maxlat, #minlon, #maxlon, #minlat").change(boundsChanged);
92 $("#drag_box").click(enableFilter);
93 $(".export_form").on("submit", checkSubmit);
95 document.querySelector(".export_form")
96 .addEventListener("turbo:submit-end", OSM.getTurboBlobHandler("map.osm"));
98 document.querySelector(".export_form")
99 .addEventListener("turbo:before-fetch-response", OSM.turboHtmlResponseHandler);
101 document.querySelector(".export_form")
102 .addEventListener("turbo:before-fetch-request", function (event) {
103 event.detail.fetchOptions.headers.Accept = "application/xml";
106 $("#export_overpass").on("click", async function (event) {
107 event.preventDefault();
108 const downloadUrl = $(this).attr("href");
109 const confirmed = await showConfirmationModal();
111 window.location.href = downloadUrl;
116 return map.getState();
121 .removeLayer(locationFilter)
122 .off("moveend", update);