]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/leaflet.key.js
Create Leaflet sidebar pane control with header writer fn
[rails.git] / app / assets / javascripts / leaflet.key.js
1 L.OSM.key = function (options) {
2   var control = L.OSM.sidebarPane(options);
3
4   control.onAdd = function (map) {
5     var $container = $("<div>")
6       .attr("class", "control-key");
7
8     var button = $("<a>")
9       .attr("class", "control-button")
10       .attr("href", "#")
11       .html("<span class=\"icon key\"></span>")
12       .on("click", toggle)
13       .appendTo($container);
14
15     var $ui = this.makeUI("key-ui", "javascripts.key.title", toggle);
16
17     var $section = $("<div>")
18       .attr("class", "section")
19       .appendTo($ui);
20
21     options.sidebar.addPane($ui);
22
23     $ui
24       .on("show", shown)
25       .on("hide", hidden);
26
27     map.on("baselayerchange", updateButton);
28
29     updateButton();
30
31     function shown() {
32       map.on("zoomend baselayerchange", update);
33       $section.load("/key", update);
34     }
35
36     function hidden() {
37       map.off("zoomend baselayerchange", update);
38     }
39
40     function toggle(e) {
41       e.stopPropagation();
42       e.preventDefault();
43       if (!button.hasClass("disabled")) {
44         options.sidebar.togglePane($ui, button);
45       }
46       $(".leaflet-control .control-button").tooltip("hide");
47     }
48
49     function updateButton() {
50       var disabled = ["mapnik", "cyclemap"].indexOf(map.getMapBaseLayerId()) === -1;
51       button
52         .toggleClass("disabled", disabled)
53         .attr("data-bs-original-title",
54               I18n.t(disabled ?
55                 "javascripts.key.tooltip_disabled" :
56                 "javascripts.key.tooltip"));
57     }
58
59     function update() {
60       var layer = map.getMapBaseLayerId(),
61           zoom = map.getZoom();
62
63       $(".mapkey-table-entry").each(function () {
64         var data = $(this).data();
65         if (layer === data.layer && zoom >= data.zoomMin && zoom <= data.zoomMax) {
66           $(this).show();
67         } else {
68           $(this).hide();
69         }
70       });
71     }
72
73     return $container[0];
74   };
75
76   return control;
77 };