From bba03583049df7e52c74ec67fe8d0533b16f9ec6 Mon Sep 17 00:00:00 2001 From: mmd-osm Date: Sat, 26 Jul 2025 20:53:13 +0200 Subject: [PATCH] Refactor map download functions --- app/assets/javascripts/download_util.js | 53 ++++++++++++++++++++++ app/assets/javascripts/index/export.js | 58 ++++--------------------- app/assets/javascripts/leaflet.share.js | 50 +++------------------ 3 files changed, 67 insertions(+), 94 deletions(-) create mode 100644 app/assets/javascripts/download_util.js diff --git a/app/assets/javascripts/download_util.js b/app/assets/javascripts/download_util.js new file mode 100644 index 000000000..21b7cc246 --- /dev/null +++ b/app/assets/javascripts/download_util.js @@ -0,0 +1,53 @@ +(function () { + OSM.downloadBlob = function (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); + }; + + class DownloadUtil { + static async handleExportSuccess(fetchResponse, filename) { + try { + const blob = await fetchResponse.response.blob(); + OSM.downloadBlob(blob, filename); + } catch (err) { + // eslint-disable-next-line no-alert + alert(OSM.i18n.t("javascripts.share.export_failed", { reason: "(blob error)" })); + } + } + + static async 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 })); + } + + static getTurboBlobHandler(filename) { + return function (event) { + if (event.detail.success) { + DownloadUtil.handleExportSuccess(event.detail.fetchResponse, filename); + } else { + DownloadUtil.handleExportError(event); + } + }; + } + } + + OSM.getTurboBlobHandler = DownloadUtil.getTurboBlobHandler; +}()); diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index 8fd361bb3..21a6435dc 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -1,3 +1,5 @@ +//= require download_util + OSM.Export = function (map) { const page = {}; @@ -70,55 +72,13 @@ 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"; - }); + document.querySelector(".export_form") + .addEventListener("turbo:submit-end", OSM.getTurboBlobHandler("map.osm")); + + 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/assets/javascripts/leaflet.share.js b/app/assets/javascripts/leaflet.share.js index d30acd042..a3af7263e 100644 --- a/app/assets/javascripts/leaflet.share.js +++ b/app/assets/javascripts/leaflet.share.js @@ -1,3 +1,5 @@ +//= require download_util + L.OSM.share = function (options) { const control = L.OSM.sidebarPane(options, "share", "javascripts.share.title", "javascripts.share.title"), marker = L.marker([0, 0], { draggable: true, icon: OSM.getMarker({ color: "var(--marker-blue)" }) }), @@ -28,52 +30,10 @@ L.OSM.share = function (options) { const csrfInput = $ui.find("#csrf_export")[0]; [[csrfInput.name, csrfInput.value]] = Object.entries(OSM.csrf); - 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(); - const filename = OSM.i18n.t("javascripts.share.filename"); - downloadBlob(blob, filename); - } 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.getElementById("export-image").addEventListener("turbo:submit-end", function (event) { - if (event.detail.success) { - handleExportSuccess(event.detail.fetchResponse); - } else { - handleExportError(event); - } - }); + document.getElementById("export-image") + .addEventListener("turbo:submit-end", + OSM.getTurboBlobHandler(OSM.i18n.t("javascripts.share.filename"))); document.getElementById("export-image").addEventListener("turbo:before-fetch-response", function (event) { const response = event.detail.fetchResponse.response; -- 2.39.5