leaflet-rails 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.travis.yml +15 -0
- data/Gemfile +3 -0
- data/LICENSE +3 -1
- data/README.md +80 -1
- data/Rakefile +5 -0
- data/leaflet-rails.gemspec +9 -5
- data/lib/leaflet-rails.rb +12 -1
- data/lib/leaflet-rails/version.rb +1 -1
- data/lib/leaflet-rails/view_helpers.rb +33 -0
- data/spec/spec_helper.rb +43 -0
- data/spec/view_helpers_spec.rb +99 -0
- data/vendor/assets/images/layers-2x.png +0 -0
- data/vendor/assets/images/layers.png +0 -0
- data/vendor/assets/images/marker-icon-2x.png +0 -0
- data/vendor/assets/images/marker-icon.png +0 -0
- data/vendor/assets/images/marker-shadow.png +0 -0
- data/vendor/assets/javascripts/leaflet.js.erb +109 -66
- data/vendor/assets/stylesheets/leaflet.css.erb +2 -2
- metadata +110 -7
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/LICENSE
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
Copyright (c) 2010-
|
1
|
+
Copyright (c) 2010-2013, Vladimir Agafonkin
|
2
|
+
Copyright (c) 2010-2011, CloudMade
|
3
|
+
Copyright (c) 2012-2013, Akshay Joshi
|
2
4
|
All rights reserved.
|
3
5
|
|
4
6
|
Redistribution and use in source and binary forms, with or without modification, are
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/axyjo/leaflet-rails.png?branch=master)](https://travis-ci.org/axyjo/leaflet-rails)
|
2
|
+
|
1
3
|
Quickstart Guide
|
2
4
|
================
|
3
5
|
|
@@ -7,7 +9,7 @@ First, add the following code to your `Gemfile`.
|
|
7
9
|
|
8
10
|
```ruby
|
9
11
|
gem 'leaflet-rails'
|
10
|
-
```
|
12
|
+
```
|
11
13
|
|
12
14
|
Then, run `bundle install` from within your project to download the necessary files. Following that, open your application-wide CSS file (`app/assets/stylesheets/application.css`) and add the following line as a comment:
|
13
15
|
|
@@ -28,3 +30,80 @@ After that, open your application-wide Javascript file (typically `app/assets/ja
|
|
28
30
|
```
|
29
31
|
|
30
32
|
At this point, you may skip the first two steps of the [Leaflet Quick Start guide](http://leafletjs.com/examples/quick-start.html) and start at the third step (adding the map `div` to a view).
|
33
|
+
|
34
|
+
Helpers
|
35
|
+
=======
|
36
|
+
|
37
|
+
To get you up and running quickly, you can also use the gem's helper. To get started, add the following lines to a file called `leaflet.rb` in `config/initializers`:
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
Leaflet.tile_layer = "http://{s}.tile.cloudmade.com/YOUR-CLOUDMADE-API-KEY/997/256/{z}/{x}/{y}.png"
|
41
|
+
# You can also use any other tile layer here if you don't want to use Cloudmade - see http://leafletjs.com/reference.html#tilelayer for more
|
42
|
+
Leaflet.attribution = "Your attribution statement"
|
43
|
+
Leaflet.max_zoom = 18
|
44
|
+
```
|
45
|
+
|
46
|
+
You will then be able to call the helper in a view like so:
|
47
|
+
```ruby
|
48
|
+
map(:center => {
|
49
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
50
|
+
:zoom => 18
|
51
|
+
})
|
52
|
+
```
|
53
|
+
|
54
|
+
You can also add any number of markers like so:
|
55
|
+
```ruby
|
56
|
+
map(:center => {
|
57
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
58
|
+
:zoom => 18
|
59
|
+
},
|
60
|
+
:markers => [
|
61
|
+
{
|
62
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
63
|
+
}
|
64
|
+
]
|
65
|
+
)
|
66
|
+
```
|
67
|
+
|
68
|
+
Adding a `:popup` element to a marker hash will also generate a popup for a maker:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
map(:center => {
|
72
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
73
|
+
:zoom => 18
|
74
|
+
},
|
75
|
+
:markers => [
|
76
|
+
{
|
77
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
78
|
+
:popup => "Hello!"
|
79
|
+
}
|
80
|
+
]
|
81
|
+
)
|
82
|
+
```
|
83
|
+
|
84
|
+
If you want to override the map settings you have set in the initializer, you can also add them to the helper:
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
map(:center => {
|
88
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
89
|
+
:zoom => 18
|
90
|
+
},
|
91
|
+
:tile_layer => "http://{s}.somedomain.com/somepath/{z}/{x}/{y}.png",
|
92
|
+
:attribution => "Some other attribution text",
|
93
|
+
:max_zoom => 4
|
94
|
+
)
|
95
|
+
```
|
96
|
+
|
97
|
+
If you want to have multiple maps on same page , you should add unique container_id in helper for each map:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
map(:container_id => "first_map", :center => {
|
101
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
102
|
+
:zoom => 18
|
103
|
+
})
|
104
|
+
|
105
|
+
map(:container_id => "second_map", :center => {
|
106
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
107
|
+
:zoom => 18
|
108
|
+
})
|
109
|
+
```
|
data/Rakefile
CHANGED
data/leaflet-rails.gemspec
CHANGED
@@ -7,9 +7,10 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Leaflet::Rails::VERSION
|
8
8
|
s.authors = ["Akshay Joshi"]
|
9
9
|
s.email = ["joshi.a@gmail.com"]
|
10
|
+
s.license = "BSD"
|
10
11
|
s.homepage = ""
|
11
|
-
s.summary = %q{Use leaflet.js with Rails 3.}
|
12
|
-
s.description = %q{This gem provides the leaflet.js map display library for your Rails 3 application.}
|
12
|
+
s.summary = %q{Use leaflet.js with Rails 3/4.}
|
13
|
+
s.description = %q{This gem provides the leaflet.js map display library for your Rails 3/4 application.}
|
13
14
|
|
14
15
|
s.rubyforge_project = "leaflet-rails"
|
15
16
|
|
@@ -18,7 +19,10 @@ Gem::Specification.new do |s|
|
|
18
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
20
|
s.require_paths = ["lib"]
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
s.add_development_dependency "simplecov-rcov"
|
24
|
+
s.add_development_dependency "actionpack", '>= 3.2.0'
|
25
|
+
s.add_development_dependency "activesupport", '>= 3.2.0'
|
26
|
+
s.add_development_dependency "activemodel", '>= 3.2.0'
|
27
|
+
s.add_development_dependency "railties", '>= 3.2.0'
|
24
28
|
end
|
data/lib/leaflet-rails.rb
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
require "leaflet-rails/version"
|
2
|
+
require "leaflet-rails/view_helpers"
|
2
3
|
|
3
4
|
module Leaflet
|
5
|
+
mattr_accessor :tile_layer
|
6
|
+
mattr_accessor :attribution
|
7
|
+
mattr_accessor :max_zoom
|
8
|
+
|
4
9
|
module Rails
|
5
10
|
class Engine < ::Rails::Engine
|
6
|
-
|
11
|
+
initializer 'leaflet-rails.precompile' do |app|
|
12
|
+
app.config.assets.precompile += %w(layers-2x.png layers.png marker-icon-2x.png marker-icon.png marker-shadow.png)
|
13
|
+
end
|
14
|
+
|
15
|
+
initializer 'leaflet-rails.helpers' do
|
16
|
+
ActionView::Base.send :include, Leaflet::ViewHelpers
|
17
|
+
end
|
7
18
|
end
|
8
19
|
end
|
9
20
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Leaflet
|
2
|
+
module ViewHelpers
|
3
|
+
|
4
|
+
def map(options)
|
5
|
+
options[:tile_layer] ||= Leaflet.tile_layer
|
6
|
+
options[:attribution] ||= Leaflet.attribution
|
7
|
+
options[:max_zoom] ||= Leaflet.max_zoom
|
8
|
+
options[:container_id] ||= 'map'
|
9
|
+
|
10
|
+
output = []
|
11
|
+
output << "<div id='#{options[:container_id]}'></div>"
|
12
|
+
output << "<script>"
|
13
|
+
output << "var map = L.map('#{options[:container_id]}')"
|
14
|
+
output << "map.setView([#{options[:center][:latlng][0]}, #{options[:center][:latlng][1]}], #{options[:center][:zoom]})"
|
15
|
+
if options[:markers]
|
16
|
+
options[:markers].each do |marker|
|
17
|
+
output << "marker = L.marker([#{marker[:latlng][0]}, #{marker[:latlng][1]}]).addTo(map)"
|
18
|
+
if marker[:popup]
|
19
|
+
output << "marker.bindPopup('#{marker[:popup]}')"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
output << "L.tileLayer('#{options[:tile_layer]}', {
|
24
|
+
attribution: '#{options[:attribution]}',
|
25
|
+
maxZoom: #{options[:max_zoom]}
|
26
|
+
}).addTo(map)"
|
27
|
+
output << "</script>"
|
28
|
+
output.join("\n").html_safe
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
|
8
|
+
require 'simplecov'
|
9
|
+
require 'simplecov-rcov'
|
10
|
+
|
11
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
12
|
+
SimpleCov.start
|
13
|
+
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
16
|
+
|
17
|
+
ENV["RAILS_ENV"] ||= 'test'
|
18
|
+
|
19
|
+
require "action_controller/railtie"
|
20
|
+
require "rails/test_unit/railtie"
|
21
|
+
|
22
|
+
require "leaflet-rails"
|
23
|
+
|
24
|
+
module Test
|
25
|
+
class Application < ::Rails::Application
|
26
|
+
# configuration here if needed
|
27
|
+
config.active_support.deprecation = :stderr
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Test::Application.initialize!
|
32
|
+
|
33
|
+
RSpec.configure do |config|
|
34
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
35
|
+
config.run_all_when_everything_filtered = true
|
36
|
+
config.filter_run :focus
|
37
|
+
|
38
|
+
# Run specs in random order to surface order dependencies. If you find an
|
39
|
+
# order dependency and want to debug it, you can fix the order by providing
|
40
|
+
# the seed, which is printed after each run.
|
41
|
+
# --seed 1234
|
42
|
+
config.order = 'random'
|
43
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Leaflet::ViewHelpers do
|
4
|
+
|
5
|
+
class TestView < ActionView::Base
|
6
|
+
end
|
7
|
+
|
8
|
+
before :all do
|
9
|
+
Leaflet.tile_layer = "http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png"
|
10
|
+
Leaflet.attribution = "Some attribution statement"
|
11
|
+
Leaflet.max_zoom = 18
|
12
|
+
|
13
|
+
@view = TestView.new
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should mix in view helpers on initialization' do
|
17
|
+
@view.should respond_to(:map)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should set the method configuration options' do
|
21
|
+
result = @view.map(:center => {
|
22
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
23
|
+
:zoom => 18
|
24
|
+
})
|
25
|
+
|
26
|
+
result.should match(/L.tileLayer\('http:\/\/{s}.somedomain\.com\/blabla\/{z}\/{x}\/{y}\.png'/)
|
27
|
+
result.should match(/attribution: 'Some attribution statement'/)
|
28
|
+
result.should match(/maxZoom: 18/)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should generate a basic map with the correct latitude, longitude and zoom' do
|
32
|
+
result = @view.map(:center => {
|
33
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
34
|
+
:zoom => 18
|
35
|
+
})
|
36
|
+
result.should match(/map\.setView\(\[51.52238797921441, -0.08366235665359283\], 18\)/)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should generate a marker' do
|
40
|
+
result = @view.map(:center => {
|
41
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
42
|
+
:zoom => 18
|
43
|
+
},
|
44
|
+
:markers => [
|
45
|
+
{
|
46
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
47
|
+
}
|
48
|
+
])
|
49
|
+
result.should match(/marker = L\.marker\(\[51.52238797921441, -0.08366235665359283\]\).addTo\(map\)/)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should generate a marker with a popup' do
|
53
|
+
result = @view.map(:center => {
|
54
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
55
|
+
:zoom => 18
|
56
|
+
},
|
57
|
+
:markers => [
|
58
|
+
{
|
59
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
60
|
+
:popup => "Hello!"
|
61
|
+
}
|
62
|
+
])
|
63
|
+
result.should match(/marker = L\.marker\(\[51.52238797921441, -0.08366235665359283\]\).addTo\(map\)/)
|
64
|
+
result.should match(/marker\.bindPopup\('Hello!'\)/)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should override the method configuration options if set' do
|
68
|
+
result = @view.map(:center => {
|
69
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
70
|
+
:zoom => 18
|
71
|
+
},
|
72
|
+
:tile_layer => "http://{s}.someotherdomain.com/blabla/{z}/{x}/{y}.png",
|
73
|
+
:attribution => "Some other attribution text",
|
74
|
+
:max_zoom => 4
|
75
|
+
)
|
76
|
+
|
77
|
+
result.should match(/L.tileLayer\('http:\/\/{s}.someotherdomain\.com\/blabla\/{z}\/{x}\/{y}\.png'/)
|
78
|
+
result.should match(/attribution: 'Some other attribution text'/)
|
79
|
+
result.should match(/maxZoom: 4/)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should have multiple map on single page' do
|
83
|
+
result = @view.map(:container_id => "first_map", :center => {
|
84
|
+
:latlng => [51.52238797921441, -0.08366235665359283],
|
85
|
+
})
|
86
|
+
|
87
|
+
result1 = @view.map(:container_id => "second_map", :center => {
|
88
|
+
:latlng => [51.62238797921441, -0.08366235665359284],
|
89
|
+
})
|
90
|
+
|
91
|
+
result.should match(/id=\'first_map'/)
|
92
|
+
result.should match(/L.map\('first_map'/)
|
93
|
+
|
94
|
+
result1.should match(/id=\'second_map'/)
|
95
|
+
result1.should match(/L.map\('second_map'/)
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -7,7 +7,7 @@
|
|
7
7
|
var oldL = window.L,
|
8
8
|
L = {};
|
9
9
|
|
10
|
-
L.version = '0.6.
|
10
|
+
L.version = '0.6.3';
|
11
11
|
|
12
12
|
// define Leaflet for Node module pattern loaders, including Browserify
|
13
13
|
if (typeof module === 'object' && typeof module.exports === 'object') {
|
@@ -1092,46 +1092,30 @@ L.DomUtil.TRANSITION_END =
|
|
1092
1092
|
var userSelectProperty = L.DomUtil.testProp(
|
1093
1093
|
['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);
|
1094
1094
|
|
1095
|
-
var userDragProperty = L.DomUtil.testProp(
|
1096
|
-
['userDrag', 'WebkitUserDrag', 'OUserDrag', 'MozUserDrag', 'msUserDrag']);
|
1097
|
-
|
1098
1095
|
L.extend(L.DomUtil, {
|
1099
1096
|
disableTextSelection: function () {
|
1097
|
+
L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);
|
1100
1098
|
if (userSelectProperty) {
|
1101
1099
|
var style = document.documentElement.style;
|
1102
1100
|
this._userSelect = style[userSelectProperty];
|
1103
1101
|
style[userSelectProperty] = 'none';
|
1104
|
-
} else {
|
1105
|
-
L.DomEvent.on(window, 'selectstart', L.DomEvent.stop);
|
1106
1102
|
}
|
1107
1103
|
},
|
1108
1104
|
|
1109
1105
|
enableTextSelection: function () {
|
1106
|
+
L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);
|
1110
1107
|
if (userSelectProperty) {
|
1111
1108
|
document.documentElement.style[userSelectProperty] = this._userSelect;
|
1112
1109
|
delete this._userSelect;
|
1113
|
-
} else {
|
1114
|
-
L.DomEvent.off(window, 'selectstart', L.DomEvent.stop);
|
1115
1110
|
}
|
1116
1111
|
},
|
1117
1112
|
|
1118
1113
|
disableImageDrag: function () {
|
1119
|
-
|
1120
|
-
var style = document.documentElement.style;
|
1121
|
-
this._userDrag = style[userDragProperty];
|
1122
|
-
style[userDragProperty] = 'none';
|
1123
|
-
} else {
|
1124
|
-
L.DomEvent.on(window, 'dragstart', L.DomEvent.stop);
|
1125
|
-
}
|
1114
|
+
L.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);
|
1126
1115
|
},
|
1127
1116
|
|
1128
1117
|
enableImageDrag: function () {
|
1129
|
-
|
1130
|
-
document.documentElement.style[userDragProperty] = this._userDrag;
|
1131
|
-
delete this._userDrag;
|
1132
|
-
} else {
|
1133
|
-
L.DomEvent.off(window, 'dragstart', L.DomEvent.stop);
|
1134
|
-
}
|
1118
|
+
L.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);
|
1135
1119
|
}
|
1136
1120
|
});
|
1137
1121
|
})();
|
@@ -1629,7 +1613,7 @@ L.Map = L.Class.extend({
|
|
1629
1613
|
return this.fire('moveend');
|
1630
1614
|
},
|
1631
1615
|
|
1632
|
-
setMaxBounds: function (bounds) {
|
1616
|
+
setMaxBounds: function (bounds, options) {
|
1633
1617
|
bounds = L.latLngBounds(bounds);
|
1634
1618
|
|
1635
1619
|
this.options.maxBounds = bounds;
|
@@ -1646,7 +1630,7 @@ L.Map = L.Class.extend({
|
|
1646
1630
|
|
1647
1631
|
if (this._loaded) {
|
1648
1632
|
if (this._zoom < minZoom) {
|
1649
|
-
this.setView(bounds.getCenter(), minZoom);
|
1633
|
+
this.setView(bounds.getCenter(), minZoom, options);
|
1650
1634
|
} else {
|
1651
1635
|
this.panInsideBounds(bounds);
|
1652
1636
|
}
|
@@ -1724,10 +1708,14 @@ L.Map = L.Class.extend({
|
|
1724
1708
|
|
1725
1709
|
if (this._loaded) {
|
1726
1710
|
layer.onRemove(this);
|
1727
|
-
this.fire('layerremove', {layer: layer});
|
1728
1711
|
}
|
1729
1712
|
|
1730
1713
|
delete this._layers[id];
|
1714
|
+
|
1715
|
+
if (this._loaded) {
|
1716
|
+
this.fire('layerremove', {layer: layer});
|
1717
|
+
}
|
1718
|
+
|
1731
1719
|
if (this._zoomBoundLayers[id]) {
|
1732
1720
|
delete this._zoomBoundLayers[id];
|
1733
1721
|
this._updateZoomLevels();
|
@@ -1856,18 +1844,15 @@ L.Map = L.Class.extend({
|
|
1856
1844
|
},
|
1857
1845
|
|
1858
1846
|
getMinZoom: function () {
|
1859
|
-
var z1 = this.
|
1860
|
-
z2 = this.
|
1861
|
-
|
1862
|
-
|
1863
|
-
return Math.max(z1, z2, z3);
|
1847
|
+
var z1 = this._layersMinZoom === undefined ? -Infinity : this._layersMinZoom,
|
1848
|
+
z2 = this._boundsMinZoom === undefined ? -Infinity : this._boundsMinZoom;
|
1849
|
+
return this.options.minZoom === undefined ? Math.max(z1, z2) : this.options.minZoom;
|
1864
1850
|
},
|
1865
1851
|
|
1866
1852
|
getMaxZoom: function () {
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
return Math.min(z1, z2);
|
1853
|
+
return this.options.maxZoom === undefined ?
|
1854
|
+
(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :
|
1855
|
+
this.options.maxZoom;
|
1871
1856
|
},
|
1872
1857
|
|
1873
1858
|
getBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number
|
@@ -2187,16 +2172,15 @@ L.Map = L.Class.extend({
|
|
2187
2172
|
},
|
2188
2173
|
|
2189
2174
|
_onMouseClick: function (e) {
|
2190
|
-
|
2191
|
-
|
2175
|
+
if (!this._loaded || (!e._simulated && this.dragging && this.dragging.moved()) ||
|
2176
|
+
L.DomEvent._skipped(e)) { return; }
|
2192
2177
|
|
2193
2178
|
this.fire('preclick');
|
2194
2179
|
this._fireMouseEvent(e);
|
2195
2180
|
},
|
2196
2181
|
|
2197
2182
|
_fireMouseEvent: function (e) {
|
2198
|
-
|
2199
|
-
if (!this._loaded || e._leaflet_stop) { return; }
|
2183
|
+
if (!this._loaded || L.DomEvent._skipped(e)) { return; }
|
2200
2184
|
|
2201
2185
|
var type = e.type;
|
2202
2186
|
|
@@ -3046,6 +3030,11 @@ L.TileLayer.Canvas = L.TileLayer.extend({
|
|
3046
3030
|
},
|
3047
3031
|
|
3048
3032
|
redraw: function () {
|
3033
|
+
if (this._map) {
|
3034
|
+
this._reset({hard: true});
|
3035
|
+
this._update();
|
3036
|
+
}
|
3037
|
+
|
3049
3038
|
for (var i in this._tiles) {
|
3050
3039
|
this._redrawTile(this._tiles[i]);
|
3051
3040
|
}
|
@@ -3360,16 +3349,14 @@ L.Icon.Default = L.Icon.extend({
|
|
3360
3349
|
}
|
3361
3350
|
|
3362
3351
|
if (L.Browser.retina && name === 'icon') {
|
3363
|
-
|
3352
|
+
return "<%= asset_path('marker-icon-2x.png') %>";
|
3364
3353
|
}
|
3365
3354
|
|
3366
|
-
|
3367
|
-
|
3368
|
-
|
3369
|
-
|
3355
|
+
if (name == 'shadow') {
|
3356
|
+
return "<%= asset_path('marker-shadow.png') %>";
|
3357
|
+
} else {
|
3358
|
+
return "<%= asset_path('marker-icon.png') %>";
|
3370
3359
|
}
|
3371
|
-
|
3372
|
-
return path + '/marker-' + name + '.png';
|
3373
3360
|
}
|
3374
3361
|
});
|
3375
3362
|
|
@@ -3535,10 +3522,10 @@ L.Marker = L.Class.extend({
|
|
3535
3522
|
if (newShadow !== this._shadow) {
|
3536
3523
|
this._removeShadow();
|
3537
3524
|
addShadow = true;
|
3525
|
+
}
|
3538
3526
|
|
3539
|
-
|
3540
|
-
|
3541
|
-
}
|
3527
|
+
if (newShadow) {
|
3528
|
+
L.DomUtil.addClass(newShadow, classToAdd);
|
3542
3529
|
}
|
3543
3530
|
this._shadow = newShadow;
|
3544
3531
|
|
@@ -3676,6 +3663,8 @@ L.Marker = L.Class.extend({
|
|
3676
3663
|
if (this._map) {
|
3677
3664
|
this._updateOpacity();
|
3678
3665
|
}
|
3666
|
+
|
3667
|
+
return this;
|
3679
3668
|
},
|
3680
3669
|
|
3681
3670
|
_updateOpacity: function () {
|
@@ -3901,6 +3890,7 @@ L.Popup = L.Class.extend({
|
|
3901
3890
|
|
3902
3891
|
this._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);
|
3903
3892
|
L.DomEvent.on(this._contentNode, 'mousewheel', L.DomEvent.stopPropagation);
|
3893
|
+
L.DomEvent.on(this._contentNode, 'MozMousePixelScroll', L.DomEvent.stopPropagation);
|
3904
3894
|
L.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);
|
3905
3895
|
this._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);
|
3906
3896
|
this._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);
|
@@ -4301,6 +4291,9 @@ L.FeatureGroup = L.LayerGroup.extend({
|
|
4301
4291
|
},
|
4302
4292
|
|
4303
4293
|
removeLayer: function (layer) {
|
4294
|
+
if (!this.hasLayer(layer)) {
|
4295
|
+
return this;
|
4296
|
+
}
|
4304
4297
|
if (layer in this._layers) {
|
4305
4298
|
layer = this._layers[layer];
|
4306
4299
|
}
|
@@ -4370,9 +4363,11 @@ L.Path = L.Class.extend({
|
|
4370
4363
|
// how much to extend the clip area around the map view
|
4371
4364
|
// (relative to its size, e.g. 0.5 is half the screen in each direction)
|
4372
4365
|
// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)
|
4373
|
-
CLIP_PADDING:
|
4374
|
-
|
4375
|
-
|
4366
|
+
CLIP_PADDING: (function () {
|
4367
|
+
var max = L.Browser.mobile ? 1280 : 2000,
|
4368
|
+
target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;
|
4369
|
+
return Math.max(0, Math.min(0.5, target));
|
4370
|
+
})()
|
4376
4371
|
},
|
4377
4372
|
|
4378
4373
|
options: {
|
@@ -5632,6 +5627,16 @@ L.polygon = function (latlngs, options) {
|
|
5632
5627
|
}
|
5633
5628
|
|
5634
5629
|
return this;
|
5630
|
+
},
|
5631
|
+
|
5632
|
+
getLatLngs: function () {
|
5633
|
+
var latlngs = [];
|
5634
|
+
|
5635
|
+
this.eachLayer(function (layer) {
|
5636
|
+
latlngs.push(layer.getLatLngs());
|
5637
|
+
});
|
5638
|
+
|
5639
|
+
return latlngs;
|
5635
5640
|
}
|
5636
5641
|
});
|
5637
5642
|
}
|
@@ -5933,12 +5938,13 @@ L.GeoJSON = L.FeatureGroup.extend({
|
|
5933
5938
|
|
5934
5939
|
addData: function (geojson) {
|
5935
5940
|
var features = L.Util.isArray(geojson) ? geojson : geojson.features,
|
5936
|
-
i, len;
|
5941
|
+
i, len, feature;
|
5937
5942
|
|
5938
5943
|
if (features) {
|
5939
5944
|
for (i = 0, len = features.length; i < len; i++) {
|
5940
5945
|
// Only add this if geometry or geometries are set and not null
|
5941
|
-
|
5946
|
+
feature = features[i];
|
5947
|
+
if (feature.geometries || feature.geometry || feature.features || feature.coordinates) {
|
5942
5948
|
this.addData(features[i]);
|
5943
5949
|
}
|
5944
5950
|
}
|
@@ -6316,13 +6322,30 @@ L.DomEvent = {
|
|
6316
6322
|
|
6317
6323
|
getMousePosition: function (e, container) {
|
6318
6324
|
|
6319
|
-
var
|
6325
|
+
var ie7 = L.Browser.ie7,
|
6326
|
+
body = document.body,
|
6320
6327
|
docEl = document.documentElement,
|
6321
|
-
x = e.pageX ? e.pageX
|
6322
|
-
y = e.pageY ? e.pageY
|
6323
|
-
pos = new L.Point(x, y)
|
6328
|
+
x = e.pageX ? e.pageX - body.scrollLeft - docEl.scrollLeft: e.clientX,
|
6329
|
+
y = e.pageY ? e.pageY - body.scrollTop - docEl.scrollTop: e.clientY,
|
6330
|
+
pos = new L.Point(x, y),
|
6331
|
+
rect = container.getBoundingClientRect(),
|
6332
|
+
left = rect.left - container.clientLeft,
|
6333
|
+
top = rect.top - container.clientTop;
|
6334
|
+
|
6335
|
+
// webkit (and ie <= 7) handles RTL scrollLeft different to everyone else
|
6336
|
+
// https://code.google.com/p/closure-library/source/browse/trunk/closure/goog/style/bidi.js
|
6337
|
+
if (!L.DomUtil.documentIsLtr() && (L.Browser.webkit || ie7)) {
|
6338
|
+
left += container.scrollWidth - container.clientWidth;
|
6339
|
+
|
6340
|
+
// ie7 shows the scrollbar by default and provides clientWidth counting it, so we
|
6341
|
+
// need to add it back in if it is visible; scrollbar is on the left as we are RTL
|
6342
|
+
if (ie7 && L.DomUtil.getStyle(container, 'overflow-y') !== 'hidden' &&
|
6343
|
+
L.DomUtil.getStyle(container, 'overflow') !== 'hidden') {
|
6344
|
+
left += 17;
|
6345
|
+
}
|
6346
|
+
}
|
6324
6347
|
|
6325
|
-
return
|
6348
|
+
return pos._subtract(new L.Point(left, top));
|
6326
6349
|
},
|
6327
6350
|
|
6328
6351
|
getWheelDelta: function (e) {
|
@@ -6338,10 +6361,18 @@ L.DomEvent = {
|
|
6338
6361
|
return delta;
|
6339
6362
|
},
|
6340
6363
|
|
6341
|
-
|
6342
|
-
|
6343
|
-
|
6344
|
-
|
6364
|
+
_skipEvents: {},
|
6365
|
+
|
6366
|
+
_fakeStop: function (e) {
|
6367
|
+
// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)
|
6368
|
+
L.DomEvent._skipEvents[e.type] = true;
|
6369
|
+
},
|
6370
|
+
|
6371
|
+
_skipped: function (e) {
|
6372
|
+
var skipped = this._skipEvents[e.type];
|
6373
|
+
// reset when checking, as it's only used in map container and propagates outside of the map
|
6374
|
+
this._skipEvents[e.type] = false;
|
6375
|
+
return skipped;
|
6345
6376
|
},
|
6346
6377
|
|
6347
6378
|
// check if element really left/entered the event target (for mouseenter/mouseleave)
|
@@ -6603,6 +6634,8 @@ L.Map.Drag = L.Handler.extend({
|
|
6603
6634
|
if (map.options.worldCopyJump) {
|
6604
6635
|
this._draggable.on('predrag', this._onPreDrag, this);
|
6605
6636
|
map.on('viewreset', this._onViewReset, this);
|
6637
|
+
|
6638
|
+
this._onViewReset();
|
6606
6639
|
}
|
6607
6640
|
}
|
6608
6641
|
this._draggable.enable();
|
@@ -8337,9 +8370,14 @@ L.PosAnimation = L.Class.extend({
|
|
8337
8370
|
},
|
8338
8371
|
|
8339
8372
|
_onStep: function () {
|
8373
|
+
var stepPos = this._getPos();
|
8374
|
+
if (!stepPos) {
|
8375
|
+
this._onTransitionEnd();
|
8376
|
+
return;
|
8377
|
+
}
|
8340
8378
|
// jshint camelcase: false
|
8341
8379
|
// make L.DomUtil.getPosition return intermediate position value during animation
|
8342
|
-
this._el._leaflet_pos =
|
8380
|
+
this._el._leaflet_pos = stepPos;
|
8343
8381
|
|
8344
8382
|
this.fire('step');
|
8345
8383
|
},
|
@@ -8356,8 +8394,9 @@ L.PosAnimation = L.Class.extend({
|
|
8356
8394
|
|
8357
8395
|
if (L.Browser.any3d) {
|
8358
8396
|
matches = style[L.DomUtil.TRANSFORM].match(this._transformRe);
|
8359
|
-
|
8360
|
-
|
8397
|
+
if (!matches) { return; }
|
8398
|
+
left = parseFloat(matches[1]);
|
8399
|
+
top = parseFloat(matches[2]);
|
8361
8400
|
} else {
|
8362
8401
|
left = parseFloat(style.left);
|
8363
8402
|
top = parseFloat(style.top);
|
@@ -8587,6 +8626,10 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
|
8587
8626
|
}
|
8588
8627
|
},
|
8589
8628
|
|
8629
|
+
_nothingToAnimate: function () {
|
8630
|
+
return !this._container.getElementsByClassName('leaflet-zoom-animated').length;
|
8631
|
+
},
|
8632
|
+
|
8590
8633
|
_tryAnimatedZoom: function (center, zoom, options) {
|
8591
8634
|
|
8592
8635
|
if (this._animatingZoom) { return true; }
|
@@ -8594,7 +8637,7 @@ L.Map.include(!L.DomUtil.TRANSITION ? {} : {
|
|
8594
8637
|
options = options || {};
|
8595
8638
|
|
8596
8639
|
// don't animate if disabled, not supported or zoom difference is too large
|
8597
|
-
if (!this._zoomAnimated || options.animate === false ||
|
8640
|
+
if (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||
|
8598
8641
|
Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }
|
8599
8642
|
|
8600
8643
|
// offset is the pixel coords of the zoom origin relative to the current center
|
@@ -8847,7 +8890,7 @@ L.Map.include({
|
|
8847
8890
|
|
8848
8891
|
var data = {
|
8849
8892
|
latlng: latlng,
|
8850
|
-
bounds: bounds
|
8893
|
+
bounds: bounds
|
8851
8894
|
};
|
8852
8895
|
|
8853
8896
|
for (var i in pos.coords) {
|
@@ -378,11 +378,11 @@
|
|
378
378
|
|
379
379
|
.leaflet-touch .leaflet-control-attribution,
|
380
380
|
.leaflet-touch .leaflet-control-layers,
|
381
|
-
.leaflet-touch .leaflet-
|
381
|
+
.leaflet-touch .leaflet-bar {
|
382
382
|
box-shadow: none;
|
383
383
|
}
|
384
384
|
.leaflet-touch .leaflet-control-layers,
|
385
|
-
.leaflet-touch .leaflet-
|
385
|
+
.leaflet-touch .leaflet-bar {
|
386
386
|
border: 4px solid rgba(0,0,0,0.3);
|
387
387
|
}
|
388
388
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leaflet-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,105 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
-
dependencies:
|
14
|
-
|
12
|
+
date: 2013-11-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: simplecov-rcov
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: actionpack
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 3.2.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.2.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: activesupport
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 3.2.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 3.2.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: activemodel
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 3.2.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 3.2.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: railties
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 3.2.0
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 3.2.0
|
110
|
+
description: This gem provides the leaflet.js map display library for your Rails 3/4
|
15
111
|
application.
|
16
112
|
email:
|
17
113
|
- joshi.a@gmail.com
|
@@ -20,6 +116,7 @@ extensions: []
|
|
20
116
|
extra_rdoc_files: []
|
21
117
|
files:
|
22
118
|
- .gitignore
|
119
|
+
- .travis.yml
|
23
120
|
- CHANGELOG.md
|
24
121
|
- Gemfile
|
25
122
|
- LICENSE
|
@@ -28,6 +125,9 @@ files:
|
|
28
125
|
- leaflet-rails.gemspec
|
29
126
|
- lib/leaflet-rails.rb
|
30
127
|
- lib/leaflet-rails/version.rb
|
128
|
+
- lib/leaflet-rails/view_helpers.rb
|
129
|
+
- spec/spec_helper.rb
|
130
|
+
- spec/view_helpers_spec.rb
|
31
131
|
- vendor/assets/images/layers-2x.png
|
32
132
|
- vendor/assets/images/layers.png
|
33
133
|
- vendor/assets/images/marker-icon-2x.png
|
@@ -37,7 +137,8 @@ files:
|
|
37
137
|
- vendor/assets/stylesheets/leaflet.css.erb
|
38
138
|
- vendor/assets/stylesheets/leaflet.ie.css
|
39
139
|
homepage: ''
|
40
|
-
licenses:
|
140
|
+
licenses:
|
141
|
+
- BSD
|
41
142
|
post_install_message:
|
42
143
|
rdoc_options: []
|
43
144
|
require_paths:
|
@@ -59,5 +160,7 @@ rubyforge_project: leaflet-rails
|
|
59
160
|
rubygems_version: 1.8.23
|
60
161
|
signing_key:
|
61
162
|
specification_version: 3
|
62
|
-
summary: Use leaflet.js with Rails 3.
|
63
|
-
test_files:
|
163
|
+
summary: Use leaflet.js with Rails 3/4.
|
164
|
+
test_files:
|
165
|
+
- spec/spec_helper.rb
|
166
|
+
- spec/view_helpers_spec.rb
|