]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index_modules/changeset.js
Merge remote-tracking branch 'upstream/pull/7487'
[rails.git] / app / assets / javascripts / index_modules / changeset.js
1 export default function (map) {
2   const content = $("#sidebar_content");
3
4   content.on("turbo:before-frame-render", "turbo-frame", function () {
5     $(this).find(".numbered_pagination").trigger("numbered_pagination:disable");
6   });
7
8   content.on("turbo:frame-render", "turbo-frame", function () {
9     $(this).find(".numbered_pagination").trigger("numbered_pagination:enable");
10   });
11
12   return {
13     load(path) {
14       OSM.loadSidebarContent(path)
15         .then(this.init);
16     },
17
18     init() {
19       const changesetData = content.find("[data-changeset]").data("changeset");
20       changesetData.type = "changeset";
21
22       const hashParams = OSM.parseHash();
23       content.find("button[data-method][data-url]").on("click", function (e) {
24         e.preventDefault();
25         const { method, url } = $(e.target).data();
26         const data = new URLSearchParams();
27
28         content.find("#comment-error").prop("hidden", true);
29         content.find("button[data-method][data-url]").prop("disabled", true);
30
31         if (e.target.name === "comment") {
32           data.set("text", content.find("textarea").val());
33         }
34
35         fetch(url, {
36           method: method,
37           headers: { ...OSM.oauth },
38           body: data
39         })
40           .then(response => {
41             if (response.ok) return response;
42             return response.text().then(text => {
43               throw new Error(text);
44             });
45           })
46           .then(() => OSM.loadSidebarContent(location.pathname))
47           .then(this.init)
48           .catch(error => {
49             content.find("button[data-method][data-url]").prop("disabled", false);
50             content.find("#comment-error")
51               .text(error.message)
52               .prop("hidden", false)
53               .get(0).scrollIntoView({ block: "nearest" });
54           });
55       });
56
57       content.find("textarea").on("input", function (e) {
58         const form = e.target.form,
59               disabled = $(e.target).val() === "";
60         form.comment.disabled = disabled;
61       });
62
63       content.find("textarea").val("").trigger("input");
64       map.addObject(changesetData, function (bounds) {
65         if (!hashParams.center && bounds.isValid()) {
66           OSM.router.withoutMoveListener(function () {
67             map.fitBounds(bounds);
68           });
69         }
70       });
71       $(".numbered_pagination").trigger("numbered_pagination:enable");
72     },
73
74     unload() {
75       map.removeObject();
76       $(".numbered_pagination").trigger("numbered_pagination:disable");
77     }
78   };
79 }