rails-marker 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 Aimbulance http://www.aimbulance.com/
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Rails::Marker
2
+
3
+ Form helpers for edit fields such as zoom, longitude and latitude
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rails-marker'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rails-marker
18
+
19
+ ## Usage
20
+
21
+ For example you have model office:
22
+
23
+ ``` ruby
24
+
25
+ # == Schema Information
26
+ #
27
+ # Table name: offices
28
+ #
29
+ # id :integer(4) not null, primary key
30
+ # title :string(255) not null
31
+ # address :string(255)
32
+ # phone :string(255)
33
+ # email :string(255)
34
+ # longitude :float
35
+ # latitude :float
36
+ # zoom :integer(1)
37
+ # created_at :datetime not null
38
+ # updated_at :datetime not null
39
+ #
40
+
41
+ class Office < ActiveRecord::Base
42
+ validates_presence_of :title, :address
43
+ validates_numericality_of :latitude, :longitude
44
+
45
+ attr_accessible :address, :email, :latitude, :longitude, :phone, :title, :is_visible, :zoom
46
+ end
47
+ ```
48
+
49
+ And you want edit fields zoom, longitude and latitude:
50
+
51
+ ``` erb
52
+ <%= form_for @office do |f| %>
53
+ <%= f.marker_field :map, {:lat => :latitude, :lng => :longitude}, {:style => "width:890px;height:400px;"} %>
54
+ <% end %>
55
+ ```
56
+
57
+ It's all you need! Just move the marker, and zoom, latitude and longitude fields will be automatically filled:
58
+
59
+ ![Marker field in use](http://img205.imageshack.us/img205/9493/screenshotfrom201205231.png)
60
+
61
+ ## Contributing
62
+
63
+ 1. Fork it
64
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
65
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
66
+ 4. Push to the branch (`git push origin my-new-feature`)
67
+ 5. Create new Pull Request
68
+
69
+ Copyright (c) 2012 Aimbulance, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,78 @@
1
+ $ = jQuery
2
+
3
+ class MapGoogle
4
+
5
+ constructor: (@dom_id, options = {}) ->
6
+ defaults =
7
+ lat: 50.44067063154785
8
+ lng: 30.52654266357422
9
+ zoom: 6
10
+ field_lat: "#lat"
11
+ field_lng: "#lng"
12
+ field_zoom: "#zoom"
13
+
14
+ @options = $.extend defaults, options
15
+ this._setup()
16
+
17
+ _setup: ->
18
+ @location = this._build_location()
19
+ @map = this._build_map(@dom_id)
20
+ @marker = this._build_marker()
21
+
22
+ google.maps.event.addListener(@marker, 'dragend', (event) =>
23
+ pos = @marker.getPosition()
24
+
25
+ $(@options.field_lat).val pos.lat()
26
+ $(@options.field_lng).val pos.lng()
27
+
28
+ @map.setCenter(event.latLng)
29
+ )
30
+
31
+ google.maps.event.addListener(@map, 'zoom_changed', () =>
32
+ $(@options.field_zoom).val @map.getZoom()
33
+ )
34
+
35
+ placeMarker: (location) ->
36
+ marker = this._build_marker {position: location}
37
+
38
+ @map.setCenter(location);
39
+
40
+ return marker
41
+
42
+ _build_location: ->
43
+ lat = this._parse_value @options.field_lat, @options.lat
44
+ lng = this._parse_value @options.field_lng, @options.lng
45
+
46
+ new google.maps.LatLng(lat, lng)
47
+
48
+ _build_map: (dom_id, options = {}) ->
49
+ zoom = this._parse_value @options.field_zoom, @options.zoom
50
+
51
+ defaults =
52
+ zoom: zoom
53
+ center: @location
54
+ mapTypeId: google.maps.MapTypeId.ROADMAP
55
+
56
+ settings = $.extend defaults, options
57
+
58
+ new google.maps.Map(document.getElementById(dom_id), settings)
59
+
60
+ _build_marker: (options = {}) ->
61
+ defaults =
62
+ position: @location
63
+ map: @map
64
+ draggable: true
65
+
66
+ settings = $.extend defaults, options
67
+
68
+ new google.maps.Marker(settings)
69
+
70
+ _parse_value: (field, default_value) ->
71
+ value = parseFloat $(field).val()
72
+
73
+ if value
74
+ return value
75
+ else
76
+ return default_value
77
+
78
+ window.MapGoogle = MapGoogle
@@ -0,0 +1,14 @@
1
+ <%= javascript_include_tag "http://maps.google.com/maps/api/js?sensor=false&language=#{I18n.locale}" %>
2
+ <%= javascript_include_tag "marker/map_google.js" %>
3
+
4
+ <%= hidden_field field.object_name, field.input_options[:lat] %>
5
+ <%= hidden_field field.object_name, field.input_options[:lng] %>
6
+ <%= hidden_field field.object_name, field.input_options[:zoom] %>
7
+
8
+ <%= content_tag :div, nil, field.html_options %>
9
+
10
+ <script type="text/javascript">
11
+ $(document).ready(function(){
12
+ new MapGoogle("<%= field.html_options[:id] %>", <%=raw field.map_options.to_json %>);
13
+ });
14
+ </script>
@@ -0,0 +1,23 @@
1
+ require 'rails'
2
+ require 'marker'
3
+
4
+ module Marker
5
+ class Engine < ::Rails::Engine
6
+
7
+ initializer "marker.assets_precompile", :group => :assets do |app|
8
+ app.config.assets.precompile += ["marker/map_google.js"]
9
+ end
10
+
11
+ initializer "marker.helpers" do
12
+ ActiveSupport.on_load :action_view do
13
+ ActionView::Base.send(:include, Marker::Helpers::FormTagHelper)
14
+ ActionView::Helpers::FormBuilder.send(:include, Marker::Helpers::FormBuilder)
15
+ end
16
+ end
17
+
18
+ initializer "marker.hooks" do
19
+ require "marker/hooks/simple_form" if Object.const_defined?("SimpleForm")
20
+ require "marker/hooks/formtastic" if Object.const_defined?("Formtastic")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,55 @@
1
+ module Marker
2
+ module Helpers
3
+ class FieldTag
4
+ attr_reader :template, :object, :engine, :html_options
5
+
6
+ # Wrapper for render marker field
7
+ # Usage:
8
+ #
9
+ # marker = FieldTag.new(object_name, method_name, template, options)
10
+ # marker.to_s
11
+ #
12
+ def initialize(object_name, method_name, template, options = {}, html_options = {}) #:nodoc:
13
+ options = { :object_name => object_name, :method_name => method_name }.merge(options)
14
+
15
+ @template, @options, @html_options = template, options.dup, html_options.dup
16
+ @engine = (@options.delete(:engine) || "google")
17
+ @object = (@options.delete(:object) || @template.instance_variable_get("@#{object_name}"))
18
+ @html_options[:id] ||= id
19
+ end
20
+
21
+ def to_s(locals = {}) #:nodoc:
22
+ locals = { :field => self }.merge(locals)
23
+ @template.render :partial => "marker/#{@engine}", :locals => @options.merge(locals)
24
+ end
25
+
26
+ def id
27
+ @id ||= @template.dom_id(@object, [method_name, 'marker'].join('_'))
28
+ end
29
+
30
+ def input_options
31
+ @input_options ||= {:zoom => :zoom, :lat => :latitude, :lng => :longitude}.merge(@options)
32
+ end
33
+
34
+ def map_options
35
+ {
36
+ :field_lat => "##{sanitized_object_name}_#{input_options[:lat]}",
37
+ :field_lng => "##{sanitized_object_name}_#{input_options[:lng]}",
38
+ :field_zoom => "##{sanitized_object_name}_#{input_options[:zoom]}"
39
+ }
40
+ end
41
+
42
+ def method_name
43
+ @options[:method_name]
44
+ end
45
+
46
+ def object_name
47
+ @options[:object_name]
48
+ end
49
+
50
+ def sanitized_object_name
51
+ @sanitized_object_name ||= object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,16 @@
1
+ module Marker
2
+ module Helpers
3
+ module FormBuilder
4
+ # Render map field
5
+ # Usage:
6
+ #
7
+ # <%= form_for @office do |f| %>
8
+ # <%= f.marker_field :marker %>
9
+ # <%= end %>
10
+ #
11
+ def marker_field(method, options = {}, html_options = {})
12
+ @template.send("marker_field_tag", @object_name, method, objectify_options(options), html_options)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ module Marker
2
+ module Helpers
3
+ module FormTagHelper
4
+
5
+ # A helper that renders file map container
6
+ #
7
+ # <%= marker_field_tag :office, :marker %>
8
+ #
9
+ def marker_field_tag(object_name, method_name, options = {}, html_options = {})
10
+ marker = FieldTag.new(object_name, method_name, self, options, html_options)
11
+ marker.to_s
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require 'formtastic'
2
+
3
+ class MarkerInput
4
+ include Formtastic::Inputs::Base
5
+
6
+ def to_html
7
+ input_wrapping do
8
+ label_html <<
9
+ builder.marker_field(method, options, input_html_options)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ require 'simple_form'
2
+
3
+ class MarkerInput < SimpleForm::Inputs::Base
4
+ def input
5
+ @builder.marker_field(attribute_name, options, input_html_options)
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Marker
2
+ VERSION = "0.0.1".freeze
3
+ end
data/lib/marker.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "marker/version"
2
+ require "marker/engine"
3
+
4
+ module Marker
5
+ module Helpers
6
+ autoload :FormTagHelper, 'marker/helpers/form_tag_helper'
7
+ autoload :FormBuilder, 'marker/helpers/form_builder'
8
+ autoload :FieldTag, 'marker/helpers/field_tag'
9
+ end
10
+ end
@@ -0,0 +1 @@
1
+ require "marker"
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails-marker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Igor Galeta
9
+ - Pavlo Galeta
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-05-23 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sqlite3
17
+ requirement: &83065040 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *83065040
26
+ description: Form helpers for edit fields such as zoom, longitude and latitude
27
+ email:
28
+ - galeta.igor@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - app/views/marker/_google.html.erb
34
+ - app/assets/javascripts/marker/map_google.js.coffee
35
+ - lib/rails-marker.rb
36
+ - lib/marker.rb
37
+ - lib/marker/engine.rb
38
+ - lib/marker/helpers/form_tag_helper.rb
39
+ - lib/marker/helpers/field_tag.rb
40
+ - lib/marker/helpers/form_builder.rb
41
+ - lib/marker/hooks/simple_form.rb
42
+ - lib/marker/hooks/formtastic.rb
43
+ - lib/marker/version.rb
44
+ - MIT-LICENSE
45
+ - Rakefile
46
+ - README.md
47
+ homepage: https://github.com/galetahub/rails-marker
48
+ licenses: []
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 1.8.10
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Easy way to edit zoom, longitude and latitude
71
+ test_files: []