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