From 5dabf6681c3a0b59ed04926cd5d13ad20feba298 Mon Sep 17 00:00:00 2001 From: mmd-osm Date: Sat, 26 Jul 2025 13:33:17 +0200 Subject: [PATCH] Map XML download with Turbo --- app/assets/javascripts/index/export.js | 50 ++++++++++++++++++++++++++ app/views/site/export.html.erb | 4 +-- config/locales/en.yml | 1 + 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index 05d90381b..8fd361bb3 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -70,6 +70,56 @@ OSM.Export = function (map) { $("#drag_box").click(enableFilter); $(".export_form").on("submit", checkSubmit); + function downloadBlob(blob, filename) { + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } + + async function handleExportSuccess(fetchResponse) { + try { + const blob = await fetchResponse.response.blob(); + downloadBlob(blob, "map.osm"); + } catch (err) { + // eslint-disable-next-line no-alert + alert(OSM.i18n.t("javascripts.share.export_failed", { reason: "(blob error)" })); + } + } + + async function handleExportError(event) { + let detailMessage; + try { + detailMessage = event?.detail?.error?.message; + if (!detailMessage) { + const responseText = await event.detail.fetchResponse.responseText; + const parser = new DOMParser(); + const doc = parser.parseFromString(responseText, "text/html"); + detailMessage = doc.body ? doc.body.textContent.trim() : "(unknown)"; + } + } catch (err) { + detailMessage = "(unknown)"; + } + // eslint-disable-next-line no-alert + alert(OSM.i18n.t("javascripts.share.export_failed", { reason: detailMessage })); + } + + document.querySelector(".export_form").addEventListener("turbo:submit-end", function (event) { + if (event.detail.success) { + handleExportSuccess(event.detail.fetchResponse); + } else { + handleExportError(event); + } + }); + + document.querySelector(".export_form").addEventListener("turbo:before-fetch-request", function (event) { + event.detail.fetchOptions.headers.Accept = "application/xml"; + }); + update(); return map.getState(); }; diff --git a/app/views/site/export.html.erb b/app/views/site/export.html.erb index 248fea8cd..5978f992a 100644 --- a/app/views/site/export.html.erb +++ b/app/views/site/export.html.erb @@ -2,7 +2,7 @@ <%= render "sidebar_header", :title => t(".title") %> -<%= form_tag({ :controller => "export", :action => "finish" }, { :class => "export_form" }) do %> +<%= form_tag({ :controller => "export", :action => "finish" }, :class => "export_form", :data => { "turbo" => true }) do %> <%= hidden_field_tag "format", "osm", :autocomplete => "off" %>
@@ -28,7 +28,7 @@
- <%= submit_tag t(".export_button"), :class => "btn btn-primary mx-auto" %> + <%= submit_tag t(".export_button"), :class => "btn btn-primary mx-auto", :data => { "turbo-submits-with" => t(".export_download") } %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 0fb9f9e18..ac3ff3932 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2498,6 +2498,7 @@ en: title: "Other Sources" description: "Additional sources listed on the OpenStreetMap Wiki" export_button: "Export" + export_download: "Downloading..." fixthemap: title: Report a problem / Fix the map how_to_help: -- 2.39.5