]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/history.js
Merge remote-tracking branch 'upstream/pull/4359'
[rails.git] / app / assets / javascripts / index / history.js
1 //= require jquery-simulate/jquery.simulate
2
3 OSM.History = function (map) {
4   var page = {};
5
6   $("#sidebar_content")
7     .on("click", ".changeset_more a", loadMore)
8     .on("mouseover", "[data-changeset]", function () {
9       highlightChangeset($(this).data("changeset").id);
10     })
11     .on("mouseout", "[data-changeset]", function () {
12       unHighlightChangeset($(this).data("changeset").id);
13     });
14
15   var group = L.featureGroup()
16     .on("mouseover", function (e) {
17       highlightChangeset(e.layer.id);
18     })
19     .on("mouseout", function (e) {
20       unHighlightChangeset(e.layer.id);
21     })
22     .on("click", function (e) {
23       clickChangeset(e.layer.id, e.originalEvent);
24     });
25
26   group.getLayerId = function (layer) {
27     return layer.id;
28   };
29
30   function highlightChangeset(id) {
31     var layer = group.getLayer(id);
32     if (layer) layer.setStyle({ fillOpacity: 0.3, color: "#FF6600", weight: 3 });
33     $("#changeset_" + id).addClass("selected");
34   }
35
36   function unHighlightChangeset(id) {
37     var layer = group.getLayer(id);
38     if (layer) layer.setStyle({ fillOpacity: 0, color: "#FF9500", weight: 2 });
39     $("#changeset_" + id).removeClass("selected");
40   }
41
42   function clickChangeset(id, e) {
43     $("#changeset_" + id).find("a.changeset_id").simulate("click", e);
44   }
45
46   function displayFirstChangesets(html) {
47     $("#sidebar_content .changesets").html(html);
48   }
49
50   function displayMoreChangesets(html) {
51     $("#sidebar_content .changeset_more").replaceWith(html);
52     var oldList = $("#sidebar_content .changesets ol").first();
53     var newList = oldList.next("ol");
54     newList.children().appendTo(oldList);
55     newList.remove();
56   }
57
58   function update() {
59     const data = new URLSearchParams();
60
61     if (window.location.pathname === "/history") {
62       data.set("bbox", map.getBounds().wrap().toBBoxString());
63       var feedLink = $("link[type=\"application/atom+xml\"]"),
64           feedHref = feedLink.attr("href").split("?")[0];
65       feedLink.attr("href", feedHref + "?" + data);
66     }
67
68     data.set("list", "1");
69
70     fetch(window.location.pathname + "?" + data)
71       .then(response => response.text())
72       .then(function (html) {
73         displayFirstChangesets(html);
74         updateMap();
75       });
76   }
77
78   function loadMore(e) {
79     e.preventDefault();
80     e.stopPropagation();
81
82     var div = $(this).parents(".changeset_more");
83
84     $(this).hide();
85     div.find(".loader").show();
86
87     $.get($(this).attr("href"), function (html) {
88       displayMoreChangesets(html);
89       updateMap();
90     });
91   }
92
93   var changesets = [];
94
95   function updateBounds() {
96     group.clearLayers();
97
98     for (const changeset of changesets) {
99       var bottomLeft = map.project(L.latLng(changeset.bbox.minlat, changeset.bbox.minlon)),
100           topRight = map.project(L.latLng(changeset.bbox.maxlat, changeset.bbox.maxlon)),
101           width = topRight.x - bottomLeft.x,
102           height = bottomLeft.y - topRight.y,
103           minSize = 20; // Min width/height of changeset in pixels
104
105       if (width < minSize) {
106         bottomLeft.x -= ((minSize - width) / 2);
107         topRight.x += ((minSize - width) / 2);
108       }
109
110       if (height < minSize) {
111         bottomLeft.y += ((minSize - height) / 2);
112         topRight.y -= ((minSize - height) / 2);
113       }
114
115       changeset.bounds = L.latLngBounds(map.unproject(bottomLeft),
116                                         map.unproject(topRight));
117     }
118
119     changesets.sort(function (a, b) {
120       return b.bounds.getSize() - a.bounds.getSize();
121     });
122
123     for (const changeset of changesets) {
124       const rect = L.rectangle(changeset.bounds,
125                                { weight: 2, color: "#FF9500", opacity: 1, fillColor: "#FFFFAF", fillOpacity: 0 });
126       rect.id = changeset.id;
127       rect.addTo(group);
128     }
129   }
130
131   function updateMap() {
132     changesets = $("[data-changeset]").map(function (index, element) {
133       return $(element).data("changeset");
134     }).get().filter(function (changeset) {
135       return changeset.bbox;
136     });
137
138     updateBounds();
139
140     if (window.location.pathname !== "/history") {
141       var bounds = group.getBounds();
142       if (bounds.isValid()) map.fitBounds(bounds);
143     }
144   }
145
146   page.pushstate = page.popstate = function (path) {
147     OSM.loadSidebarContent(path, page.load);
148   };
149
150   page.load = function () {
151     map.addLayer(group);
152
153     if (window.location.pathname === "/history") {
154       map.on("moveend", update);
155     }
156
157     map.on("zoomend", updateBounds);
158
159     update();
160   };
161
162   page.unload = function () {
163     map.removeLayer(group);
164     map.off("moveend", update);
165     map.off("zoomend", updateBounds);
166   };
167
168   return page;
169 };