]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index_modules/note.js
Simplify page state management
[rails.git] / app / assets / javascripts / index_modules / note.js
1 export default function (map) {
2   const content = $("#sidebar_content"),
3         page = {};
4
5   page.load = function (path, id) {
6     OSM.loadSidebarContent(path).then(function () {
7       const data = $(".details").data();
8       if (!data) return;
9       const [lat, lng] = data.coordinates.split(",").map(parseFloat);
10       initialize(path, id, map.getBounds().contains({ lat, lng }));
11     });
12   };
13
14   page.init = function (path, id) {
15     initialize(path, id);
16   };
17
18   function initialize(path, id, skipMoveToNote) {
19     content.find("button[name]").on("click", function (e) {
20       e.preventDefault();
21       const { url, method } = $(e.target).data(),
22             name = $(e.target).attr("name"),
23             data = new URLSearchParams();
24       content.find("button[name]").prop("disabled", true);
25
26       if (name !== "subscribe" && name !== "unsubscribe") {
27         const textarea = content.find("textarea");
28         if (textarea.length) {
29           data.set("text", textarea.val());
30         }
31       }
32
33       fetch(url, {
34         method: method,
35         headers: { ...OSM.oauth },
36         body: data
37       })
38         .then(response => {
39           if (response.ok) return response;
40           return response.text().then(text => {
41             throw new Error(text || `HTTP Error ${response.status} ${response.statusText}`);
42           });
43         })
44         .then(() => OSM.loadSidebarContent(path))
45         .then(() => initialize(path, id, false))
46         .catch(error => {
47           content.find("#comment-error")
48             .text(error.message)
49             .prop("hidden", false)
50             .get(0).scrollIntoView({ block: "nearest" });
51           updateButtons();
52         });
53     });
54
55     content.find("textarea").on("input", function (e) {
56       updateButtons(e.target.form);
57     });
58
59     content.find("textarea").val("").trigger("input");
60
61     const data = $(".details").data();
62
63     if (data) {
64       const hashParams = OSM.parseHash();
65       map.addObject({
66         type: "note",
67         id: parseInt(id, 10),
68         latLng: L.latLng(data.coordinates.split(",")),
69         icon: OSM.noteMarkers[data.status]
70       }, function () {
71         if (!hashParams.center && !skipMoveToNote) {
72           const latLng = L.latLng(data.coordinates.split(","));
73           OSM.router.withoutMoveListener(function () {
74             map.setView(latLng, 15, { reset: true });
75           });
76         }
77       });
78     }
79   }
80
81   function updateButtons() {
82     const resolveButton = content.find("button[name='close']");
83     const commentButton = content.find("button[name='comment']");
84
85     content.find("button[name]").prop("disabled", false);
86     if (content.find("textarea").val() === "") {
87       resolveButton.text(resolveButton.data("defaultActionText"));
88       commentButton.prop("disabled", true);
89     } else {
90       resolveButton.text(resolveButton.data("commentActionText"));
91     }
92   }
93
94   page.unload = function () {
95     map.removeObject();
96   };
97
98   return page;
99 }