]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/layers/notes.js
Merge remote-tracking branch 'upstream/pull/5064'
[rails.git] / app / assets / javascripts / index / layers / notes.js
1 OSM.initializeNotesLayer = function (map) {
2   let noteLoader;
3   const noteLayer = map.noteLayer;
4   let notes = {};
5
6   var noteIcons = {
7     "new": L.icon({
8       iconUrl: OSM.NEW_NOTE_MARKER,
9       iconSize: [25, 40],
10       iconAnchor: [12, 40]
11     }),
12     "open": L.icon({
13       iconUrl: OSM.OPEN_NOTE_MARKER,
14       iconSize: [25, 40],
15       iconAnchor: [12, 40]
16     }),
17     "closed": L.icon({
18       iconUrl: OSM.CLOSED_NOTE_MARKER,
19       iconSize: [25, 40],
20       iconAnchor: [12, 40]
21     })
22   };
23
24   noteLayer.on("add", () => {
25     loadNotes();
26     map.on("moveend", loadNotes);
27     map.fire("overlayadd", { layer: noteLayer });
28   }).on("remove", () => {
29     if (noteLoader) noteLoader.abort();
30     noteLoader = null;
31     map.off("moveend", loadNotes);
32     noteLayer.clearLayers();
33     notes = {};
34     map.fire("overlayremove", { layer: noteLayer });
35   }).on("click", function (e) {
36     if (e.layer.id) {
37       OSM.router.route("/note/" + e.layer.id);
38     }
39   });
40
41   function updateMarker(old_marker, feature) {
42     var marker = old_marker;
43     if (marker) {
44       marker.setIcon(noteIcons[feature.properties.status]);
45     } else {
46       let title;
47       const description = feature.properties.comments[0];
48
49       if (description?.action === "opened") {
50         title = description.text;
51       }
52
53       marker = L.marker(feature.geometry.coordinates.reverse(), {
54         icon: noteIcons[feature.properties.status],
55         title,
56         opacity: 0.8,
57         interactive: true
58       });
59       marker.id = feature.properties.id;
60       marker.addTo(noteLayer);
61     }
62     return marker;
63   }
64
65   noteLayer.getLayerId = function (marker) {
66     return marker.id;
67   };
68
69   function loadNotes() {
70     var bounds = map.getBounds();
71     var size = bounds.getSize();
72
73     if (size <= OSM.MAX_NOTE_REQUEST_AREA) {
74       var url = "/api/" + OSM.API_VERSION + "/notes.json?bbox=" + bounds.toBBoxString();
75
76       if (noteLoader) noteLoader.abort();
77
78       noteLoader = $.ajax({
79         url: url,
80         success: success
81       });
82     }
83
84     function success(json) {
85       var oldNotes = notes;
86       notes = {};
87       json.features.forEach(updateMarkers);
88
89       function updateMarkers(feature) {
90         var marker = oldNotes[feature.properties.id];
91         delete oldNotes[feature.properties.id];
92         notes[feature.properties.id] = updateMarker(marker, feature);
93       }
94
95       for (var id in oldNotes) {
96         noteLayer.removeLayer(oldNotes[id]);
97       }
98
99       noteLoader = null;
100     }
101   }
102 };