volt-google_maps 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0ac8298a4831f6f6451523018de6206b82ca08f8
4
+ data.tar.gz: 072425f76c0802864d59fe8128b4280d07b7c1d4
5
+ SHA512:
6
+ metadata.gz: 07dcdd8c4156003671510de4b9f75fe95f98a18e5901098cf63a3e06e86889d69c26aab0d167d83b74c68fca343686fff497cb50262520889a7b5e8d2bd4eb82
7
+ data.tar.gz: e4bba9443061b019f2127bc60c7ef75f63560b45029420deee8e4caa0413ac7a6226f09cb7a90c3bd351d321f0a503fee4ded686714c39875569fb494c647680
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in volt-google-maps.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # Google Maps Volt Component
2
+
3
+ (still a work in progress)
4
+
5
+ Provides a simple google maps integration.
6
+
7
+ First signup for a google maps api key here:
8
+
9
+ https://developers.google.com/maps/documentation/javascript/tutorial
10
+
11
+ Next put it in your config/app.rb file:
12
+
13
+ config.public.google_maps_api_key = '....'
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'volt-google_maps'
18
+
19
+ And then execute:
20
+
21
+ bundle
22
+
23
+ Then install the component in the config/dependencies.rb file of any components you want google maps in:
24
+
25
+ component 'google_maps'
26
+
27
+ Lastly, use the google_maps tag:
28
+
29
+ <style>
30
+ .google-map {
31
+ height: 400px;
32
+ width: 600px;
33
+ }
34
+ </style>
35
+ <div class="google-map">
36
+ <:google_maps />
37
+ </div>
38
+
39
+ The map will take up the width of the div, so we add the style tag.
40
+
41
+ The google_map tag can be passed many attributes:
42
+
43
+ - zoom - integer for different zoom levels
44
+ - center - the address to center the map on
45
+ - markers - an array of marker Models (with _address and _content)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,4 @@
1
+ .google-map-instance {
2
+ height: 100%;
3
+ width: 100%;
4
+ }
@@ -0,0 +1,2 @@
1
+ # Component dependencies
2
+ javascript_file "https://maps.googleapis.com/maps/api/js?key=" + Volt.config.public.google_maps_api_key
@@ -0,0 +1 @@
1
+ # Component routes
@@ -0,0 +1,187 @@
1
+ if RUBY_PLATFORM == 'opal'
2
+ require 'native'
3
+ end
4
+
5
+ module GoogleMaps
6
+ class MainController < Volt::ModelController
7
+ attr_accessor :section
8
+
9
+ def index_ready
10
+ @markers = []
11
+
12
+ `this.geocoder = new google.maps.Geocoder();`
13
+
14
+ node = section.container_node
15
+
16
+ if attrs.respond_to?(:center)
17
+ geocode(attrs.center) do |latlng|
18
+ setup_map(node, latlng.to_n)
19
+ end
20
+ else
21
+ setup_map(node, {lat: -34.397, lng: 150.644}.to_n)
22
+ end
23
+ end
24
+
25
+
26
+ def before_index_remove
27
+ %x{
28
+ delete this.map;
29
+ delete this.geocoder;
30
+ }
31
+
32
+ @add_listener.remove if @add_listener
33
+ @remove_listener.remove if @remove_listener
34
+ end
35
+
36
+ def set_markers
37
+ -> do
38
+ markers = attrs.markers
39
+
40
+ markers.each do |marker|
41
+ add_marker(marker) do |result|
42
+ @markers << result
43
+ end
44
+ end
45
+
46
+ @add_listener.remove if @add_listener
47
+ @remove_listener.remove if @remove_listener
48
+
49
+ if markers.respond_to?(:on)
50
+ @add_listener = markers.on('added') do |index|
51
+ marker = markers[index]
52
+
53
+ add_marker(marker) do |result|
54
+ @markers[index] = result
55
+ end
56
+ end
57
+
58
+ @remove_listener = markers.on('removed') do |index|
59
+ marker = @markers.delete_at(index)
60
+ remove_marker(marker.to_n)
61
+ end
62
+ end
63
+
64
+ end.watch!
65
+ end
66
+
67
+ def setup_zoom
68
+ puts "SETUP ZOOM"
69
+ `google.maps.event.addListener(self.map, 'zoom_changed', function() {
70
+ var zoomLevel = self.map.getZoom();`
71
+
72
+ @changing_zoom = true
73
+ new_zoom = Native(`zoomLevel`)
74
+ if attrs.zoom != new_zoom && attrs.respond_to?(:zoom=)
75
+ attrs.zoom = new_zoom
76
+ end
77
+
78
+ # Setup listener again
79
+ set_zoom
80
+
81
+ @changing_zoom = false
82
+
83
+ `});`
84
+
85
+ end
86
+
87
+ def set_zoom
88
+ -> do
89
+ attrs.zoom
90
+ puts "SET ZOOM"
91
+ unless @changing_zoom
92
+ level = attrs.zoom
93
+ if level.blank?
94
+ level = 8
95
+ else
96
+ level = (level || 8).to_i
97
+ end
98
+
99
+ level_n = level.to_n
100
+ `if (self.map.getZoom() != level_n) {`
101
+ `self.map.setZoom(level_n);`
102
+ `}`
103
+ end
104
+ end.watch!
105
+ end
106
+
107
+ def setup_map(node, latlng)
108
+ %x{
109
+ var mapOptions = {
110
+ center: latlng,
111
+ zoom: 8
112
+ };
113
+ this.map = new google.maps.Map($(node).find('.google-map-instance').get(0), mapOptions);
114
+ console.log('map setup');
115
+ }
116
+
117
+ if attrs.respond_to?(:center)
118
+ @first = true
119
+ -> { set_center(attrs.center) }.watch!
120
+ end
121
+
122
+
123
+ set_zoom if attrs.respond_to?(:zoom)
124
+
125
+ set_markers if attrs.respond_to?(:markers)
126
+
127
+ setup_zoom if attrs.respond_to?(:zoom=)
128
+ end
129
+
130
+ def set_center(address)
131
+ if @first
132
+ @first = false
133
+ else
134
+ geocode(address) do |latlng|
135
+ latlng_n = latlng.to_n
136
+ `self.map.setCenter(latlng_n);`
137
+ end
138
+ end
139
+ end
140
+
141
+ def geocode(address)
142
+ unless address.is_a?(String)
143
+ yield({lat: -34.397, lng: 150.644})
144
+ return
145
+ end
146
+
147
+ `this.geocoder.geocode( { 'address': address}, function(results, status) {`
148
+ `if (status == google.maps.GeocoderStatus.OK) {`
149
+ `var latlng = results[0].geometry.location;`
150
+ yield(Native(`latlng`))
151
+ `} else {`
152
+ yield({lat: -34.397, lng: 150.644})
153
+ `}`
154
+ `}.bind(this));`
155
+
156
+ end
157
+
158
+ def add_marker(marker_data)
159
+ if marker_data.is_a?(String)
160
+ address = marker_data
161
+ content = marker_data
162
+ else
163
+ address = marker_data._address.or('').to_n
164
+ content = marker_data._content.or(address).or('').to_n
165
+ end
166
+
167
+ geocode(address) do |latlng|
168
+ latlng_n = latlng.to_n
169
+ marker = nil
170
+
171
+ %x{
172
+ marker = new google.maps.Marker({
173
+ position: latlng_n,
174
+ map: self.map,
175
+ title: content
176
+ });
177
+ }
178
+
179
+ yield Native(marker)
180
+ end
181
+ end
182
+
183
+ def remove_marker(marker)
184
+ `marker.setMap(null);`
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,3 @@
1
+ <:Body>
2
+ <div class="google-map-instance"></div>
3
+
@@ -0,0 +1,2 @@
1
+ <:Body>
2
+ <h1>Google Maps</h1>
@@ -0,0 +1,9 @@
1
+ require "volt/google/maps/version"
2
+
3
+ class Volt
4
+ class Google
5
+ class Maps
6
+ # Your code goes here...
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ version = File.read(File.expand_path('../VERSION', __FILE__)).strip
6
+
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "volt-google_maps"
10
+ spec.version = version
11
+ spec.authors = ["Ryan Stout"]
12
+ spec.email = ["ryan@agileproductions.com"]
13
+ spec.summary = %q{A google maps component for Volt}
14
+ spec.homepage = ""
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "volt", "~> 0.9.2"
23
+ spec.add_development_dependency "rake"
24
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: volt-google_maps
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Stout
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: volt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description:
42
+ email:
43
+ - ryan@agileproductions.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - README.md
51
+ - Rakefile
52
+ - VERSION
53
+ - app/google_maps/assets/css/google-map.css
54
+ - app/google_maps/config/dependencies.rb
55
+ - app/google_maps/config/routes.rb
56
+ - app/google_maps/controllers/main_controller.rb
57
+ - app/google_maps/views/main/index.html
58
+ - app/google_maps/views/main/main.html
59
+ - lib/volt/google/maps.rb
60
+ - volt-google-maps.gemspec
61
+ homepage: ''
62
+ licenses:
63
+ - MIT
64
+ metadata: {}
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 2.4.6
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: A google maps component for Volt
85
+ test_files: []