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