app/assets/javascripts/ab_admin/components/gmaps.js.coffee in ab_admin-0.1.2 vs app/assets/javascripts/ab_admin/components/gmaps.js.coffee in ab_admin-0.2.0
- old
+ new
@@ -1,122 +1,118 @@
class window.GeoInput
- constructor: (@dom_lat, @dom_lon, @dom_zoom, @options={}) ->
+ @default_lat = 55.7427928
+ @default_lon = 55.7427928
+
+ constructor: (@cont, @options={}) ->
+ @prefix = @cont.attr('id').replace(/_geo_input$/, '')
defaults =
- lat: 55.7427928
- lon: 37.61540089999994
- zoom: 12
- doom_map: 'admin_map'
- types: ['geocode']
- map_options: {}
+ lat: GeoInput.default_lat
+ lon: GeoInput.default_lon
+ autocomplete: true
+
_.defaults(@options, defaults)
- @callback = window[@options.callback] if _.isFunction(window[@options.callback])
- @marker_callback = window[@options.marker_callback] if _.isFunction(window[@options.marker_callback])
- @lat_el = $('#' + @dom_lat)
- @lon_el = $('#' + @dom_lon);
- @zoom_el = $('#' + @dom_zoom);
- @lat = parseFloat(@lat_el.val()) or @options.lat
- @lon = parseFloat(@lon_el.val()) or @options.lon
- @zoom = parseInt(@zoom_el.val(), 10) or @options.zoom
- @lat_lon = new google.maps.LatLng(@lat, @lon)
- @initGMap()
+ @initElements()
+ @initPoint()
+ @initMap()
@initMarker()
+ @initHandlers()
+ @initAutocomplete() if @options.autocomplete
- initGMap: ->
- map_options =
- zoom: @zoom,
- center: @lat_lon,
- mapTypeId: google.maps.MapTypeId.ROADMAP
-# scrollwheel: false
- _.defaults(@options.map_options, map_options)
- @map = new google.maps.Map(document.getElementById(@options.doom_map), @options.map_options)
+ initElements: ->
+ for el in ['lat', 'lon', 'map', 'zoom', 'geo_ac']
+ @options["#{el}_id"] ||= "#{@prefix}_#{el}"
+ this["#{el}_el"] = $("##{@options["#{el}_id"]}")
- google.maps.event.addListener @map, 'zoom_changed', =>
- @zoom_el.val(@map.getZoom())
+ initPoint: ->
+ @lat = parseFloat(@lat_el.val()) or @options.lat
+ @lon = parseFloat(@lon_el.val()) or @options.lon
+ @zoom = parseInt(@zoom_el.val(), 10) or 12
+ @point = new google.maps.LatLng(@lat, @lon)
- setInputs: (pos) ->
- @lat_el.val(pos.lat())
- @lon_el.val(pos.lng())
- @zoom_el.val(@map.getZoom())
+ initHandlers: ->
+ @cont.bind 'geo_input:zoom_changed', (e) =>
+ @zoom_el.val(e.zoom)
- initMarker: ->
- marker_options =
- position: @lat_lon,
- map: @map,
- draggable: true
+ @cont.bind 'geo_input:dragend', (e) =>
+ @map.setCenter(e.point)
+ @setInputs(e.point)
- @marker = new google.maps.Marker(marker_options)
- @infowindow = new google.maps.InfoWindow()
+ @cont.bind 'geo_input:place_changed', (e) =>
+ @setPlace(e.place)
- google.maps.event.addListener @marker, 'dragend', (event) =>
- @marker_callback.call(this, event.latLng) if @marker_callback
- @map.setCenter(event.latLng)
- pos = @marker.getPosition()
- @setInputs(pos)
-
- initAutocomplete: (dom_input='geo_autocomplete') ->
- input = document.getElementById(dom_input)
- opts =
- types: @options.types
- language: I18n.locale
-# componentRestrictions: {country: 'ru'}
- opts.types = @typesByPrefix() if @options.prefix
-# log opts
- autocomplete = new google.maps.places.Autocomplete(input, opts)
- autocomplete.bindTo('bounds', @map)
- google.maps.event.addListener autocomplete, 'place_changed', =>
- place = autocomplete.getPlace()
- @callback.call(this, place) if @callback
- @setPlace(place)
-
- $('#'+ dom_input).live "keypress", (e) ->
+ @geo_ac_el.keypress (e) ->
e.preventDefault() if e.keyCode == 13
setPlace: (place) =>
return unless place.geometry
- pos = place.geometry.location
+ point = place.geometry.location
if place.geometry.viewport
@map.fitBounds(place.geometry.viewport)
else
- @map.setCenter(pos)
+ @map.setCenter(point)
@map.setZoom(17)
- @marker.setPosition(pos)
- @setInputs(pos)
+ @marker.setPosition(point)
+ @setInputs(point)
+ setInputs: (point) ->
+ @lat_el.val(point.lat())
+ @lon_el.val(point.lng())
+ @zoom_el.val(@map.getZoom())
- typesByPrefix: ->
- if _.include(['region', 'district', 'sub_district'], @options.prefix)
- ['(regions)']
- else if _.include(['location'], @options.prefix)
- ['(cities)']
- else
- ['geocode']
+ initMap: ->
+ map_defaults =
+ zoom: @zoom,
+ center: @point,
+ mapTypeId: google.maps.MapTypeId.ROADMAP
+ scrollwheel: false
- initAutocompleteCustom: (dom_input='geo_autocomplete') ->
- input = document.getElementById(dom_input)
- opts =
+ @options.map_options ||= {}
+ _.defaults(@options.map_options, map_defaults)
+ @map = new google.maps.Map(@map_el[0], @options.map_options)
+
+ google.maps.event.addListener @map, 'zoom_changed', =>
+ @cont.trigger
+ type: 'geo_input:zoom_changed'
+ zoom: @map.getZoom()
+
+ initMarker: ->
+ marker_defaults =
+ position: @point,
+ map: @map,
+ draggable: true
+
+ @options.marker_options ||= {}
+ _.defaults(@options.marker_options, marker_defaults)
+
+ @marker = new google.maps.Marker(@options.marker_options)
+ @infowindow = new google.maps.InfoWindow()
+
+ google.maps.event.addListener @marker, 'dragend', (e) =>
+ @cont.trigger
+ type: 'geo_input:dragend'
+ point: e.latLng
+
+ initAutocomplete: ->
+ geo_ac_defaults =
+ language: I18n.locale
types: ['geocode']
-# componentRestrictions: {country: 'ru'}
- autocomplete = new google.maps.places.Autocomplete(input, opts)
+
+ @options.geo_ac_options ||= {}
+ _.defaults(@options.geo_ac_options, geo_ac_defaults)
+ autocomplete = new google.maps.places.Autocomplete(@geo_ac_el[0], @options.geo_ac_options)
autocomplete.bindTo('bounds', @map)
google.maps.event.addListener autocomplete, 'place_changed', =>
- place = autocomplete.getPlace()
- @callback.call(this, place) if @callback
- return unless place.geometry
- pos = place.geometry.location
- if place.geometry.viewport
- @map.fitBounds(place.geometry.viewport)
- else
- @map.setCenter(pos)
- @map.setZoom(17)
+ @cont.trigger
+ type: 'geo_input:place_changed'
+ place: autocomplete.getPlace()
- @marker.setPosition(pos)
- @setInputs(pos)
+$.fn.geoInput = (options) ->
+ $el = $(this)
+ $el.data('geoInput') or $el.data('geoInput', new GeoInput($el, options))
- $('#'+ dom_input).live "keypress", (e) ->
- e.preventDefault() if e.keyCode == 13
window.codeLatLng = (lat, lng, callback = null) ->
window.geocoder ||= new google.maps.Geocoder()
lat = parseFloat(lat)
lng = parseFloat(lng)
@@ -142,6 +138,39 @@
window.getPlaceComponent = (place, component) ->
res = _.filter place.address_components, (el) ->
_.include(el.types, component)
res[0]
+
+
+# typesByPrefix: ->
+# if _.include(['region', 'district', 'sub_district'], @options.prefix)
+# ['(regions)']
+# else if _.include(['location'], @options.prefix)
+# ['(cities)']
+# else
+# ['geocode']
+
+# initAutocompleteCustom: (dom_input='geo_autocomplete') ->
+# input = document.getElementById(dom_input)
+# opts =
+# types: ['geocode']
+## componentRestrictions: {country: 'ru'}
+# autocomplete = new google.maps.places.Autocomplete(input, opts)
+# autocomplete.bindTo('bounds', @map)
+# google.maps.event.addListener autocomplete, 'place_changed', =>
+# place = autocomplete.getPlace()
+# @callback.call(this, place) if @callback
+# return unless place.geometry
+# pos = place.geometry.location
+# if place.geometry.viewport
+# @map.fitBounds(place.geometry.viewport)
+# else
+# @map.setCenter(pos)
+# @map.setZoom(17)
+#
+# @marker.setPosition(pos)
+# @setInputs(pos)
+#
+# $('#'+ dom_input).live "keypress", (e) ->
+# e.preventDefault() if e.keyCode == 13