1 OSM.Export = function (map) {
4 const locationFilter = new L.LocationFilter({
7 }).on("change", update);
10 return L.latLngBounds(
11 L.latLng($("#minlat").val(), $("#minlon").val()),
12 L.latLng($("#maxlat").val(), $("#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 function setBounds(bounds) {
39 const truncated = [bounds.getSouthWest(), bounds.getNorthEast()]
40 .map(c => OSM.cropLocation(c, map.getZoom()));
41 $("#minlon").val(truncated[0][1]);
42 $("#minlat").val(truncated[0][0]);
43 $("#maxlon").val(truncated[1][1]);
44 $("#maxlat").val(truncated[1][0]);
46 $("#export_overpass").attr("href",
47 "https://overpass-api.de/api/map?bbox=" +
48 truncated.map(p => p.reverse()).join());
51 function validateControls() {
52 $("#export_osm_too_large").toggle(getBounds().getSize() > OSM.MAX_REQUEST_AREA);
53 $("#export_commit").toggle(getBounds().getSize() < OSM.MAX_REQUEST_AREA);
56 function checkSubmit(e) {
57 if (getBounds().getSize() > OSM.MAX_REQUEST_AREA) e.preventDefault();
60 page.pushstate = page.popstate = function (path) {
61 OSM.loadSidebarContent(path, page.load);
64 page.load = function () {
66 .addLayer(locationFilter)
67 .on("moveend", update);
69 $("#maxlat, #minlon, #maxlon, #minlat").change(boundsChanged);
70 $("#drag_box").click(enableFilter);
71 $(".export_form").on("submit", checkSubmit);
73 function downloadBlob(blob, filename) {
74 const url = URL.createObjectURL(blob);
75 const a = document.createElement("a");
77 a.download = filename;
78 document.body.appendChild(a);
80 document.body.removeChild(a);
81 URL.revokeObjectURL(url);
84 async function handleExportSuccess(fetchResponse) {
86 const blob = await fetchResponse.response.blob();
87 downloadBlob(blob, "map.osm");
89 // eslint-disable-next-line no-alert
90 alert(OSM.i18n.t("javascripts.share.export_failed", { reason: "(blob error)" }));
94 async function handleExportError(event) {
97 detailMessage = event?.detail?.error?.message;
99 const responseText = await event.detail.fetchResponse.responseText;
100 const parser = new DOMParser();
101 const doc = parser.parseFromString(responseText, "text/html");
102 detailMessage = doc.body ? doc.body.textContent.trim() : "(unknown)";
105 detailMessage = "(unknown)";
107 // eslint-disable-next-line no-alert
108 alert(OSM.i18n.t("javascripts.share.export_failed", { reason: detailMessage }));
111 document.querySelector(".export_form").addEventListener("turbo:submit-end", function (event) {
112 if (event.detail.success) {
113 handleExportSuccess(event.detail.fetchResponse);
115 handleExportError(event);
119 document.querySelector(".export_form").addEventListener("turbo:before-fetch-request", function (event) {
120 event.detail.fetchOptions.headers.Accept = "application/xml";
124 return map.getState();
127 page.unload = function () {
129 .removeLayer(locationFilter)
130 .off("moveend", update);