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